diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..17f1637a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.po linguist-generated +readme-assets/** linguist-documentation diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 96cbff08..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. -- Which site: [e.g. dev.phanpy.social OR phanpy.social] -- Which instance: [e.g. mastodon.social] - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..10472ecd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,81 @@ +name: "Bug report" +description: "Create a report to help us improve" + +labels: +- "bug" + +body: +- type: input + id: "site" + attributes: + label: "Site" + description: |- + What site(s) did you encounter this bug on? + placeholder: |- + phanpy.social + +- type: input + id: "version" + attributes: + label: "Version" + description: |- + Which Phanpy version(s) did you encounter this bug on? + You can see and copy your current version by opening the Settings menu and scrolling down to the About section. + placeholder: |- + 2024.10.08.0a176e2 + +- type: input + id: "instance" + attributes: + label: "Instance" + description: |- + Which instance(s) did you encounter this bug on? + placeholder: |- + mastodon.social + +- type: textarea + id: "Browser" + attributes: + label: "Browser" + description: |- + Which browser(s) did you encounter this bug on? + placeholder: |- + - Firefox 132.0b5 on Windows 11 + - Safari 18 on iOS 18 on iPhone 16 Pro Max + +- type: textarea + id: "description" + attributes: + label: "Bug description" + description: |- + A concise description of what the bug is. + If applicable, add screenshots to help explain your problem. + You can paste screenshots here and GitHub will convert them to Markdown for you. + +- type: textarea + id: "steps" + attributes: + label: "To reproduce" + description: |- + A list of steps that can be performed to make the bug happen again. + If possible, add screenshots to help demonstrate the steps. + You can paste screenshots here and GitHub will convert them to Markdown for you. + placeholder: |- + 1. Go to '...' + 2. Click on '...' + 3. Scroll down to '...' + 4. See error + +- type: textarea + id: "behavior" + attributes: + label: "Expected behavior" + description: |- + A concise description of what you expected to happen. + +- type: textarea + id: "other" + attributes: + label: "Other" + description: |- + Anything you want to add? diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..0086358d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 36014cde..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: 'enhancement' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..33eb2156 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,37 @@ +name: "Feature request" +description: "Suggest an idea for this project" + +labels: +- "enhancement" + + +body: +- type: textarea + id: "problem" + attributes: + label: "Problem I have" + description: |- + If your request is related to a problem, please provide a clear and concise description of what the problem is. + placeholder: |- + I'm always frustrated when [...] + +- type: textarea + id: "solution" + attributes: + label: "Solution I'd like" + description: |- + A clear and concise description of what you want to happen. + +- type: textarea + id: "alternatives" + attributes: + label: "Alternatives considered" + description: |- + A clear and concise description of any alternative solutions or features you've considered. + +- type: textarea + id: "other" + attributes: + label: "Other" + description: |- + Anything you want to add? diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 00000000..8973334c --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,4 @@ +changelog: + exclude: + labels: + - 'i18n' diff --git a/.github/workflows/i18n-automerge.yml b/.github/workflows/i18n-automerge.yml new file mode 100644 index 00000000..45f8b9e2 --- /dev/null +++ b/.github/workflows/i18n-automerge.yml @@ -0,0 +1,71 @@ +name: i18n PR auto-merge + +on: + pull_request: + types: [opened, synchronize, reopened, labeled] + branches: + - main + +jobs: + run-and-merge: + if: contains(github.event.pull_request.labels.*.name, 'i18n') && + github.event.pull_request.base.ref == 'main' && + github.event.pull_request.head.ref == 'l10n_main' + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - run: sleep 15 + + - name: Check if the branch is dirty + run: | + git fetch origin ${{ github.event.pull_request.head.ref }} + if [ $(git rev-parse HEAD) != $(git rev-parse origin/${{ github.event.pull_request.head.ref }}) ]; then + echo "Branch is dirty. Exiting..." + exit 0 + fi + + - name: Check auto-merge conditions + run: | + BASE_SHA="${{ github.event.pull_request.base.sha }}" + HEAD_SHA="${{ github.event.pull_request.head.sha }}" + + # Debug: Show the base and head SHA + echo "Base SHA: $BASE_SHA" + echo "Head SHA: $HEAD_SHA" + + # Check if the commits exist + if ! git cat-file -e $BASE_SHA || ! git cat-file -e $HEAD_SHA; then + echo "ERROR: One or both of the commits are not available." + exit 1 + fi + + # Calculate the total number of lines changed (added, removed, or modified) + LINES_CHANGED=$(git diff --shortstat $BASE_SHA $HEAD_SHA | awk '{print $4 + $6 + $8}') + + if [ -z "$LINES_CHANGED" ]; then + LINES_CHANGED=0 + fi + + echo "Total lines changed: $LINES_CHANGED" + + # Check if the number of lines changed is more than 50 + if [ "$LINES_CHANGED" -le 50 ]; then + exit 0 + else + echo "More than 50 lines have been changed. Merging pull request." + + # List of locales changed + LOCALES_CHANGED=$(git diff --name-only $BASE_SHA $HEAD_SHA | grep '\.po$' | awk -F '/' '{print $NF}' | sed 's/\.po$//' | tr '\n' ',' | sed 's/,$//') + + # Better subject + # "i18n updates ([LOCALES_CHANGED])" + PR_NUMBER=$(echo ${{ github.event.pull_request.number }}) + SUBJECT="i18n updates ($LOCALES_CHANGED) (#$PR_NUMBER)" + + gh pr merge $PR_NUMBER --squash --subject "$SUBJECT" || true + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/i18n-update-readme.yml b/.github/workflows/i18n-update-readme.yml new file mode 100644 index 00000000..78b50c69 --- /dev/null +++ b/.github/workflows/i18n-update-readme.yml @@ -0,0 +1,34 @@ +name: Update README with list of i18n volunteers + +on: + schedule: + # Every week + - cron: '0 0 * * 0' + workflow_dispatch: + +jobs: + update-readme: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: npm ci + - run: | + npm run fetch-i18n-volunteers + npm run readme:i18n-volunteers + + # Commit & push if there are changes + if git diff --quiet README.md; then + echo "No changes to README.md" + else + echo "Changes to README.md" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git add README.md + git commit -m "Update README.md" + git push + fi + env: + CROWDIN_ACCESS_TOKEN: ${{ secrets.CROWDIN_ACCESS_TOKEN }} diff --git a/.github/workflows/main2prod.yml b/.github/workflows/main2prod.yml index 0473802e..0f78df2c 100644 --- a/.github/workflows/main2prod.yml +++ b/.github/workflows/main2prod.yml @@ -7,6 +7,7 @@ on: jobs: auto-pull-request: + if: github.repository == 'cheeaun/phanpy' runs-on: ubuntu-latest steps: - uses: vsoch/pull-request-action@master diff --git a/.github/workflows/prettier-pr.yml b/.github/workflows/prettier-pr.yml new file mode 100644 index 00000000..051b1abd --- /dev/null +++ b/.github/workflows/prettier-pr.yml @@ -0,0 +1,19 @@ +name: Prettier on pull requests + +on: + pull_request: + workflow_dispatch: + +jobs: + prettier: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + # Need node to install prettier plugin(s) + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: npm ci + - run: | + echo "Prettier-ing files" + npx prettier "src/**/*.{js,jsx}" --check diff --git a/.github/workflows/update-catalogs.yml b/.github/workflows/update-catalogs.yml new file mode 100644 index 00000000..5a635c65 --- /dev/null +++ b/.github/workflows/update-catalogs.yml @@ -0,0 +1,32 @@ +name: Update Catalogs + +on: + push: + branches: + - l10n_main + workflow_dispatch: + +jobs: + update-catalogs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: l10n_main + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: npm ci + - name: Update catalogs.json + run: | + node scripts/catalogs.js + if git diff --quiet src/data/catalogs.json; then + echo "No changes to catalogs.json" + else + echo "Changes to catalogs.json" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git add src/data/catalogs.json + git commit -m "Update catalogs.json" + git push origin HEAD:l10n_main || true + fi diff --git a/.gitignore b/.gitignore index 0b859912..0e0c6565 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,8 @@ dist-ssr # Custom .env.dev phanpy-dist.zip -phanpy-dist.tar.gz \ No newline at end of file +phanpy-dist.tar.gz +sonda-report.html + +# Compiled locale files +src/locales/*.js \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index b2f59f51..6063e9a9 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,17 +3,20 @@ "useTabs": false, "singleQuote": true, "trailingComma": "all", + "plugins": ["@ianvs/prettier-plugin-sort-imports"], "importOrder": [ "^[^.].*.css$", "index.css$", ".css$", + "", + "./polyfills", + "", "", + "", "/assets/", + "", "^../", + "", "^[./]" - ], - "importOrderSeparation": true, - "importOrderSortSpecifiers": true, - "importOrderGroupNamespaceSpecifiers": true, - "importOrderCaseInsensitive": true + ] } diff --git a/README.md b/README.md index 7db062f3..a210ef7f 100644 --- a/README.md +++ b/README.md @@ -100,11 +100,12 @@ Everything is designed and engineered following my taste and vision. This is a p Prerequisites: Node.js 18+ - `npm install` - Install dependencies -- `npm run dev` - Start development server +- `npm run dev` - Start development server and `messages:extract` (`clean` + ``watch`) in parallel - `npm run build` - Build for production - `npm run preview` - Preview the production build - `npm run fetch-instances` - Fetch instances list from [joinmastodon.org/servers](https://joinmastodon.org/servers), save it to `src/data/instances.json` - `npm run sourcemap` - Run `source-map-explorer` on the production build +- `npm run messages:extract` - Extract messages from source files and update the locale message catalogs ## Tech stack @@ -115,10 +116,65 @@ Prerequisites: Node.js 18+ - [masto.js](https://github.com/neet/masto.js/) - Mastodon API client - [Iconify](https://iconify.design/) - Icon library - [MingCute icons](https://www.mingcute.com/) +- [Lingui](https://lingui.dev/) - Internationalization - Vanilla CSS - _Yes, I'm old school._ Some of these may change in the future. The front-end world is ever-changing. +## Internationalization + +All translations are available as [gettext](https://en.wikipedia.org/wiki/Gettext) `.po` files in the `src/locales` folder. The default language is English (`en`). [CLDR Plural Rules](https://cldr.unicode.org/index/cldr-spec/plural-rules) are used for pluralization. RTL (right-to-left) languages are also supported with proper text direction, icon rendering and layout. + +On page load, default language is detected via these methods, in order (first match is used): + +1. URL parameter `lang` e.g. `/?lang=zh-Hant` +2. `localStorage` key `lang` +3. Browser's `navigator.language` + +Users can change the language in the settings, which sets the `localStorage` key `lang`. + +### Guide for translators + +*Inspired by [Translate WordPress Handbook](https://make.wordpress.org/polyglots/handbook/): + +- [Don’t translate literally, translate organically](https://make.wordpress.org/polyglots/handbook/translating/expectations/#dont-translate-literally-translate-organically). +- [Try to keep the same level of formality (or informality)](https://make.wordpress.org/polyglots/handbook/translating/expectations/#try-to-keep-the-same-level-of-formality-or-informality) +- [Don’t use slang or audience-specific terms](https://make.wordpress.org/polyglots/handbook/translating/expectations/#try-to-keep-the-same-level-of-formality-or-informality) +- Be attentive to placeholders for variables. Many strings have placesholders e.g. `{account}` (variable), `<0>{name}` (tag with variable) and `#` (number placeholder). +- [Ellipsis](https://en.wikipedia.org/wiki/Ellipsis) (…) is intentional. Don't remove it. + - Nielsen Norman Group: ["Include Ellipses in Command Text to Indicate When More Information Is Required"](https://www.nngroup.com/articles/ui-copy/) + - Apple Human Interface Guidelines: ["Append an ellipsis to a menu item’s label when the action requires more information before it can complete. The ellipsis character (…) signals that people need to input information or make additional choices, typically within another view."](https://developer.apple.com/design/human-interface-guidelines/menus) + - Windows App Development: ["Ellipses mean incompleteness."](https://learn.microsoft.com/en-us/windows/win32/uxguide/text-ui) +- Date timestamps, date ranges, numbers, language names and text segmentation are handled by the [ECMAScript Internationalization API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl). + - [`Intl.DateTimeFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat) - e.g. "8 Aug", "08/08/2024" + - [`Intl.RelativeTimeFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat) - e.g. "2 days ago", "in 2 days" + - [`Intl.NumberFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) - e.g. "1,000", "10K" + - [`Intl.DisplayNames`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames) - e.g. "English" (`en`) in Traditional Chinese (`zh-Hant`) is "英文" + - [`Intl.Locale`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) (with polyfill for older browsers) + - [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter) (with polyfill for older browsers) + +### Technical notes + +- IDs for strings are auto-generated instead of explicitly defined. Some of the [benefits](https://lingui.dev/tutorials/explicit-vs-generated-ids#benefits-of-generated-ids) are avoiding the "naming things" problem and avoiding duplicates. + - Explicit IDs might be introduced in the future when requirements and priorities change. The library (Lingui) allows both. + - Please report issues if certain strings are translated differently based on context, culture or region. +- There are no strings for push notifications. The language is set on the instance server. +- Native HTML date pickers, e.g. `` will always follow the system's locale and not the user's set locale. +- "ALT" in ALT badge is not translated. It serves as a a recognizable standard across languages. +- Custom emoji names are not localized, therefore searches don't work for non-English languages. +- GIPHY API supports [a list of languages for searches](https://developers.giphy.com/docs/optional-settings/#language-support). +- Unicode Right-to-left mark (RLM) (`U+200F`, `‏`) may need to be used for mixed RTL/LTR text, especially for [`` element](https://www.w3.org/International/questions/qa-html-dir.en.html#title_element) (`document.title`). +- On development, there's an additional `pseudo-LOCALE` locale, used for [pseudolocalization](https://en.wikipedia.org/wiki/Pseudolocalization). It's for testing and won't show up on production. +- When building for production, English (`en`) catalog messages are not bundled separatedly. Other locales are bundled as separate files and loaded on demand. This ensures that `en` is always available as fallback. + +### Volunteer translations + +[![Crowdin](https://badges.crowdin.net/phanpy/localized.svg)](https://crowdin.com/project/phanpy) + +Translations are managed on [Crowdin](https://crowdin.com/project/phanpy). You can help by volunteering translations. + +Read the [intro documentation](https://support.crowdin.com/for-volunteer-translators/) to get started. + ## Self-hosting This is a **pure static web app**. You can host it anywhere you want. @@ -138,7 +194,7 @@ Download or `git clone` this repository. Use `production` branch for *stable* re Customization can be done by passing environment variables to the build command. Examples: ```bash -PHANPY_APP_TITLE="Phanpy Dev" \ +PHANPY_CLIENT_NAME="Phanpy Dev" \ PHANPY_WEBSITE="https://dev.phanpy.social" \ npm run build ``` @@ -174,11 +230,21 @@ Available variables: - `PHANPY_PRIVACY_POLICY_URL` (optional, default to official instance's privacy policy): - URL of the privacy policy page - May specify the instance's own privacy policy +- `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_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) - List of fallback instances hard-coded in `/.env` - [↗️ List of lingva-translate instances](https://github.com/thedaviddelta/lingva-translate?tab=readme-ov-file#instances) +- `PHANPY_IMG_ALT_API_URL` (optional, no defaults): + - API endpoint for self-hosted instance of [img-alt-api](https://github.com/cheeaun/img-alt-api). + - If provided, a setting will appear for users to enable the image description generator in the composer. Disabled by default. +- `PHANPY_GIPHY_API_KEY` (optional, no defaults): + - API key for [GIPHY](https://developers.giphy.com/). See [API docs](https://developers.giphy.com/docs/api/). + - If provided, a setting will appear for users to enable the GIF picker in the composer. Disabled by default. + - This is not self-hosted. ### Static site hosting @@ -192,14 +258,21 @@ See documentation for [lingva-translate](https://github.com/thedaviddelta/lingva These are self-hosted by other wonderful folks. -- [ferengi.one](https://m.ferengi.one/) by [@david@collantes.social](https://collantes.social/@david) -- [phanpy.blaede.family](https://phanpy.blaede.family/) by [@cassidy@blaede.family](https://mastodon.blaede.family/@cassidy) -- [phanpy.mstdn.mx](https://phanpy.mstdn.mx/) by [@maop@mstdn.mx](https://mstdn.mx/@maop) -- [phanpy.vmst.io](https://phanpy.vmst.io/) by [@vmstan@vmst.io](https://vmst.io/@vmstan) -- [phanpy.gotosocial.social](https://phanpy.gotosocial.social/) by [@admin@gotosocial.social](https://gotosocial.social/@admin) +- [ferengi.one](https://m.ferengi.one/) by [@david@weaknotes.com](https://weaknotes.com/@david) +- [halo.mookiesplace.com](https://halo.mookiesplace.com) by [@mookie@mookiesplace.com](https://mookiesplace.com/@mookie) - [phanpy.bauxite.tech](https://phanpy.bauxite.tech) by [@b4ux1t3@hachyderm.io](https://hachyderm.io/@b4ux1t3) -- [phanpy.hear-me.social](https://phanpy.hear-me.social) by [@admin@hear-me.social](https://hear-me.social/@admin) +- [phanpy.blaede.family](https://phanpy.blaede.family/) by [@cassidy@blaede.family](https://mastodon.blaede.family/@cassidy) +- [phanpy.crmbl.uk](https://phanpy.crmbl.uk) by [@snail@crmbl.uk](https://mstdn.crmbl.uk/@snail) +- [phanpy.cz](https://phanpy.cz) by [@zdendys@mamutovo.cz](https://mamutovo.cz/@zdendys) - [phanpy.fulda.social](https://phanpy.fulda.social) by [@Ganneff@fulda.social](https://fulda.social/@Ganneff) +- [phanpy.gotosocial.social](https://phanpy.gotosocial.social/) by [@admin@gotosocial.social](https://gotosocial.social/@admin) +- [phanpy.hear-me.social](https://phanpy.hear-me.social) by [@admin@hear-me.social](https://hear-me.social/@admin) +- [phanpy.mastodon.world](https://phanpy.mastodon.world) by [@ruud@mastodon.world](https://mastodon.world/@ruud) +- [phanpy.mstdn.mx](https://phanpy.mstdn.mx/) by [@maop@mstdn.mx](https://mstdn.mx/@maop) +- [phanpy.social.tchncs.de](https://phanpy.social.tchncs.de) by [@milan@social.tchncs.de](https://social.tchncs.de/@milan) +- [phanpy.tilde.zone](https://phanpy.tilde.zone) by [@ben@tilde.zone](https://tilde.zone/@ben) +- [phanpy.vmst.io](https://phanpy.vmst.io/) by [@vmstan@vmst.io](https://vmst.io/@vmstan) +- [social.qrk.one](https://social.qrk.one) by [@kev@fosstodon.org](https://fosstodon.org/@kev) > Note: Add yours by creating a pull request. @@ -221,6 +294,72 @@ Costs involved in running and developing this web app: [![Contributors](https://contrib.rocks/image?repo=cheeaun/phanpy)](https://github.com/cheeaun/phanpy/graphs/contributors) +### Translation volunteers + +<!-- i18n volunteers start --> +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/12571163/medium/9f3ea938f4243f5ffe2a43f814ddc9e8_default.png" alt="" width="16" height="16" /> alidsds11 (Arabic) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16180744/medium/5b04ae975b23895635130d7a176515cb_default.png" alt="" width="16" height="16" /> alternative (Korean) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/13170041/medium/603136896af17fc005fd592ce3f48717_default.png" alt="" width="16" height="16" /> BoFFire (Arabic, French, Kabyle) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/12898464/medium/d3758a76b894bade4bf271c9b32ea69b.png" alt="" width="16" height="16" /> Brawaru (Russian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15460040/medium/1cfcfe5f5511b783b5d9f2b968bad819.png" alt="" width="16" height="16" /> cbasje (Dutch) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15525631/medium/51293156034d0236f1a1020c10f7d539_default.png" alt="" width="16" height="16" /> cbo92 (French) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15910131/medium/67fab7eeab5551853450e76e2ef19e59.jpeg" alt="" width="16" height="16" /> CDN (Chinese Simplified) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16556801/medium/ed5e501ca1f3cc6525d2da28db646346.jpeg" alt="" width="16" height="16" /> dannypsnl (Chinese Traditional) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/3711/medium/c97239bb54623a50eb43cc6b801bb156.jpg" alt="" width="16" height="16" /> databio (Catalan) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16533843/medium/ac7af8776858a992d992cf6702d1aaae.jpg" alt="" width="16" height="16" /> Dizro (Italian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16574625/medium/f2ac3a4f32f104a3a6d4085d4bcb3924_default.png" alt="" width="16" height="16" /> Drift6944 (Czech) +- <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/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/a201650da44fed28890b0e0d8477a663.jpg" alt="" width="16" height="16" /> ghose (Galician) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15248754/medium/0dac6334ea0f4e8d4194a605c0a5594a.jpeg" alt="" width="16" height="16" /> hongminhee (Korean) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16529833/medium/2122d0c5d61c00786ab6d5e5672d4098.png" alt="" width="16" height="16" /> Hugoglyph (Esperanto, Spanish) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/13454728/medium/1f78b7124b3c962bc4ae55e8d701fc91_default.png" alt="" width="16" height="16" /> isard (Catalan) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16646485/medium/5d76c44212a4048a815ab437fb170856_default.png" alt="" width="16" height="16" /> kaliuwu (Polish) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16532403/medium/4cefb19623bcc44d7cdb9e25aebf5250.jpeg" alt="" width="16" height="16" /> karlafej (Czech) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15791971/medium/88bdda3090339f16f6083390d32bb434_default.png" alt="" width="16" height="16" /> katullo11 (Italian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/14677260/medium/e53420d200961f48602324e18c091bdc.png" alt="" width="16" height="16" /> Kytta (German) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16529521/medium/ae6add93a901b0fefa2d9b1077920d73.png" alt="" width="16" height="16" /> llun (Thai) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16291756/medium/c008af10bc117fa9c9dcb70f2b291ee6.jpg" alt="" width="16" height="16" /> lucasofchirst (Occitan, Portuguese, Portuguese, Brazilian) +- <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/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) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/14158861/medium/ba1ff31dc5743b067ea6685f735229a5_default.png" alt="" width="16" height="16" /> MrWillCom (Chinese Simplified) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15652333/medium/7f36f289f9e2fe41d89ad534a1047f0e.png" alt="" width="16" height="16" /> nclm (French) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15000639/medium/ebbf0bb7d5027a1903d11b7f5f34f65b.jpeg" alt="" width="16" height="16" /> nycterent (Lithuanian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16539461/medium/2f41b9f0b802c1d200a6ab62167a7229_default.png" alt="" width="16" height="16" /> pazpi (Italian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/13954917/medium/56a2cba267eb1b5d122bf62ddc0dd732_default.png" alt="" width="16" height="16" /> PPNplus (Thai) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15106977/medium/54bf93b19af8bbfdee579ea51685bafa.jpeg" alt="" width="16" height="16" /> punkrockgirl (Basque) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16536247/medium/f010c8e718a36229733a8b58f6bad2a4_default.png" alt="" width="16" height="16" /> radecos (French) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16538917/medium/092ec03f56f9dd1cbce94379fa4d4d38.png" alt="" width="16" height="16" /> Razem (Czech) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/14345134/medium/89a299239890c79a1d791d08ec3951dc.png" alt="" width="16" height="16" /> realpixelcode (German) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16527325/medium/37ebb27e7a50f7f85ae93beafc7028a2.jpg" alt="" width="16" height="16" /> rezahosseinzadeh (Persian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/13422319/medium/66632a98d73d48e36753d94ebcec9d4f.png" alt="" width="16" height="16" /> rwmpelstilzchen (Esperanto, Hebrew) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16538605/medium/bcdb6e3286b7d6237923f3a9383eed29.png" alt="" width="16" height="16" /> SadmL (Russian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16539171/medium/0ce95ef6b3b0566136191fbedc1563d0.png" alt="" width="16" height="16" /> SadmL_AI (Russian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/12381015/medium/35e3557fd61d85f9a5b84545d9e3feb4.png" alt="" width="16" height="16" /> shuuji3 (Japanese) +- <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/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/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) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16563757/medium/af4556c13862d1fd593b51084a159b75_default.png" alt="" width="16" height="16" /> voyagercy (Chinese Traditional) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15982109/medium/9c03062bdc1d3c6d384dbfead97c26ba.jpeg" alt="" width="16" height="16" /> xabi_itzultzaile (Basque) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16556017/medium/216e0f7a0c35b079920366939a3aaca7_default.png" alt="" width="16" height="16" /> xen4n (Ukrainian) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16532657/medium/f309f319266e1ff95f3070eab0c9a9d9_default.png" alt="" width="16" height="16" /> xqueralt (Catalan) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/14041603/medium/6ab77a0467b06aeb49927c6d9c409f89.jpg" alt="" width="16" height="16" /> ZiriSut (Kabyle) +- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16530601/medium/e1b6d5c24953b6405405c1ab33c0fa46.jpeg" alt="" width="16" height="16" /> zkreml (Czech) +<!-- i18n volunteers end --> + ## Backstory I am one of the earliest users of Twitter. Twitter was launched on [15 July 2006](https://en.wikipedia.org/wiki/Twitter). I joined on December 2006 and my [first tweet](https://twitter.com/cheeaun/status/1298723) was posted on 18 December 2006. @@ -235,6 +374,8 @@ And here I am. Building a Mastodon web client. ## Alternative web clients +- Phanpy forks ↓ + - [Agora](https://agorasocial.app/) - [Pinafore](https://pinafore.social/) ([retired](https://nolanlawson.com/2023/01/09/retiring-pinafore/)) - forks ↓ - [Semaphore](https://semaphore.social/) - [Enafore](https://enafore.social/) @@ -250,6 +391,8 @@ And here I am. Building a Mastodon web client. - [Statuzer](https://statuzer.com/) - [Tusked](https://tusked.app/) - [Mastodon Glitch Edition (standalone frontend)](https://iceshrimp.dev/iceshrimp/masto-fe-standalone) +- [Mangane](https://github.com/BDX-town/Mangane) +- [TheDesk](https://github.com/cutls/TheDesk) - [More...](https://github.com/hueyy/awesome-mastodon/#clients) ## 💁‍♂️ Notice to all other social media client developers diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000..483acffd --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,7 @@ +pull_request_labels: + - i18n +commit_message: New translations (%language%) +append_commit_message: false +files: + - source: /src/locales/en.po + translation: /src/locales/%locale%.po diff --git a/design/logo-bw-4.png b/design/logo-bw-4.png new file mode 100644 index 00000000..bd630f38 Binary files /dev/null and b/design/logo-bw-4.png differ diff --git a/design/logo-bw-4.svg b/design/logo-bw-4.svg new file mode 100644 index 00000000..3f1ff363 --- /dev/null +++ b/design/logo-bw-4.svg @@ -0,0 +1,12 @@ +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 64 64"> + <path fill="none" d="M0 0h63.99v63.99H0z"/> + <clipPath id="a"> + <path d="M0 0h63.99v63.99H0z"/> + </clipPath> + <g clip-path="url(#a)"> + <path d="M0 0h64.25v63.99H0z"/> + <path fill="#fff" d="M37.77 11.47c14.64 3.75 19.04 16.56 15.9 31.3a12.55 12.55 0 0 1-6.36 8.7c-3.2 1.71-8.07 2.53-15.34.55l-9.64-2.4c-10.68-2.63-13.95-10.89-12.3-17.8 3.62-15.2 15.54-23.48 27.74-20.35Z"/> + <path d="M36.76 15.43c12.29 3.15 15.55 14.11 12.9 26.5-.94 4.43-4.93 9.36-16.66 6.13l-9.68-2.41c-7.85-1.93-10.53-7.8-9.32-12.88 3.02-12.64 12.61-19.94 22.76-17.34Z"/> + <path fill="#fff" d="M27.47 25c-1.46-.7-7.23 3.2-7.66 8.92-.18 2.39 4.55 3.23 5.07-.17.72-4.74 3.71-8.22 2.6-8.76Zm10.75 2c-2.09.32-.39 5.9-.6 10.72-.12 2.8 4.39 3.47 4.7 2.01 1.1-5.07-2.06-13.05-4.1-12.73Z"/> + </g> +</svg> diff --git a/design/logo-wb-4.png b/design/logo-wb-4.png new file mode 100644 index 00000000..59592e16 Binary files /dev/null and b/design/logo-wb-4.png differ diff --git a/design/logo-wb-4.svg b/design/logo-wb-4.svg new file mode 100644 index 00000000..0717534e --- /dev/null +++ b/design/logo-wb-4.svg @@ -0,0 +1,12 @@ +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 64 64"> + <path fill="none" d="M0 0h63.99v63.99H0z"/> + <clipPath id="a"> + <path d="M0 0h63.99v63.99H0z"/> + </clipPath> + <g clip-path="url(#a)"> + <path fill="#fff" d="M0 0h64.25v63.99H0z"/> + <path d="M37.77 11.47c14.64 3.75 19.04 16.56 15.9 31.3a12.55 12.55 0 0 1-6.36 8.7c-3.2 1.71-8.07 2.53-15.34.55l-9.64-2.4c-10.68-2.63-13.95-10.89-12.3-17.8 3.62-15.2 15.54-23.48 27.74-20.35Z"/> + <path fill="#fff" d="M36.76 15.43c12.29 3.15 15.55 14.11 12.9 26.5-.94 4.43-4.93 9.36-16.66 6.13l-9.68-2.41c-7.85-1.93-10.53-7.8-9.32-12.88 3.02-12.64 12.61-19.94 22.76-17.34Z"/> + <path d="M27.47 25c-1.46-.7-7.23 3.2-7.66 8.92-.18 2.39 4.55 3.23 5.07-.17.72-4.74 3.71-8.22 2.6-8.76Zm10.75 2c-2.09.32-.39 5.9-.6 10.72-.12 2.8 4.39 3.47 4.7 2.01 1.1-5.07-2.06-13.05-4.1-12.73Z"/> + </g> +</svg> diff --git a/design/logo.afdesign b/design/logo.afdesign index 6ebb2eef..b5ead1d4 100644 Binary files a/design/logo.afdesign and b/design/logo.afdesign differ diff --git a/i18n-volunteers.json b/i18n-volunteers.json new file mode 100644 index 00000000..4c9aa6a5 --- /dev/null +++ b/i18n-volunteers.json @@ -0,0 +1,345 @@ +[ + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12571163/medium/9f3ea938f4243f5ffe2a43f814ddc9e8_default.png", + "username": "alidsds11", + "languages": [ + "Arabic" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13170041/medium/603136896af17fc005fd592ce3f48717_default.png", + "username": "BoFFire", + "languages": [ + "Arabic", + "French", + "Kabyle" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12898464/medium/d3758a76b894bade4bf271c9b32ea69b.png", + "username": "Brawaru", + "languages": [ + "Russian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15460040/medium/1cfcfe5f5511b783b5d9f2b968bad819.png", + "username": "cbasje", + "languages": [ + "Dutch" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15525631/medium/51293156034d0236f1a1020c10f7d539_default.png", + "username": "cbo92", + "languages": [ + "French" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15910131/medium/67fab7eeab5551853450e76e2ef19e59.jpeg", + "username": "CDN", + "languages": [ + "Chinese Simplified" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16556801/medium/ed5e501ca1f3cc6525d2da28db646346.jpeg", + "username": "dannypsnl", + "languages": [ + "Chinese Traditional" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/3711/medium/d95ddd44e8dcb3a039f8a3463aed781d_default.png", + "username": "databio", + "languages": [ + "Catalan" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12618120/medium/ccb11bd042bbf4c7189033f7af2dbd32_default.png", + "username": "drydenwu", + "languages": [ + "Chinese Traditional" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13557465/medium/8feebf3677fa80c01e8c54c4fbe097e0_default.png", + "username": "elissarc", + "languages": [ + "French" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16528627/medium/9036f6eced0257f4e1ea4c5bd499de2d_default.png", + "username": "ElPamplina", + "languages": [ + "Spanish" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14277386/medium/29b30d2c73a214000e3941c9978f49e4_default.png", + "username": "Fitik", + "languages": [ + "Esperanto", + "Hebrew" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14444512/medium/99d0e7a3076deccbdfe0aa0b0612308c.jpeg", + "username": "Freeesia", + "languages": [ + "Japanese" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12617257/medium/a201650da44fed28890b0e0d8477a663.jpg", + "username": "ghose", + "languages": [ + "Galician" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15248754/medium/0dac6334ea0f4e8d4194a605c0a5594a.jpeg", + "username": "hongminhee", + "languages": [ + "Korean" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13454728/medium/1f78b7124b3c962bc4ae55e8d701fc91_default.png", + "username": "isard", + "languages": [ + "Catalan" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16532403/medium/4cefb19623bcc44d7cdb9e25aebf5250.jpeg", + "username": "karlafej", + "languages": [ + "Czech" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15791971/medium/88bdda3090339f16f6083390d32bb434_default.png", + "username": "katullo11", + "languages": [ + "Italian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14677260/medium/e53420d200961f48602324e18c091bdc.png", + "username": "Kytta", + "languages": [ + "German" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16529521/medium/ae6add93a901b0fefa2d9b1077920d73.png", + "username": "llun", + "languages": [ + "Thai" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16291756/medium/e1c4210f15537394cc764b8bc2dffe37.jpg", + "username": "lucasofchirst", + "languages": [ + "Occitan", + "Portuguese", + "Portuguese, Brazilian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16537713/medium/825f0bf1a14fc545a76891a52839d86e_default.png", + "username": "marcin.kozinski", + "languages": [ + "Polish" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12882812/medium/77744d8db46e9a3e09030e1a02b7a572.jpeg", + "username": "mojosoeun", + "languages": [ + "Korean" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13613969/medium/c7834ddc0ada84a79671697a944bb274.png", + "username": "moreal", + "languages": [ + "Korean" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14158861/medium/ba1ff31dc5743b067ea6685f735229a5_default.png", + "username": "MrWillCom", + "languages": [ + "Chinese Simplified" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15652333/medium/7f36f289f9e2fe41d89ad534a1047f0e.png", + "username": "nclm", + "languages": [ + "French" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16539461/medium/2f41b9f0b802c1d200a6ab62167a7229_default.png", + "username": "pazpi", + "languages": [ + "Italian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15106977/medium/54bf93b19af8bbfdee579ea51685bafa.jpeg", + "username": "punkrockgirl", + "languages": [ + "Basque" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16536247/medium/f010c8e718a36229733a8b58f6bad2a4_default.png", + "username": "radecos", + "languages": [ + "French" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16538917/medium/092ec03f56f9dd1cbce94379fa4d4d38.png", + "username": "Razem", + "languages": [ + "Czech" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14345134/medium/89a299239890c79a1d791d08ec3951dc.png", + "username": "realpixelcode", + "languages": [ + "German" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16527325/medium/37ebb27e7a50f7f85ae93beafc7028a2.jpg", + "username": "rezahosseinzadeh", + "languages": [ + "Persian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13422319/medium/66632a98d73d48e36753d94ebcec9d4f.png", + "username": "rwmpelstilzchen", + "languages": [ + "Esperanto", + "Hebrew" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16538605/medium/bcdb6e3286b7d6237923f3a9383eed29.png", + "username": "SadmL", + "languages": [ + "Russian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14565190/medium/79100599131b7776e9803e4b696915a3_default.png", + "username": "Sky_NiniKo", + "languages": [ + "French" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16532441/medium/1a47e8d80c95636e02d2260f6e233ca5.png", + "username": "Su5hicz", + "languages": [ + "Czech" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16533843/medium/7314c15492ef90118c33a80a427e6c87_default.png", + "username": "Talos00", + "languages": [ + "Italian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16530049/medium/683f3581620c6b4a5c753b416ed695a7.jpeg", + "username": "tferrermo", + "languages": [ + "Spanish" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16527851/medium/649e5a9a8a8cc61ced670d89e9cca082.png", + "username": "tux93", + "languages": [ + "German" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16529833/medium/2991a65722acd721849656223014cd49.png", + "username": "Urbestro", + "languages": [ + "Esperanto", + "Spanish" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16539171/medium/db6fb87481026c72b895adfb94e17d2c_default.png", + "username": "UsualUsername", + "languages": [ + "Russian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14427566/medium/ab733b5044c21867fc5a9d1b22cd2c03.png", + "username": "Vac31.", + "languages": [ + "Lithuanian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16026914/medium/e3ca187f354a298ef0c9d02a0ed17be7.jpg", + "username": "valtlai", + "languages": [ + "Finnish" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15982109/medium/9c03062bdc1d3c6d384dbfead97c26ba.jpeg", + "username": "xabi_itzultzaile", + "languages": [ + "Basque" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16556017/medium/216e0f7a0c35b079920366939a3aaca7_default.png", + "username": "xen4n", + "languages": [ + "Ukrainian" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16532657/medium/f309f319266e1ff95f3070eab0c9a9d9_default.png", + "username": "xqueralt", + "languages": [ + "Catalan" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14041603/medium/6ab77a0467b06aeb49927c6d9c409f89.jpg", + "username": "ZiriSut", + "languages": [ + "Kabyle" + ] + }, + { + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16530601/medium/e1b6d5c24953b6405405c1ab33c0fa46.jpeg", + "username": "zkreml", + "languages": [ + "Czech" + ] + } +] \ No newline at end of file diff --git a/lingui.config.js b/lingui.config.js new file mode 100644 index 00000000..e612248d --- /dev/null +++ b/lingui.config.js @@ -0,0 +1,20 @@ +import { ALL_LOCALES } from './src/locales'; + +const config = { + locales: ALL_LOCALES, + sourceLocale: 'en', + pseudoLocale: 'pseudo-LOCALE', + fallbackLocales: { + default: 'en', + }, + catalogs: [ + { + path: '<rootDir>/src/locales/{locale}', + include: ['src'], + }, + ], + // compileNamespace: 'es', + orderBy: 'origin', +}; + +export default config; diff --git a/package-lock.json b/package-lock.json index edefa907..b1bcfa70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,79 +8,99 @@ "name": "phanpy", "version": "0.1.0", "dependencies": { - "@formatjs/intl-localematcher": "~0.5.4", - "@formatjs/intl-segmenter": "~11.5.5", - "@formkit/auto-animate": "~0.8.1", - "@github/text-expander-element": "~2.6.1", + "@formatjs/intl-localematcher": "~0.5.8", + "@formatjs/intl-segmenter": "~11.7.4", + "@formkit/auto-animate": "~0.8.2", + "@github/text-expander-element": "~2.8.0", "@iconify-icons/mingcute": "~1.2.9", - "@justinribeiro/lite-youtube": "~1.5.0", - "@szhsin/react-menu": "~4.1.0", - "@uidotdev/usehooks": "~2.4.1", - "compare-versions": "~6.1.0", - "dayjs": "~1.11.10", - "dayjs-twitter": "~0.5.0", - "fast-blurhash": "~1.1.2", + "@justinribeiro/lite-youtube": "~1.6.0", + "@lingui/detect-locale": "~4.14.0", + "@lingui/macro": "~4.14.0", + "@lingui/react": "~4.14.0", + "@szhsin/react-menu": "~4.2.3", + "chroma-js": "~3.1.2", + "compare-versions": "~6.1.1", + "fast-blurhash": "~1.1.4", "fast-equals": "~5.0.1", - "html-prettify": "^1.0.7", + "fuse.js": "~7.0.0", + "html-prettify": "~1.0.7", "idb-keyval": "~6.2.1", + "intl-locale-textinfo-polyfill": "~2.1.1", + "js-cookie": "~3.0.5", "just-debounce-it": "~3.2.0", "lz-string": "~1.5.0", - "masto": "~6.6.4", + "masto": "~6.10.1", "moize": "~6.1.6", - "p-retry": "~6.2.0", - "p-throttle": "~6.1.0", - "preact": "~10.19.6", - "react-hotkeys-hook": "~4.5.0", - "react-intersection-observer": "~9.8.1", + "p-retry": "~6.2.1", + "p-throttle": "~6.2.0", + "preact": "~10.24.3", + "punycode": "~2.3.1", + "react-hotkeys-hook": "~4.6.1", + "react-intersection-observer": "~9.13.1", "react-quick-pinch-zoom": "~5.1.0", "react-router-dom": "6.6.2", "string-length": "6.0.0", - "swiped-events": "~1.1.9", + "swiped-events": "~1.2.0", + "tinyld": "~1.3.4", "toastify-js": "~1.12.0", "uid": "~2.0.2", - "use-debounce": "~10.0.0", + "use-debounce": "~10.0.4", "use-long-press": "~3.2.0", "use-resize-observer": "~9.1.0", - "valtio": "1.13.2" + "valtio": "2.1.2" }, "devDependencies": { - "@preact/preset-vite": "~2.8.1", - "@trivago/prettier-plugin-sort-imports": "~4.3.0", - "postcss": "~8.4.35", - "postcss-dark-theme-class": "~1.2.1", - "postcss-preset-env": "~9.4.0", + "@ianvs/prettier-plugin-sort-imports": "~4.4.0", + "@lingui/cli": "~4.14.0", + "@lingui/vite-plugin": "~4.14.0", + "@preact/preset-vite": "~2.9.1", + "babel-plugin-macros": "~3.1.0", + "postcss": "~8.4.49", + "postcss-dark-theme-class": "~1.3.0", + "postcss-preset-env": "~10.1.1", + "prettier": "3.4.1", + "sonda": "~0.6.1", "twitter-text": "~3.1.0", - "vite": "~5.1.5", - "vite-plugin-generate-file": "~0.1.1", - "vite-plugin-html-config": "~1.0.11", - "vite-plugin-pwa": "~0.19.2", + "vite": "~5.4.11", + "vite-plugin-generate-file": "~0.2.0", + "vite-plugin-html-config": "~2.0.2", + "vite-plugin-pwa": "~0.21.0", "vite-plugin-remove-console": "~2.2.0", - "workbox-cacheable-response": "~7.0.0", - "workbox-expiration": "~7.0.0", - "workbox-routing": "~7.0.0", - "workbox-strategies": "~7.0.0" + "vite-plugin-run": "~0.6.1", + "workbox-cacheable-response": "~7.3.0", + "workbox-expiration": "~7.3.0", + "workbox-navigation-preload": "~7.3.0", + "workbox-routing": "~7.3.0", + "workbox-strategies": "~7.3.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@apideck/better-ajv-errors": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "dev": true, - "license": "MIT", "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", @@ -94,46 +114,43 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "license": "MIT", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -149,72 +166,55 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz", - "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.22.3" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -222,39 +222,19 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", - "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.22.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -264,15 +244,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", - "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -282,98 +261,56 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", - "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", - "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.22.3" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -383,39 +320,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -425,144 +358,109 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", - "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "license": "MIT", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "license": "MIT", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -570,14 +468,44 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -587,15 +515,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", - "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-transform-optional-chaining": "^7.22.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -604,18 +531,27 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.10.tgz", - "integrity": "sha512-3YybmT8FN4sZFXp0kTr9Gbu90wAIhC3feNung+qcRQ1wALGoSHgOz1c+fR3ZLGZ0LXqIpYmtE6Faua6tMDarUg==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -623,99 +559,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -725,13 +575,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz", - "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -740,32 +589,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", @@ -782,122 +605,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -910,13 +622,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -926,16 +637,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz", - "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -945,15 +654,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -963,13 +671,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -979,13 +686,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -995,14 +701,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz", - "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1012,15 +717,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz", - "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1030,20 +733,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -1054,14 +753,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1071,13 +769,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1087,14 +784,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1104,13 +800,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1119,15 +814,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz", - "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1137,14 +846,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1154,14 +862,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz", - "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1171,13 +877,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1187,15 +893,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1205,14 +910,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz", - "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1222,13 +925,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1238,14 +940,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz", - "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1255,13 +955,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1271,14 +970,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1288,15 +986,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1306,16 +1003,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", - "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1325,14 +1021,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1342,14 +1037,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", - "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1359,13 +1053,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", - "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1375,14 +1068,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz", - "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1392,14 +1083,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz", - "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1409,17 +1098,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz", - "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.3", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.3" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1429,14 +1115,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1446,14 +1131,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz", - "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1463,15 +1146,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", - "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1481,13 +1162,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", - "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1497,14 +1177,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz", - "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1514,16 +1193,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz", - "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1533,13 +1210,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1585,14 +1261,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1601,14 +1276,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1618,13 +1308,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1634,14 +1323,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1651,13 +1339,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1667,13 +1354,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1683,13 +1369,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1699,13 +1384,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1715,14 +1399,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz", - "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1732,14 +1415,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1749,14 +1431,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz", - "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1766,92 +1447,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz", - "integrity": "sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.3", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.3", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-import-attributes": "^7.22.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.3", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-class-properties": "^7.22.3", - "@babel/plugin-transform-class-static-block": "^7.22.3", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-dynamic-import": "^7.22.1", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-export-namespace-from": "^7.22.3", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-json-strings": "^7.22.3", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.3", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.3", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.3", - "@babel/plugin-transform-new-target": "^7.22.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3", - "@babel/plugin-transform-numeric-separator": "^7.22.3", - "@babel/plugin-transform-object-rest-spread": "^7.22.3", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-optional-catch-binding": "^7.22.3", - "@babel/plugin-transform-optional-chaining": "^7.22.3", - "@babel/plugin-transform-parameters": "^7.22.3", - "@babel/plugin-transform-private-methods": "^7.22.3", - "@babel/plugin-transform-private-property-in-object": "^7.22.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-property-regex": "^7.22.3", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.3", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.4", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "core-js-compat": "^3.30.2", - "semver": "^6.3.0" + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1861,73 +1530,56 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", - "dev": true, - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1935,24 +1587,21 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "license": "MIT", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.8.tgz", - "integrity": "sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", "dev": true, "funding": [ { @@ -1965,17 +1614,17 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/color-helpers": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-4.0.0.tgz", - "integrity": "sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", "dev": true, "funding": [ { @@ -1988,13 +1637,13 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" } }, "node_modules/@csstools/css-calc": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.1.7.tgz", - "integrity": "sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.0.tgz", + "integrity": "sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw==", "dev": true, "funding": [ { @@ -2007,17 +1656,17 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-color-parser": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.5.2.tgz", - "integrity": "sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.6.tgz", + "integrity": "sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw==", "dev": true, "funding": [ { @@ -2030,21 +1679,21 @@ } ], "dependencies": { - "@csstools/color-helpers": "^4.0.0", - "@csstools/css-calc": "^1.1.7" + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.0.tgz", - "integrity": "sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true, "funding": [ { @@ -2057,16 +1706,16 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz", - "integrity": "sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "dev": true, "funding": [ { @@ -2079,13 +1728,13 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.8.tgz", - "integrity": "sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", "dev": true, "funding": [ { @@ -2098,17 +1747,17 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/postcss-cascade-layers": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.3.tgz", - "integrity": "sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", "dev": true, "funding": [ { @@ -2121,20 +1770,20 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.2", - "postcss-selector-parser": "^6.0.13" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-color-function": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.10.tgz", - "integrity": "sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.6.tgz", + "integrity": "sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ==", "dev": true, "funding": [ { @@ -2147,23 +1796,23 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.10.tgz", - "integrity": "sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.6.tgz", + "integrity": "sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg==", "dev": true, "funding": [ { @@ -2176,23 +1825,51 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz", + "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.4.tgz", - "integrity": "sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.5.tgz", + "integrity": "sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ==", "dev": true, "funding": [ { @@ -2205,21 +1882,21 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-font-format-keywords": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-3.0.2.tgz", - "integrity": "sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", "dev": true, "funding": [ { @@ -2232,20 +1909,20 @@ } ], "dependencies": { - "@csstools/utilities": "^1.0.0", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.3.tgz", - "integrity": "sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.6.tgz", + "integrity": "sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA==", "dev": true, "funding": [ { @@ -2258,21 +1935,21 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.10.tgz", - "integrity": "sha512-PwKOxVuX8lo52bPtPeKjaIp6oH2EzhcBxCndRcvGZKsqZYQ35k9A5G4yihZ+wp7PoxPqDNiXuhQsvQG2lqMpOA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.6.tgz", + "integrity": "sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg==", "dev": true, "funding": [ { @@ -2285,23 +1962,23 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.9.tgz", - "integrity": "sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.6.tgz", + "integrity": "sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ==", "dev": true, "funding": [ { @@ -2314,23 +1991,23 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.4.tgz", - "integrity": "sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz", + "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==", "dev": true, "funding": [ { @@ -2343,21 +2020,21 @@ } ], "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-1.0.1.tgz", - "integrity": "sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.0.tgz", + "integrity": "sha512-dv2lNUKR+JV+OOhZm9paWzYBXOCi+rJPqJ2cJuhh9xd8USVrd0cBEPczla81HNOyThMQWeCcdln3gZkQV2kYxA==", "dev": true, "funding": [ { @@ -2370,16 +2047,16 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.5.tgz", - "integrity": "sha512-qG3MI7IN3KY9UwdaE9E7G7sFydscVW7nAj5OGwaBP9tQPEEVdxXTGI+l1ZW5EUpZFSj+u3q/22fH5+8HI72+Bg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", "dev": true, "funding": [ { @@ -2392,20 +2069,20 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.2", - "postcss-selector-parser": "^6.0.13" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.0.tgz", - "integrity": "sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz", + "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==", "dev": true, "funding": [ { @@ -2418,22 +2095,22 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-2.0.1.tgz", - "integrity": "sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", "dev": true, "funding": [ { @@ -2446,16 +2123,16 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-logical-overflow": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-1.0.1.tgz", - "integrity": "sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", "dev": true, "funding": [ { @@ -2468,16 +2145,16 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-1.0.1.tgz", - "integrity": "sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", "dev": true, "funding": [ { @@ -2490,16 +2167,16 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-logical-resize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-2.0.1.tgz", - "integrity": "sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", "dev": true, "funding": [ { @@ -2515,16 +2192,16 @@ "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.6.tgz", - "integrity": "sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", + "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", "dev": true, "funding": [ { @@ -2537,20 +2214,20 @@ } ], "dependencies": { - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/utilities": "^1.0.0" + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.3.tgz", - "integrity": "sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.5.tgz", + "integrity": "sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew==", "dev": true, "funding": [ { @@ -2563,22 +2240,22 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.6.tgz", - "integrity": "sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", + "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", "dev": true, "funding": [ { @@ -2591,21 +2268,21 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-nested-calc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-3.0.2.tgz", - "integrity": "sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", "dev": true, "funding": [ { @@ -2618,20 +2295,20 @@ } ], "dependencies": { - "@csstools/utilities": "^1.0.0", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-normalize-display-values": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-3.0.2.tgz", - "integrity": "sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", "dev": true, "funding": [ { @@ -2647,16 +2324,16 @@ "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.10.tgz", - "integrity": "sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.6.tgz", + "integrity": "sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A==", "dev": true, "funding": [ { @@ -2669,23 +2346,23 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.1.0.tgz", - "integrity": "sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz", + "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==", "dev": true, "funding": [ { @@ -2701,16 +2378,43 @@ "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.1.tgz", + "integrity": "sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.10.tgz", - "integrity": "sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.6.tgz", + "integrity": "sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg==", "dev": true, "funding": [ { @@ -2723,23 +2427,23 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-3.0.1.tgz", - "integrity": "sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", "dev": true, "funding": [ { @@ -2752,19 +2456,46 @@ } ], "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.0.tgz", + "integrity": "sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.5.tgz", - "integrity": "sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.5.tgz", + "integrity": "sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw==", "dev": true, "funding": [ { @@ -2777,21 +2508,21 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-3.0.4.tgz", - "integrity": "sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", + "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", "dev": true, "funding": [ { @@ -2804,20 +2535,20 @@ } ], "dependencies": { - "@csstools/color-helpers": "^4.0.0", + "@csstools/color-helpers": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.5.tgz", - "integrity": "sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.5.tgz", + "integrity": "sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA==", "dev": true, "funding": [ { @@ -2830,21 +2561,21 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-unset-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.1.tgz", - "integrity": "sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", "dev": true, "funding": [ { @@ -2857,16 +2588,38 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, "node_modules/@csstools/selector-specificity": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz", - "integrity": "sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "dev": true, "funding": [ { @@ -2879,16 +2632,16 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" } }, "node_modules/@csstools/utilities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-1.0.0.tgz", - "integrity": "sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", "dev": true, "funding": [ { @@ -2901,21 +2654,84 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2924,38 +2740,334 @@ "node": ">=12" } }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@formatjs/ecma402-abstract": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", - "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", + "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", "dependencies": { - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", + "dependencies": { + "tslib": "2" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", + "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", "dependencies": { - "tslib": "^2.4.0" + "tslib": "2" } }, "node_modules/@formatjs/intl-segmenter": { - "version": "11.5.5", - "resolved": "https://registry.npmjs.org/@formatjs/intl-segmenter/-/intl-segmenter-11.5.5.tgz", - "integrity": "sha512-mMbJKFGzwYJBcwfL9EfqFje75Ce5WPar5rSi7wWvFtBPFY2Zi1cWIss7FSm2MNNM9l1BycBAsBQuXFt+Hd+0tQ==", + "version": "11.7.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-segmenter/-/intl-segmenter-11.7.4.tgz", + "integrity": "sha512-pyHgFO86/CReKl20oK9jgaTMzSaG/nIMteMW8YuwUcS22EoMI1qbGTZ65oQ38KMT05SiHiMee2CP3WZvCi8YSQ==", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" } }, "node_modules/@formkit/auto-animate": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@formkit/auto-animate/-/auto-animate-0.8.1.tgz", - "integrity": "sha512-0/Z2cuNXWVVIG/l0SpcHAWFhGdvLJ8DRvEfRWvmojtmRWfEy+LWNwgDazbZqY0qQYtkHcoEK3jBLkhiZaB/4Ig==", - "license": "MIT" + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@formkit/auto-animate/-/auto-animate-0.8.2.tgz", + "integrity": "sha512-SwPWfeRa5veb1hOIBMdzI+73te5puUBHmqqaF1Bu7FjvxlYSz/kJcZKSa9Cg60zL0uRNeJL2SbRxV6Jp6Q1nFQ==" }, "node_modules/@github/combobox-nav": { "version": "2.1.5", @@ -2964,12 +3076,46 @@ "license": "MIT" }, "node_modules/@github/text-expander-element": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.6.1.tgz", - "integrity": "sha512-i6krPGXJRABfKXut0WArFd365Je4PT0MljtDoXUoCOEp+lGrmdosDMxmO0EfOYc97jBn+Hd2XO1mMsuI5+fwmQ==", - "license": "MIT", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.8.0.tgz", + "integrity": "sha512-kkS2rZ/CG8HGKblpLDQ8vcK/K7l/Jsvzi/N4ovwPAsFSOImcIbJh2MgCv9tzqE3wAm/qXlscvh3Ms4Hh1vtZvw==", "dependencies": { - "@github/combobox-nav": "^2.0.2" + "@github/combobox-nav": "^2.0.2", + "dom-input-range": "^1.2.0" + } + }, + "node_modules/@ianvs/prettier-plugin-sort-imports": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.4.0.tgz", + "integrity": "sha512-f4/e+/ANGk3tHuwRW0uh2YuBR50I4h1ZjGQ+5uD8sWfinHTivQsnieR5cz24t8M6Vx4rYvZ5v/IEKZhYpzQm9Q==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.26.2", + "@babel/parser": "^7.26.2", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "semver": "^7.5.2" + }, + "peerDependencies": { + "@vue/compiler-sfc": "2.7.x || 3.x", + "prettier": "2 || 3" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } + } + }, + "node_modules/@ianvs/prettier-plugin-sort-imports/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@iconify-icons/mingcute": { @@ -2987,15 +3133,42 @@ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", "license": "MIT" }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "license": "MIT", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -3012,57 +3185,38 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, - "license": "MIT" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@juggle/resize-observer": { @@ -3072,10 +3226,585 @@ "license": "Apache-2.0" }, "node_modules/@justinribeiro/lite-youtube": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@justinribeiro/lite-youtube/-/lite-youtube-1.5.0.tgz", - "integrity": "sha512-TU92RKtz9BI9PRYrVwDIUsnFadLZtqRKWl1ZOdbxb7roJDb8Dd/xURllAsLEmCg6oJNyhXlVa5RsnUc0EKd8Cw==", - "license": "MIT" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@justinribeiro/lite-youtube/-/lite-youtube-1.6.0.tgz", + "integrity": "sha512-gq+um2I/Q2rZYhvP9X7NVX36zFE7Lkz8V7ZNU4cPgDuN9a+2dA95PQhF4dCqIag8XspLN9lwrObIW6U0Y5moqA==" + }, + "node_modules/@lingui/babel-plugin-extract-messages": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-4.14.0.tgz", + "integrity": "sha512-lLabYkUsiF0un4ezColFm9Yf23c+efPR/5DRM9cFwW9uZJ5ajN4Ic00dBxJK9HOpy6fpaANnaHFmrm4NScijvQ==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/cli": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-4.14.0.tgz", + "integrity": "sha512-g9aJ76wpl6Fj06SEGiGnilAErEuZG6/woAU1HM81E0ZZ8ib1DF+cf81PJE+8Lwoxc0yMqY8qMScwhwcUhnR0aA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.0", + "@babel/generator": "^7.21.1", + "@babel/parser": "^7.22.0", + "@babel/runtime": "^7.21.0", + "@babel/types": "^7.21.2", + "@lingui/babel-plugin-extract-messages": "4.14.0", + "@lingui/conf": "4.14.0", + "@lingui/core": "4.14.0", + "@lingui/format-po": "4.14.0", + "@lingui/message-utils": "4.14.0", + "babel-plugin-macros": "^3.0.1", + "chalk": "^4.1.0", + "chokidar": "3.5.1", + "cli-table": "^0.3.11", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", + "date-fns": "^3.6.0", + "esbuild": "^0.17.10", + "glob": "^7.1.4", + "inquirer": "^7.3.3", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "ora": "^5.1.0", + "pathe": "^1.1.0", + "pkg-up": "^3.1.0", + "pofile": "^1.1.4", + "pseudolocale": "^2.0.0", + "ramda": "^0.27.1", + "source-map": "^0.8.0-beta.0" + }, + "bin": { + "lingui": "dist/lingui.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@lingui/cli/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/@lingui/cli/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@lingui/conf": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-4.14.0.tgz", + "integrity": "sha512-wHZ4s79wqPnROa3xEoUTNep7sjqwbDHCMLBhsHbcvk/3ACDKgm0TMvDnIRjMRwrPRsK98yxSmWaE+NKhT0Ggyw==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^1.17.1", + "lodash.get": "^4.4.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/core": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-4.14.0.tgz", + "integrity": "sha512-rsuBKG3mupWpfP5RYacufu0ToavrqgFPnEI/zOcuvMNL24IlZ38O2/P3POZCEA8XCyhON70FICy8xs3ZvQ+uWg==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/message-utils": "4.14.0", + "unraw": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/detect-locale": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-4.14.0.tgz", + "integrity": "sha512-GDY+EPUEtPeFQU9Mw6yygwapCIeaN+WY61bMd7HG2dvVofZ1E+dS/MWOi03r7If7Q4DB9S6nlyNYrTw/KOsCBQ==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/format-po": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-4.14.0.tgz", + "integrity": "sha512-3Bmk9f7lRuBoZsBG5c5hq5ipgAqeux+nDVnAIXSfsp4f8jj+z+cHwW0xuHcW48mHQFwfcTGAYZcKnwhuwwut6Q==", + "dev": true, + "dependencies": { + "@lingui/conf": "4.14.0", + "@lingui/message-utils": "4.14.0", + "date-fns": "^3.6.0", + "pofile": "^1.1.4" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/macro": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-4.14.0.tgz", + "integrity": "sha512-zZNPYVwCMvKcDtaPzYDhkfogbUMEKCsCEIqvXrKI2DujLjV7DWGJ97U99h9iGDeBrEIZqFHnimsAwbb2lfRPaQ==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@babel/types": "^7.20.7", + "@lingui/conf": "4.14.0", + "@lingui/core": "4.14.0", + "@lingui/message-utils": "4.14.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@lingui/react": "^4.0.0", + "babel-plugin-macros": "2 || 3" + } + }, + "node_modules/@lingui/message-utils": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-4.14.0.tgz", + "integrity": "sha512-izZod/6P2cXtqZt06r+VcbG3oCskPY8A1dVA8hyx0UZBCaufrZk6NgzCMYTMRXyOuXt6MafQyUfBJSrE4n3FIw==", + "dependencies": { + "@messageformat/parser": "^5.0.0", + "js-sha256": "^0.10.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/react": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-4.14.0.tgz", + "integrity": "sha512-20gk22E3RZar4Wcdt/gBtHfi1UZTQvEX5XaCDZF9iAyIlwIWxA+eTquNwg08tYl4Ne6o8jjUGEWcNBJ3ZnlXhg==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/core": "4.14.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@lingui/vite-plugin": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@lingui/vite-plugin/-/vite-plugin-4.14.0.tgz", + "integrity": "sha512-1UilkYXIA8xfexlndsbsfS7AQi0Qm0VRSf92DWw5YCACFuk8Exb1su/CYrQu/YWk0MfcDY6/7rJDEOPWGgBRWA==", + "dev": true, + "dependencies": { + "@lingui/cli": "4.14.0", + "@lingui/conf": "4.14.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "vite": "^3 || ^4 || ^5.0.9" + } }, "node_modules/@lukeed/csprng": { "version": "1.0.1", @@ -3086,50 +3815,21 @@ "node": ">=8" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", + "node_modules/@messageformat/parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz", + "integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "moo": "^0.5.1" } }, "node_modules/@preact/preset-vite": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.8.1.tgz", - "integrity": "sha512-a9KV4opdj17X2gOFuGup0aE+sXYABX/tJi/QDptOrleX4FlnoZgDWvz45tHOdVfrZX+3uvVsIYPHxRsTerkDNA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.9.1.tgz", + "integrity": "sha512-JecWzrOx7ogFhklSMhY+aH/24pajL0Vx+beEgau3WDMUUAo32cpUo/UqerPhLOyhCKXlxK9a3cRoa8g68ZAp5g==", "dev": true, "dependencies": { + "@babel/code-frame": "^7.22.13", "@babel/plugin-transform-react-jsx": "^7.22.15", "@babel/plugin-transform-react-jsx-development": "^7.22.5", "@prefresh/vite": "^2.4.1", @@ -3139,19 +3839,14 @@ "kolorist": "^1.8.0", "magic-string": "0.30.5", "node-html-parser": "^6.1.10", - "resolve": "^1.22.8" + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" }, "peerDependencies": { "@babel/core": "7.x", "vite": "2.x || 3.x || 4.x || 5.x" } }, - "node_modules/@preact/preset-vite/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, "node_modules/@preact/preset-vite/node_modules/magic-string": { "version": "0.30.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", @@ -3164,6 +3859,15 @@ "node": ">=12" } }, + "node_modules/@preact/preset-vite/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/@prefresh/babel-plugin": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.0.tgz", @@ -3215,6 +3919,86 @@ "node": ">=14" } }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/pluginutils": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", @@ -3385,12 +4169,16 @@ "win32" ] }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", @@ -3399,105 +4187,61 @@ } }, "node_modules/@szhsin/react-menu": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@szhsin/react-menu/-/react-menu-4.1.0.tgz", - "integrity": "sha512-lYYGUxqJxM2b/jD2Cn5a9RVOvHl9VBMX8qOnHZuX1w08cO2jslykpz5P75D7WnqudLnXsJ4k4+tI+q2U8XIFYw==", - "license": "MIT", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@szhsin/react-menu/-/react-menu-4.2.3.tgz", + "integrity": "sha512-pLbjaR1XNu8rnHnmkf7eCotKFheumcxVrLQUxRRJB+P8XAc7LusAv4Rd6krhkGbeI4NsLFxNCvNq+wmx3/y/Wg==", "dependencies": { "prop-types": "^15.7.2", - "react-transition-state": "^2.1.0" + "react-transition-state": "^2.1.2" }, "peerDependencies": { "react": ">=16.14.0", "react-dom": ">=16.14.0" } }, - "node_modules/@trivago/prettier-plugin-sort-imports": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", - "integrity": "sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/generator": "7.17.7", - "@babel/parser": "^7.20.5", - "@babel/traverse": "7.23.2", - "@babel/types": "7.17.0", - "javascript-natural-sort": "0.7.1", - "lodash": "^4.17.21" - }, - "peerDependencies": { - "@vue/compiler-sfc": "3.x", - "prettier": "2.x - 3.x" - }, - "peerDependenciesMeta": { - "@vue/compiler-sfc": { - "optional": true - } - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true, - "license": "MIT" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } }, "node_modules/@types/node": { "version": "18.11.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", - "dev": true, "license": "MIT" }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true }, "node_modules/@types/retry": { "version": "0.12.2", @@ -3506,25 +4250,24 @@ "license": "MIT" }, "node_modules/@types/trusted-types": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", - "dev": true, - "license": "MIT" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true }, - "node_modules/@uidotdev/usehooks": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@uidotdev/usehooks/-/usehooks-2.4.1.tgz", - "integrity": "sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dependencies": { + "@types/yargs-parser": "*" } }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, "node_modules/@vue/compiler-core": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", @@ -3613,11 +4356,10 @@ "peer": true }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3626,22 +4368,48 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -3655,34 +4423,71 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3700,15 +4505,14 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "dev": true, "funding": [ { @@ -3725,8 +4529,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -3743,11 +4547,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -3755,46 +4561,72 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", - "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", - "dev": true, - "license": "MIT", + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.4.0", - "semver": "^6.1.1" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", - "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0", - "core-js-compat": "^3.30.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", - "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-transform-hook-names": { @@ -3814,6 +4646,49 @@ "dev": true, "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -3832,22 +4707,21 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -3864,10 +4738,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3876,6 +4750,30 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3883,33 +4781,48 @@ "dev": true, "license": "MIT" }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, - "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -3920,10 +4833,21 @@ "tslib": "^2.0.3" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001588", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", - "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "dev": true, "funding": [ { @@ -3952,18 +4876,18 @@ } }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/change-case": { @@ -3986,22 +4910,116 @@ "tslib": "^2.0.3" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, - "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chroma-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-3.1.2.tgz", + "integrity": "sha512-IJnETTalXbsLx1eKEgx19d5L6SRM7cH4vINw/99p/M11HCuXGRWL+6YmCm7FWFGIo6dtWuQoQi1dc5yQ7ESIHg==" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=0.1.90" + } }, "node_modules/commander": { "version": "2.20.3", @@ -4015,16 +5033,14 @@ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", - "license": "MIT" + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==" }, "node_modules/concat-map": { "version": "0.0.1", @@ -4060,33 +5076,70 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.24.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/css-blank-pseudo": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-6.0.1.tgz", - "integrity": "sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", "dev": true, "funding": [ { @@ -4099,19 +5152,19 @@ } ], "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/css-has-pseudo": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.2.tgz", - "integrity": "sha512-Z2Qm5yyOvJRTy6THdUlnGIX6PW/1wOc4FHWlfkcBkfkpZ3oz6lPdG+h+J7t1HZHT4uSSVR8XatXiMpqMUADXow==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.1.tgz", + "integrity": "sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==", "dev": true, "funding": [ { @@ -4124,21 +5177,21 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.2", - "postcss-selector-parser": "^6.0.13", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/css-prefers-color-scheme": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-9.0.1.tgz", - "integrity": "sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", "dev": true, "funding": [ { @@ -4151,7 +5204,7 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" @@ -4186,9 +5239,9 @@ } }, "node_modules/cssdb": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.0.tgz", - "integrity": "sha512-YUVAJhjDcTZzVD5XE49l3PQtGE29vvhzaL1bM3BtkvSmIRJeYENdfn1dn5jauBI7BBF+IyyiBS+oSVx3Hz/Gaw==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.1.tgz", + "integrity": "sha512-KwEPys7lNsC8OjASI8RrmwOYYDcm0JOW9zQhcV83ejYcQkirTEyeAGui8aO2F5PiS6SLpxuTzl6qlMElIdsgIg==", "dev": true, "funding": [ { @@ -4213,29 +5266,74 @@ "node": ">=4" } }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "license": "MIT" - }, - "node_modules/dayjs-twitter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/dayjs-twitter/-/dayjs-twitter-0.5.0.tgz", - "integrity": "sha512-SZ7qEUISstBLUXdlGAbLrwr6zfRM9kaCfbq4uVTerM/HXzuHiiGzzUqAJVhxt+3tf69E+ocmQdP6YYpOINv05w==", - "license": "MIT", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, "dependencies": { - "duration-js": "^4.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, - "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4251,18 +5349,86 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, - "license": "MIT", "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4273,13 +5439,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/derive-valtio": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/derive-valtio/-/derive-valtio-0.1.0.tgz", - "integrity": "sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==", - "peerDependencies": { - "valtio": "*" - } + "node_modules/dom-input-range": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dom-input-range/-/dom-input-range-1.2.0.tgz", + "integrity": "sha512-8HVA5Oy5Vt872S7IXsjjp6/5Hqsm5YZLhurxwwQXp80T9qVsj8/mEUH3sQlFujLLUoWfxiaThHHuJ3/q1MHVuA==", + "workspaces": [ + "demos" + ] }, "node_modules/dom-serializer": { "version": "2.0.0", @@ -4346,18 +5512,11 @@ "tslib": "^2.0.3" } }, - "node_modules/duration-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/duration-js/-/duration-js-4.0.0.tgz", - "integrity": "sha512-qoXjOsH97r+NrOa6sK5V2cwBOouVG/LI9jwgwKvjVkyqGpZ72yilWjjzFJYPqqbvNZDwpRMaLEUFE+PTefvOEA==", - "license": "MIT" - }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -4369,9 +5528,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.677", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.677.tgz", - "integrity": "sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==", + "version": "1.5.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz", + "integrity": "sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/entities": { @@ -4386,47 +5551,66 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "license": "MIT", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -4435,16 +5619,48 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -4455,7 +5671,6 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -4469,12 +5684,11 @@ } }, "node_modules/esbuild": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", - "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -4482,36 +5696,36 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.5", - "@esbuild/android-arm64": "0.19.5", - "@esbuild/android-x64": "0.19.5", - "@esbuild/darwin-arm64": "0.19.5", - "@esbuild/darwin-x64": "0.19.5", - "@esbuild/freebsd-arm64": "0.19.5", - "@esbuild/freebsd-x64": "0.19.5", - "@esbuild/linux-arm": "0.19.5", - "@esbuild/linux-arm64": "0.19.5", - "@esbuild/linux-ia32": "0.19.5", - "@esbuild/linux-loong64": "0.19.5", - "@esbuild/linux-mips64el": "0.19.5", - "@esbuild/linux-ppc64": "0.19.5", - "@esbuild/linux-riscv64": "0.19.5", - "@esbuild/linux-s390x": "0.19.5", - "@esbuild/linux-x64": "0.19.5", - "@esbuild/netbsd-x64": "0.19.5", - "@esbuild/openbsd-x64": "0.19.5", - "@esbuild/sunos-x64": "0.19.5", - "@esbuild/win32-arm64": "0.19.5", - "@esbuild/win32-ia32": "0.19.5", - "@esbuild/win32-x64": "0.19.5" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -4521,7 +5735,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -4538,7 +5751,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -4549,18 +5761,53 @@ "integrity": "sha512-RtnLYrMbXp4JkZIoZu+3VTqV21bNVBlJBZ4NmtwvMNqSE3qouhxv2gvLE4JJDaQc54ioPkrX74V6x+hp/hqjkQ==", "license": "MIT" }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/fast-blurhash": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-blurhash/-/fast-blurhash-1.1.2.tgz", - "integrity": "sha512-lJVOgYSlahqkRhrKumNx/SGB2F/qS0D1z7xjGYjb5EZJRtlzySGMniZjkQ9h9Rv8sPmM/V9orEgRiMwazDNH6A==", - "license": "ISC" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-blurhash/-/fast-blurhash-1.1.4.tgz", + "integrity": "sha512-xeH121M027hgWHHhHWYYjUmMKl8vCH3PPkXk439ixsP8Bvb/r3UFqg12oMSToD/aSAw8EE6XiTdfZ6M5jaLfzg==" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-equals": { "version": "5.0.1", @@ -4570,38 +5817,31 @@ "node": ">=6.0.0" } }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, - "license": "ISC", "dependencies": { - "reusify": "^1.0.4" + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/filelist": { @@ -4638,11 +5878,10 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4650,12 +5889,23 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } @@ -4678,7 +5928,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -4693,8 +5942,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -4711,23 +5959,23 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true, - "license": "MIT" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -4741,11 +5989,18 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fuse.js": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz", + "integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==", + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4757,16 +6012,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4776,18 +6034,29 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "ISC" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -4801,7 +6070,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4822,7 +6090,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4841,13 +6108,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -4861,7 +6128,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4873,14 +6139,12 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.1" @@ -4894,40 +6158,35 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4940,7 +6199,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4949,13 +6207,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4964,6 +6221,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -4988,12 +6257,32 @@ "resolved": "https://registry.npmjs.org/html-prettify/-/html-prettify-1.0.7.tgz", "integrity": "sha512-99pRsP2PV2DyWnrVibNyad7gNmzCP7AANO8jw7Z9yanWyXH9dPdqdMXGefySplroqCNdk95u7j5TLxfyJ1Cbbg==" }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/idb-keyval": { "version": "6.2.1", @@ -5001,12 +6290,46 @@ "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", "license": "Apache-2.0" }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5016,45 +6339,98 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, - "license": "ISC" + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, + "node_modules/intl-locale-textinfo-polyfill": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/intl-locale-textinfo-polyfill/-/intl-locale-textinfo-polyfill-2.1.1.tgz", + "integrity": "sha512-k2J6ejhL75v94reBfX2gYF6yQ5uqtt+jBRQy5f7QSBl3GEI7gMrQ7mAq1GF8txxUsSQZMx7Sa5VekImh+SZtLA==" + }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -5062,12 +6438,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5084,7 +6471,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5096,7 +6482,6 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, "license": "MIT", "dependencies": { "has": "^1.0.3" @@ -5105,12 +6490,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5121,22 +6520,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -5144,19 +6565,44 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5181,7 +6627,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -5191,7 +6636,6 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5207,7 +6651,6 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5217,7 +6660,6 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5234,19 +6676,20 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5257,7 +6700,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -5270,7 +6712,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5286,7 +6727,6 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -5298,17 +6738,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, - "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -5317,12 +6752,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -5330,6 +6776,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, "node_modules/isomorphic-ws": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", @@ -5358,126 +6831,50 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dependencies": { - "color-convert": "^2.0.1" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=14" } }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/js-sha256": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", + "integrity": "sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -5489,7 +6886,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -5499,31 +6895,33 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -5543,7 +6941,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -5556,7 +6953,6 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5578,8 +6974,24 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, "engines": { "node": ">=6" } @@ -5595,15 +7007,34 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, - "license": "MIT" + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/loose-envify": { "version": "1.4.0", @@ -5626,6 +7057,15 @@ "tslib": "^2.0.3" } }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -5646,33 +7086,22 @@ } }, "node_modules/masto": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/masto/-/masto-6.6.4.tgz", - "integrity": "sha512-qoq08UAzdRhVNo9eUG+LIxVNx8UWq+ZqyyeoPGYKLsCOdNyxZpkdK7r3M1negyBscfsNzppdMDpuRhmxDOizxw==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/masto/-/masto-6.10.1.tgz", + "integrity": "sha512-CBEAvWJfMLMgk0cURSGU/fRJDcFEZWo1LBfVYztBNEOyijoedQh4htKaon+XCE4aT7TLYPqOLmcllXwMjOvztA==", "dependencies": { "change-case": "^4.1.2", "events-to-async": "^2.0.1", "isomorphic-ws": "^5.0.0", "ts-custom-error": "^3.3.1", - "ws": "^8.16.0" + "ws": "^8.18.0" } }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } + "dev": true }, "node_modules/micro-memoize": { "version": "4.1.2", @@ -5681,13 +7110,12 @@ "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -5717,6 +7145,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5745,12 +7182,22 @@ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-3.0.3.tgz", "integrity": "sha512-NCe8qxnZFARSHGztGMZOO/PC1qa5MIFB5Hp66WdzbCRAz8U8US3bx1UTgLS49efBQPcUtO9gf5oVEY8o7y/7Kg==" }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true }, "node_modules/nanoid": { "version": "3.3.7", @@ -5791,11 +7238,20 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -5805,6 +7261,18 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -5827,11 +7295,13 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, - "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5841,20 +7311,18 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -5870,15 +7338,127 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dependencies": { "@types/retry": "0.12.2", "is-network-error": "^1.0.0", @@ -5892,9 +7472,9 @@ } }, "node_modules/p-throttle": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-6.1.0.tgz", - "integrity": "sha512-eQMdGTxk2+047La67wefUtt0tEHh7D+C8Jl7QXoFCuIiNYeQ9zWs2AZiJdIAs72rSXZ06t11me2bgalRNdy3SQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-6.2.0.tgz", + "integrity": "sha512-NCKkOVj6PZa6NiTmfvGilDdf6vO1rFCD3KDnkHko8dTOtkpk4cSR/VTAhhLMG9aiQ7/A9HYgEDNmxzf6hxzR3g==", "engines": { "node": ">=18" }, @@ -5902,6 +7482,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -5912,6 +7501,34 @@ "tslib": "^2.0.3" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -5932,29 +7549,57 @@ "tslib": "^2.0.3" } }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "license": "ISC" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -5969,10 +7614,37 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -5990,17 +7662,17 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-attribute-case-insensitive": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-6.0.3.tgz", - "integrity": "sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", "dev": true, "funding": [ { @@ -6013,10 +7685,10 @@ } ], "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" @@ -6039,9 +7711,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.5.tgz", - "integrity": "sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.6.tgz", + "integrity": "sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA==", "dev": true, "funding": [ { @@ -6054,23 +7726,23 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-color-hex-alpha": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-9.0.4.tgz", - "integrity": "sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", "dev": true, "funding": [ { @@ -6083,20 +7755,20 @@ } ], "dependencies": { - "@csstools/utilities": "^1.0.0", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-color-rebeccapurple": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-9.0.3.tgz", - "integrity": "sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", "dev": true, "funding": [ { @@ -6109,20 +7781,20 @@ } ], "dependencies": { - "@csstools/utilities": "^1.0.0", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-custom-media": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.3.tgz", - "integrity": "sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", "dev": true, "funding": [ { @@ -6135,22 +7807,22 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-custom-properties": { - "version": "13.3.5", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.5.tgz", - "integrity": "sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", + "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", "dev": true, "funding": [ { @@ -6163,23 +7835,23 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/utilities": "^1.0.0", + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-custom-selectors": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.7.tgz", - "integrity": "sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", + "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", "dev": true, "funding": [ { @@ -6192,22 +7864,22 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "postcss-selector-parser": "^6.0.13" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-dark-theme-class": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-dark-theme-class/-/postcss-dark-theme-class-1.2.1.tgz", - "integrity": "sha512-EzQMGOcYnE0eMBjfgB+xnamlZ8O02Aiojyg/iv84cpRUdLKZW8ankZWxWUhhIid1OF7yl4G3BeYfE+7CGY2tdQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-dark-theme-class/-/postcss-dark-theme-class-1.3.0.tgz", + "integrity": "sha512-prap+7LDzkWUzf8yciQsZdPi+Fm0k699KBCubLu6n9P5HCTyKCpxRJILPhs/L9m5JLTA/7xrICApse+nk5Qkmw==", "dev": true, "funding": [ { @@ -6219,6 +7891,9 @@ "url": "https://github.com/sponsors/ai" } ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { "node": ">=18.0" }, @@ -6227,9 +7902,9 @@ } }, "node_modules/postcss-dir-pseudo-class": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-8.0.1.tgz", - "integrity": "sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", "dev": true, "funding": [ { @@ -6242,19 +7917,19 @@ } ], "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-double-position-gradients": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.4.tgz", - "integrity": "sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz", + "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==", "dev": true, "funding": [ { @@ -6267,21 +7942,21 @@ } ], "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-focus-visible": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-9.0.1.tgz", - "integrity": "sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", "dev": true, "funding": [ { @@ -6294,19 +7969,19 @@ } ], "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "funding": [ { @@ -6319,10 +7994,10 @@ } ], "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" @@ -6339,9 +8014,9 @@ } }, "node_modules/postcss-gap-properties": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-5.0.1.tgz", - "integrity": "sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", "dev": true, "funding": [ { @@ -6354,16 +8029,16 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-image-set-function": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-6.0.3.tgz", - "integrity": "sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", "dev": true, "funding": [ { @@ -6376,20 +8051,20 @@ } ], "dependencies": { - "@csstools/utilities": "^1.0.0", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-lab-function": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.10.tgz", - "integrity": "sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.6.tgz", + "integrity": "sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ==", "dev": true, "funding": [ { @@ -6402,23 +8077,23 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/utilities": "^1.0.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-logical": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.1.tgz", - "integrity": "sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", + "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", "dev": true, "funding": [ { @@ -6434,16 +8109,16 @@ "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-nesting": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.3.tgz", - "integrity": "sha512-yrtMRPFNkfZMv9ikBvZ/Eh3RxhpMBKQ3KzD7LCY8+jYVlgju/Mdcxi4JY8bW2Y7ISXw8GTLuF/o+kFtp+yaVfQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", "dev": true, "funding": [ { @@ -6456,20 +8131,21 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.2", - "postcss-selector-parser": "^6.0.13" + "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-opacity-percentage": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz", - "integrity": "sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", "dev": true, "funding": [ { @@ -6481,18 +8157,17 @@ "url": "https://liberapay.com/mrcgrtz" } ], - "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2" + "postcss": "^8.4" } }, "node_modules/postcss-overflow-shorthand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-5.0.1.tgz", - "integrity": "sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", "dev": true, "funding": [ { @@ -6508,7 +8183,7 @@ "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" @@ -6525,9 +8200,9 @@ } }, "node_modules/postcss-place": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-9.0.1.tgz", - "integrity": "sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", "dev": true, "funding": [ { @@ -6543,16 +8218,16 @@ "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-preset-env": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.4.0.tgz", - "integrity": "sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", + "integrity": "sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ==", "dev": true, "funding": [ { @@ -6565,78 +8240,81 @@ } ], "dependencies": { - "@csstools/postcss-cascade-layers": "^4.0.3", - "@csstools/postcss-color-function": "^3.0.10", - "@csstools/postcss-color-mix-function": "^2.0.10", - "@csstools/postcss-exponential-functions": "^1.0.4", - "@csstools/postcss-font-format-keywords": "^3.0.2", - "@csstools/postcss-gamut-mapping": "^1.0.3", - "@csstools/postcss-gradients-interpolation-method": "^4.0.10", - "@csstools/postcss-hwb-function": "^3.0.9", - "@csstools/postcss-ic-unit": "^3.0.4", - "@csstools/postcss-initial": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^4.0.5", - "@csstools/postcss-light-dark-function": "^1.0.0", - "@csstools/postcss-logical-float-and-clear": "^2.0.1", - "@csstools/postcss-logical-overflow": "^1.0.1", - "@csstools/postcss-logical-overscroll-behavior": "^1.0.1", - "@csstools/postcss-logical-resize": "^2.0.1", - "@csstools/postcss-logical-viewport-units": "^2.0.6", - "@csstools/postcss-media-minmax": "^1.1.3", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.6", - "@csstools/postcss-nested-calc": "^3.0.2", - "@csstools/postcss-normalize-display-values": "^3.0.2", - "@csstools/postcss-oklab-function": "^3.0.10", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/postcss-relative-color-syntax": "^2.0.10", - "@csstools/postcss-scope-pseudo-class": "^3.0.1", - "@csstools/postcss-stepped-value-functions": "^3.0.5", - "@csstools/postcss-text-decoration-shorthand": "^3.0.4", - "@csstools/postcss-trigonometric-functions": "^3.0.5", - "@csstools/postcss-unset-value": "^3.0.1", - "autoprefixer": "^10.4.17", - "browserslist": "^4.22.3", - "css-blank-pseudo": "^6.0.1", - "css-has-pseudo": "^6.0.2", - "css-prefers-color-scheme": "^9.0.1", - "cssdb": "^7.11.0", - "postcss-attribute-case-insensitive": "^6.0.3", + "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.6", + "@csstools/postcss-color-mix-function": "^3.0.6", + "@csstools/postcss-content-alt-text": "^2.0.4", + "@csstools/postcss-exponential-functions": "^2.0.5", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.6", + "@csstools/postcss-gradients-interpolation-method": "^5.0.6", + "@csstools/postcss-hwb-function": "^4.0.6", + "@csstools/postcss-ic-unit": "^4.0.0", + "@csstools/postcss-initial": "^2.0.0", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.3", + "@csstools/postcss-media-minmax": "^2.0.5", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.6", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-random-function": "^1.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.6", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.0", + "@csstools/postcss-stepped-value-functions": "^4.0.5", + "@csstools/postcss-text-decoration-shorthand": "^4.0.1", + "@csstools/postcss-trigonometric-functions": "^4.0.5", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.1", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.2.1", + "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^6.0.5", - "postcss-color-hex-alpha": "^9.0.4", - "postcss-color-rebeccapurple": "^9.0.3", - "postcss-custom-media": "^10.0.3", - "postcss-custom-properties": "^13.3.5", - "postcss-custom-selectors": "^7.1.7", - "postcss-dir-pseudo-class": "^8.0.1", - "postcss-double-position-gradients": "^5.0.4", - "postcss-focus-visible": "^9.0.1", - "postcss-focus-within": "^8.0.1", + "postcss-color-functional-notation": "^7.0.6", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-custom-properties": "^14.0.4", + "postcss-custom-selectors": "^8.0.4", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.0", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^5.0.1", - "postcss-image-set-function": "^6.0.3", - "postcss-lab-function": "^6.0.10", - "postcss-logical": "^7.0.1", - "postcss-nesting": "^12.0.3", - "postcss-opacity-percentage": "^2.0.0", - "postcss-overflow-shorthand": "^5.0.1", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.6", + "postcss-logical": "^8.0.0", + "postcss-nesting": "^13.0.1", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", "postcss-page-break": "^3.0.4", - "postcss-place": "^9.0.1", - "postcss-pseudo-class-any-link": "^9.0.1", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^7.0.2" + "postcss-selector-not": "^8.0.1" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-pseudo-class-any-link": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-9.0.1.tgz", - "integrity": "sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", "dev": true, "funding": [ { @@ -6649,10 +8327,10 @@ } ], "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" @@ -6669,9 +8347,9 @@ } }, "node_modules/postcss-selector-not": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-7.0.2.tgz", - "integrity": "sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", "dev": true, "funding": [ { @@ -6684,19 +8362,19 @@ } ], "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -6713,27 +8391,31 @@ "dev": true, "license": "MIT" }, + "node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, "node_modules/preact": { - "version": "10.19.6", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.6.tgz", - "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==", + "version": "10.24.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", + "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" } }, "node_modules/prettier": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", - "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", "dev": true, - "license": "MIT", - "peer": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -6752,6 +8434,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6764,47 +8475,53 @@ } }, "node_modules/proxy-compare": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.6.0.tgz", - "integrity": "sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.0.tgz", + "integrity": "sha512-y44MCkgtZUCT9tZGuE278fB7PWVf7fRYy0vbRXAts2o5F0EfC4fIQrvQQGBJo1WJbFcVLXzApOscyJuZqHQc1w==" + }, + "node_modules/pseudolocale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-2.1.0.tgz", + "integrity": "sha512-af5fsrRvVwD+MBasBJvuDChT0KDqT0nEwD9NTgbtHJ16FKomWac9ua0z6YVNB4G9x9IOaiGWym62aby6n4tFMA==", + "dev": true, + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "pseudolocale": "dist/cli.mjs" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pseudolocale/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "license": "MIT", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -6837,21 +8554,21 @@ } }, "node_modules/react-hotkeys-hook": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.5.0.tgz", - "integrity": "sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.6.1.tgz", + "integrity": "sha512-XlZpbKUj9tkfgPgT9gA+1p7Ey6vFIZHttUjPqpTdyT5nqQ8mHL7elxvSbaC+dpSiHUSmr21Ya1mDxBZG3aje4Q==", "peerDependencies": { "react": ">=16.8.1", "react-dom": ">=16.8.1" } }, "node_modules/react-intersection-observer": { - "version": "9.8.1", - "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.8.1.tgz", - "integrity": "sha512-QzOFdROX8D8MH3wE3OVKH0f3mLjKTtEN1VX/rkNuECCff+aKky0pIjulDhr3Ewqj5el/L+MhBkM3ef0Tbt+qUQ==", + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.13.1.tgz", + "integrity": "sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw==", "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "react-dom": { @@ -6922,28 +8639,51 @@ } }, "node_modules/react-transition-state": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-transition-state/-/react-transition-state-2.1.0.tgz", - "integrity": "sha512-b8ldw2pbZk++XM43vcD4ETaFWlzTsjpUX33CmT8BBPPFYlQ2R50wxcY4ZeJ1TesJYziYZ9/rNPFnyA9tR0iKDw==", - "license": "MIT", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-transition-state/-/react-transition-state-2.2.0.tgz", + "integrity": "sha512-D3EyLku1Sdxrxq26Fo4Jh0q1BLEFQfDOxKKiSuyqWH84+hM6y0Guc0hcW2IXMXY5l5gQCgkOQ9y90xx6mNoj5w==", "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, - "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -6952,32 +8692,29 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "license": "MIT" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6987,16 +8724,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -7004,34 +8740,29 @@ "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", + "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7040,7 +8771,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -7054,6 +8784,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -7063,17 +8814,6 @@ "node": ">= 4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.5.1.tgz", @@ -7102,28 +8842,61 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-buffer": { @@ -7144,24 +8917,31 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -7177,7 +8957,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -7194,30 +8973,97 @@ } }, "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -7228,6 +9074,17 @@ "tslib": "^2.0.3" } }, + "node_modules/sonda": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/sonda/-/sonda-0.6.1.tgz", + "integrity": "sha512-0N32ZDSfN1FSYkoZOF0zshPtYZXloChfVOjGHiZmPhaBbykC8mL8/j861S5GcZXuIqDv0TJH3RHFkHJgBbMCFw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "open": "^10.1.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7239,11 +9096,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7266,6 +9122,24 @@ "dev": true, "license": "MIT" }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-length": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", @@ -7280,36 +9154,77 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7319,30 +9234,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7353,7 +9269,6 @@ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -7383,29 +9298,34 @@ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7415,16 +9335,15 @@ } }, "node_modules/swiped-events": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/swiped-events/-/swiped-events-1.1.9.tgz", - "integrity": "sha512-5XK67LMllHOyHoQuKVuZsOEHkCBfuxPnUJpxRiq4x/z0/+vl3N7cr35QEERXQweYozc1xVNqtQl3ddhQzkNeUQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/swiped-events/-/swiped-events-1.2.0.tgz", + "integrity": "sha512-KRu67z1hb4sPxMdFIF2kaufYHTcWOb8NVLbIl2g5dPWZkEQ6D3wfSIVJ7iXbicTt9cO3e0vARqgx9fITtTZxQw==" }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -7434,7 +9353,6 @@ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", @@ -7449,14 +9367,13 @@ } }, "node_modules/terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -7467,14 +9384,76 @@ "node": ">=10" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", "dev": true, - "license": "MIT", + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, "engines": { - "node": ">=4" + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyld": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/tinyld/-/tinyld-1.3.4.tgz", + "integrity": "sha512-u26CNoaInA4XpDU+8s/6Cq8xHc2T5M4fXB3ICfXPokUQoLzmPgSZU02TAkFwFMJCWTjk53gtkS8pETTreZwCqw==", + "bin": { + "tinyld": "bin/tinyld.js", + "tinyld-heavy": "bin/tinyld-heavy.js", + "tinyld-light": "bin/tinyld-light.js" + }, + "engines": { + "node": ">= 12.10.0", + "npm": ">= 6.12.0", + "yarn": ">= 1.20.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/to-regex-range": { @@ -7482,7 +9461,6 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7501,7 +9479,6 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, - "license": "MIT", "dependencies": { "punycode": "^2.1.0" } @@ -7516,10 +9493,9 @@ } }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "license": "0BSD" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/twemoji-parser": { "version": "11.0.2", @@ -7552,7 +9528,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7560,16 +9535,74 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7592,7 +9625,6 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -7604,11 +9636,10 @@ } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7618,7 +9649,6 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, - "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -7628,11 +9658,10 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7642,7 +9671,6 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7652,7 +9680,6 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, - "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -7661,30 +9688,33 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, + "node_modules/unraw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==" + }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -7700,10 +9730,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -7730,26 +9759,15 @@ "tslib": "^2.0.3" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/use-debounce": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.0.tgz", - "integrity": "sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A==", - "license": "MIT", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.4.tgz", + "integrity": "sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==", "engines": { "node": ">= 16.0.0" }, "peerDependencies": { - "react": ">=16.8.0" + "react": "*" } }, "node_modules/use-long-press": { @@ -7774,15 +9792,6 @@ "react-dom": "16.8.0 - 18" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7790,20 +9799,18 @@ "dev": true }, "node_modules/valtio": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.13.2.tgz", - "integrity": "sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/valtio/-/valtio-2.1.2.tgz", + "integrity": "sha512-fhekN5Rq7dvHULHHBlJeXHrQDl0Jj9GXfNavCm3gkD06crGchaG1nf/J7gSlfZU2wPcRdVS5jBKWHtE2NNz97A==", "dependencies": { - "derive-valtio": "0.1.0", - "proxy-compare": "2.6.0", - "use-sync-external-store": "1.2.0" + "proxy-compare": "^3.0.0" }, "engines": { "node": ">=12.20.0" }, "peerDependencies": { - "@types/react": ">=16.8", - "react": ">=16.8" + "@types/react": ">=18.0.0", + "react": ">=18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -7815,14 +9822,14 @@ } }, "node_modules/vite": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", - "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -7841,6 +9848,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -7858,6 +9866,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -7870,11 +9881,10 @@ } }, "node_modules/vite-plugin-generate-file": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vite-plugin-generate-file/-/vite-plugin-generate-file-0.1.1.tgz", - "integrity": "sha512-V1TsLEXlrRiMZognzZqE3cgAHTJwQ84aE45gTR0Hhel6ROTQQU1i7qRbuyBqZI7QC4fUYLhugdaLPpaDpkB2pA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-generate-file/-/vite-plugin-generate-file-0.2.0.tgz", + "integrity": "sha512-mAHqvyFWrqbYNmWmSjhfyxShEgVN9ZPSI/cRove86KEYQIJUZ74XajXpPMwIE1xll9piA5Cmhi8kt/ydQSzZ/Q==", "dev": true, - "license": "MIT", "dependencies": { "ejs": "^3.1.9", "js-yaml": "^4.1.0", @@ -7883,29 +9893,28 @@ } }, "node_modules/vite-plugin-html-config": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/vite-plugin-html-config/-/vite-plugin-html-config-1.0.11.tgz", - "integrity": "sha512-hUybhgI+/LQQ5q6xoMMsTvI4PBuQD/Wv6Z1vtDPVWjanS8weCIexXuLLYNGD/93f0v8W2hpNfXpmxgpZMahJ0g==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-html-config/-/vite-plugin-html-config-2.0.2.tgz", + "integrity": "sha512-g09u0XsmgKyMUIp1RZSyNSkJWvIusaXxw3KylyxU3vkCq7/G8hyemLctT+4IvO42fCPlNySmrNC9g0qSoKmvpw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0.0" }, "peerDependencies": { - "vite": ">=2.0.0" + "vite": ">=5.0.0" } }, "node_modules/vite-plugin-pwa": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.19.2.tgz", - "integrity": "sha512-LSQJFPxCAQYbRuSyc9EbRLRqLpaBA9onIZuQFomfUYjWSgHuQLonahetDlPSC9zsxmkSEhQH8dXZN8yL978h3w==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.21.0.tgz", + "integrity": "sha512-gnDE5sN2hdxA4vTl0pe6PCTPXqChk175jH8dZVVTBjFhWarZZoXaAdoTIKCIa8Zbx94sC0CnCOyERBWpxvry+g==", "dev": true, "dependencies": { - "debug": "^4.3.4", - "fast-glob": "^3.3.2", + "debug": "^4.3.6", "pretty-bytes": "^6.1.1", - "workbox-build": "^7.0.0", - "workbox-window": "^7.0.0" + "tinyglobby": "^0.2.10", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" }, "engines": { "node": ">=16.0.0" @@ -7914,10 +9923,10 @@ "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@vite-pwa/assets-generator": "^0.2.4", + "@vite-pwa/assets-generator": "^0.2.6", "vite": "^3.1.0 || ^4.0.0 || ^5.0.0", - "workbox-build": "^7.0.0", - "workbox-window": "^7.0.0" + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" }, "peerDependenciesMeta": { "@vite-pwa/assets-generator": { @@ -7931,31 +9940,89 @@ "integrity": "sha512-qgjh5pz75MdE9Kzs8J0kBwaCfifHV0ezRbB9rpGsIOxam+ilcGV7WOk91vFJXquzRmiKrFh3Hxlh0JJWAmXTbQ==", "dev": true }, + "node_modules/vite-plugin-run": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/vite-plugin-run/-/vite-plugin-run-0.6.1.tgz", + "integrity": "sha512-mXEEQHWhk/OD8XuK7V517eDPnXS5OrzjGsihHihSbWNFXqEBy6WNkdLNIfPY1o86JLLRDVq3VeVus3YOTiJeGg==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.10", + "debug": "^4.3.7", + "execa": "5.1.1", + "minimatch": "^9.0.5", + "picocolors": "^1.1.0" + } + }, + "node_modules/vite-plugin-run/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/vite-plugin-run/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, - "license": "MIT", "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -7968,18 +10035,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, - "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7989,40 +10054,38 @@ } }, "node_modules/workbox-background-sync": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz", - "integrity": "sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", "dev": true, - "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-broadcast-update": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz", - "integrity": "sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-build": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.0.0.tgz", - "integrity": "sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", "dev": true, - "license": "MIT", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", + "@babel/core": "^7.24.4", "@babel/preset-env": "^7.11.0", "@babel/runtime": "^7.11.2", "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "ajv": "^8.6.0", "common-tags": "^1.8.0", @@ -8032,27 +10095,26 @@ "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", "source-map": "^0.8.0-beta.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "7.0.0", - "workbox-broadcast-update": "7.0.0", - "workbox-cacheable-response": "7.0.0", - "workbox-core": "7.0.0", - "workbox-expiration": "7.0.0", - "workbox-google-analytics": "7.0.0", - "workbox-navigation-preload": "7.0.0", - "workbox-precaching": "7.0.0", - "workbox-range-requests": "7.0.0", - "workbox-recipes": "7.0.0", - "workbox-routing": "7.0.0", - "workbox-strategies": "7.0.0", - "workbox-streams": "7.0.0", - "workbox-sw": "7.0.0", - "workbox-window": "7.0.0" + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" }, "engines": { "node": ">=16.0.0" @@ -8063,7 +10125,6 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -8082,33 +10143,11 @@ } } }, - "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -8122,7 +10161,6 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -8135,19 +10173,23 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "node_modules/workbox-build/node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/workbox-build/node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -8156,11 +10198,10 @@ } }, "node_modules/workbox-build/node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -8171,28 +10212,11 @@ "fsevents": "~2.3.2" } }, - "node_modules/workbox-build/node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "whatwg-url": "^7.0.0" }, @@ -8201,153 +10225,139 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz", - "integrity": "sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.0.0.tgz", - "integrity": "sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==", - "dev": true, - "license": "MIT" + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", + "dev": true }, "node_modules/workbox-expiration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.0.0.tgz", - "integrity": "sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", "dev": true, - "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-google-analytics": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz", - "integrity": "sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-background-sync": "7.0.0", - "workbox-core": "7.0.0", - "workbox-routing": "7.0.0", - "workbox-strategies": "7.0.0" + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-navigation-preload": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz", - "integrity": "sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-precaching": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.0.0.tgz", - "integrity": "sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-core": "7.0.0", - "workbox-routing": "7.0.0", - "workbox-strategies": "7.0.0" + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-range-requests": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz", - "integrity": "sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-recipes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.0.0.tgz", - "integrity": "sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-cacheable-response": "7.0.0", - "workbox-core": "7.0.0", - "workbox-expiration": "7.0.0", - "workbox-precaching": "7.0.0", - "workbox-routing": "7.0.0", - "workbox-strategies": "7.0.0" + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-routing": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.0.0.tgz", - "integrity": "sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-strategies": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.0.0.tgz", - "integrity": "sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-streams": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.0.0.tgz", - "integrity": "sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", "dev": true, - "license": "MIT", "dependencies": { - "workbox-core": "7.0.0", - "workbox-routing": "7.0.0" + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" } }, "node_modules/workbox-sw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.0.0.tgz", - "integrity": "sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==", - "dev": true, - "license": "MIT" + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", + "dev": true }, "node_modules/workbox-window": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.0.0.tgz", - "integrity": "sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", "dev": true, - "license": "MIT", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "7.0.0" + "workbox-core": "7.3.0" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, @@ -8363,6 +10373,20 @@ "optional": true } } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } } } } diff --git a/package.json b/package.json index af7978a4..81917824 100644 --- a/package.json +++ b/package.json @@ -6,61 +6,80 @@ "dev": "vite", "build": "vite build", "preview": "vite preview", - "fetch-instances": "env $(cat .env.local | grep -v \"#\" | xargs) node scripts/fetch-instances-list.js", - "sourcemap": "npx source-map-explorer dist/assets/*.js" + "fetch-instances": "node scripts/fetch-instances-list.js", + "sourcemap": "npx source-map-explorer dist/assets/*.js", + "bundle-visualizer": "npx vite-bundle-visualizer", + "messages:extract": "lingui extract", + "messages:extract:clean": "lingui extract --locale en --clean", + "messages:compile": "lingui compile", + "fetch-i18n-volunteers": "env $(cat .env.local | grep -v \"#\" | xargs) node scripts/fetch-i18n-volunteers.js", + "readme:i18n-volunteers": "node scripts/update-i18n-volunteers-readme.js" }, "dependencies": { - "@formatjs/intl-localematcher": "~0.5.4", - "@formatjs/intl-segmenter": "~11.5.5", - "@formkit/auto-animate": "~0.8.1", - "@github/text-expander-element": "~2.6.1", + "@formatjs/intl-localematcher": "~0.5.8", + "@formatjs/intl-segmenter": "~11.7.4", + "@formkit/auto-animate": "~0.8.2", + "@github/text-expander-element": "~2.8.0", "@iconify-icons/mingcute": "~1.2.9", - "@justinribeiro/lite-youtube": "~1.5.0", - "@szhsin/react-menu": "~4.1.0", - "@uidotdev/usehooks": "~2.4.1", - "compare-versions": "~6.1.0", - "dayjs": "~1.11.10", - "dayjs-twitter": "~0.5.0", - "fast-blurhash": "~1.1.2", + "@justinribeiro/lite-youtube": "~1.6.0", + "@lingui/detect-locale": "~4.14.0", + "@lingui/macro": "~4.14.0", + "@lingui/react": "~4.14.0", + "@szhsin/react-menu": "~4.2.3", + "chroma-js": "~3.1.2", + "compare-versions": "~6.1.1", + "fast-blurhash": "~1.1.4", "fast-equals": "~5.0.1", - "html-prettify": "^1.0.7", + "fuse.js": "~7.0.0", + "html-prettify": "~1.0.7", "idb-keyval": "~6.2.1", + "intl-locale-textinfo-polyfill": "~2.1.1", + "js-cookie": "~3.0.5", "just-debounce-it": "~3.2.0", "lz-string": "~1.5.0", - "masto": "~6.6.4", + "masto": "~6.10.1", "moize": "~6.1.6", - "p-retry": "~6.2.0", - "p-throttle": "~6.1.0", - "preact": "~10.19.6", - "react-hotkeys-hook": "~4.5.0", - "react-intersection-observer": "~9.8.1", + "p-retry": "~6.2.1", + "p-throttle": "~6.2.0", + "preact": "~10.24.3", + "punycode": "~2.3.1", + "react-hotkeys-hook": "~4.6.1", + "react-intersection-observer": "~9.13.1", "react-quick-pinch-zoom": "~5.1.0", "react-router-dom": "6.6.2", "string-length": "6.0.0", - "swiped-events": "~1.1.9", + "swiped-events": "~1.2.0", + "tinyld": "~1.3.4", "toastify-js": "~1.12.0", "uid": "~2.0.2", - "use-debounce": "~10.0.0", + "use-debounce": "~10.0.4", "use-long-press": "~3.2.0", "use-resize-observer": "~9.1.0", - "valtio": "1.13.2" + "valtio": "2.1.2" }, "devDependencies": { - "@preact/preset-vite": "~2.8.1", - "@trivago/prettier-plugin-sort-imports": "~4.3.0", - "postcss": "~8.4.35", - "postcss-dark-theme-class": "~1.2.1", - "postcss-preset-env": "~9.4.0", + "@ianvs/prettier-plugin-sort-imports": "~4.4.0", + "@lingui/cli": "~4.14.0", + "@lingui/vite-plugin": "~4.14.0", + "@preact/preset-vite": "~2.9.1", + "babel-plugin-macros": "~3.1.0", + "postcss": "~8.4.49", + "postcss-dark-theme-class": "~1.3.0", + "postcss-preset-env": "~10.1.1", + "prettier": "3.4.1", + "sonda": "~0.6.1", "twitter-text": "~3.1.0", - "vite": "~5.1.5", - "vite-plugin-generate-file": "~0.1.1", - "vite-plugin-html-config": "~1.0.11", - "vite-plugin-pwa": "~0.19.2", + "vite": "~5.4.11", + "vite-plugin-generate-file": "~0.2.0", + "vite-plugin-html-config": "~2.0.2", + "vite-plugin-pwa": "~0.21.0", "vite-plugin-remove-console": "~2.2.0", - "workbox-cacheable-response": "~7.0.0", - "workbox-expiration": "~7.0.0", - "workbox-routing": "~7.0.0", - "workbox-strategies": "~7.0.0" + "vite-plugin-run": "~0.6.1", + "workbox-cacheable-response": "~7.3.0", + "workbox-expiration": "~7.3.0", + "workbox-navigation-preload": "~7.3.0", + "workbox-routing": "~7.3.0", + "workbox-strategies": "~7.3.0" }, "postcss": { "plugins": { diff --git a/public/sw.js b/public/sw.js index 3ec33b36..bdb3ce8d 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,5 +1,6 @@ import { CacheableResponsePlugin } from 'workbox-cacheable-response'; import { ExpirationPlugin } from 'workbox-expiration'; +import * as navigationPreload from 'workbox-navigation-preload'; import { RegExpRoute, registerRoute, Route } from 'workbox-routing'; import { CacheFirst, @@ -7,19 +8,48 @@ import { StaleWhileRevalidate, } from 'workbox-strategies'; +navigationPreload.enable(); + self.__WB_DISABLE_DEV_LOGS = true; +const iconsRoute = new Route( + ({ request, sameOrigin }) => { + const isIcon = request.url.includes('/icons/'); + return sameOrigin && isIcon; + }, + new CacheFirst({ + cacheName: 'icons', + plugins: [ + new ExpirationPlugin({ + // Weirdly high maxEntries number, due to some old icons suddenly disappearing and not rendering + // NOTE: Temporary fix + maxEntries: 300, + maxAgeSeconds: 3 * 24 * 60 * 60, // 3 days + purgeOnQuotaError: true, + }), + new CacheableResponsePlugin({ + statuses: [0, 200], + }), + ], + }), +); +registerRoute(iconsRoute); + const assetsRoute = new Route( ({ request, sameOrigin }) => { const isAsset = request.destination === 'style' || request.destination === 'script'; - const hasHash = /-[0-9a-f]{4,}\./i.test(request.url); + const hasHash = /-[0-9a-z-]{4,}\./i.test(request.url); return sameOrigin && isAsset && hasHash; }, new NetworkFirst({ cacheName: 'assets', networkTimeoutSeconds: 5, plugins: [ + new ExpirationPlugin({ + maxEntries: 30, + purgeOnQuotaError: true, + }), new CacheableResponsePlugin({ statuses: [0, 200], }), @@ -41,8 +71,7 @@ const imageRoute = new Route( cacheName: 'remote-images', plugins: [ new ExpirationPlugin({ - maxEntries: 50, - maxAgeSeconds: 3 * 24 * 60 * 60, // 3 days + maxEntries: 30, purgeOnQuotaError: true, }), new CacheableResponsePlugin({ @@ -53,17 +82,17 @@ const imageRoute = new Route( ); registerRoute(imageRoute); -const iconsRoute = new Route( - ({ request, sameOrigin }) => { - const isIcon = request.url.includes('/icons/'); - return sameOrigin && isIcon; - }, - new CacheFirst({ - cacheName: 'icons', +// 1-day cache for +// - /api/v1/custom_emojis +// - /api/v1/lists/:id +// - /api/v1/announcements +const apiExtendedRoute = new RegExpRoute( + /^https?:\/\/[^\/]+\/api\/v\d+\/(custom_emojis|lists\/\d+|announcements)$/, + new StaleWhileRevalidate({ + cacheName: 'api-extended', plugins: [ new ExpirationPlugin({ - maxEntries: 50, - maxAgeSeconds: 3 * 24 * 60 * 60, // 3 days + maxAgeSeconds: 12 * 60 * 60, // 12 hours purgeOnQuotaError: true, }), new CacheableResponsePlugin({ @@ -72,30 +101,30 @@ const iconsRoute = new Route( ], }), ); -registerRoute(iconsRoute); - -// 1-day cache for -// - /api/v1/instance -// - /api/v1/custom_emojis -// - /api/v1/preferences -// - /api/v1/lists/:id -// - /api/v1/announcements -const apiExtendedRoute = new RegExpRoute( - /^https?:\/\/[^\/]+\/api\/v\d+\/(instance|custom_emojis|preferences|lists\/\d+|announcements)$/, - new StaleWhileRevalidate({ - cacheName: 'api-extended', - plugins: [ - new ExpirationPlugin({ - maxAgeSeconds: 24 * 60 * 60, // 1 day - }), - new CacheableResponsePlugin({ - statuses: [0, 200], - }), - ], - }), -); registerRoute(apiExtendedRoute); +// Note: expiration is not working as expected +// https://github.com/GoogleChrome/workbox/issues/3316 +// +// const apiIntermediateRoute = new RegExpRoute( +// // Matches: +// // - trends/* +// // - timelines/link +// /^https?:\/\/[^\/]+\/api\/v\d+\/(trends|timelines\/link)/, +// new StaleWhileRevalidate({ +// cacheName: 'api-intermediate', +// plugins: [ +// new ExpirationPlugin({ +// maxAgeSeconds: 1 * 60, // 1min +// }), +// new CacheableResponsePlugin({ +// statuses: [0, 200], +// }), +// ], +// }), +// ); +// registerRoute(apiIntermediateRoute); + const apiRoute = new RegExpRoute( // Matches: // - statuses/:id/context - some contexts are really huge @@ -105,7 +134,9 @@ const apiRoute = new RegExpRoute( networkTimeoutSeconds: 5, plugins: [ new ExpirationPlugin({ + maxEntries: 30, maxAgeSeconds: 5 * 60, // 5 minutes + purgeOnQuotaError: true, }), new CacheableResponsePlugin({ statuses: [0, 200], diff --git a/scripts/catalogs.js b/scripts/catalogs.js new file mode 100644 index 00000000..debb0d43 --- /dev/null +++ b/scripts/catalogs.js @@ -0,0 +1,93 @@ +import fs from 'node:fs'; + +// Dependency from Lingui, not listed in package.json +import PO from 'pofile'; + +const DEFAULT_LANG = 'en'; +const IGNORE_LANGS = [DEFAULT_LANG, 'pseudo-LOCALE']; + +const files = fs.readdirSync('src/locales'); +const catalogs = {}; + +const enCatalog = files.find((file) => file.endsWith('en.po')); +const enContent = fs.readFileSync(`src/locales/${enCatalog}`, 'utf8'); +const enPo = PO.parse(enContent); +const total = enPo.items.length; +console.log('Total strings:', total); + +const codeMaps = { + 'kab-KAB': 'kab', +}; + +files.forEach((file) => { + if (file.endsWith('.po')) { + const code = file.replace(/\.po$/, ''); + if (IGNORE_LANGS.includes(code)) return; + const content = fs.readFileSync(`src/locales/${file}`, 'utf8'); + const po = PO.parse(content); + const { items } = po; + // Percentage of translated strings + const translated = items.filter( + (item) => item.msgstr !== '' && item.msgstr[0] !== '', + ).length; + const percentage = Math.round((translated / total) * 100); + po.percentage = percentage; + if (percentage > 0) { + // Ignore empty catalogs + catalogs[codeMaps[code] || code] = percentage; + } + } +}); + +const regionMaps = { + 'zh-CN': 'zh-Hans', + 'zh-TW': 'zh-Hant', +}; + +function IDN(inputCode, outputCode) { + let result; + const regionlessInputCode = + regionMaps[inputCode] || inputCode.replace(/-[a-z]+$/i, ''); + const regionlessOutputCode = + regionMaps[outputCode] || outputCode.replace(/-[a-z]+$/i, ''); + const inputCodes = + regionlessInputCode !== inputCode + ? [inputCode, regionlessInputCode] + : [inputCode]; + const outputCodes = + regionlessOutputCode !== outputCode + ? [regionlessOutputCode, outputCode] + : [outputCode]; + + for (const inputCode of inputCodes) { + for (const outputCode of outputCodes) { + try { + result = new Intl.DisplayNames([inputCode], { + type: 'language', + }).of(outputCode); + break; + } catch (e) {} + } + if (result) break; + } + return result; +} + +const fullCatalogs = Object.entries(catalogs) + // sort by key + .sort((a, b) => a[0].localeCompare(b[0])) + .map(([code, completion]) => { + const nativeName = IDN(code, code); + const name = IDN('en', code); + return { code, nativeName, name, completion }; + }); + +// Sort by completion +const sortedCatalogs = [...fullCatalogs].sort( + (a, b) => b.completion - a.completion, +); +console.table(sortedCatalogs); + +const path = 'src/data/catalogs.json'; +fs.writeFileSync(path, JSON.stringify(fullCatalogs, null, 2)); +console.log('File written:', path); diff --git a/scripts/fetch-i18n-volunteers.js b/scripts/fetch-i18n-volunteers.js new file mode 100644 index 00000000..b0e4132e --- /dev/null +++ b/scripts/fetch-i18n-volunteers.js @@ -0,0 +1,131 @@ +import fs from 'fs'; + +const { CROWDIN_ACCESS_TOKEN } = process.env; + +const PROJECT_ID = '703337'; + +if (!CROWDIN_ACCESS_TOKEN) { + throw new Error('CROWDIN_ACCESS_TOKEN is not set'); +} + +// Generate Report + +let REPORT_ID = null; +{ + const response = await fetch( + `https://api.crowdin.com/api/v2/projects/${PROJECT_ID}/reports`, + { + headers: { + Authorization: `Bearer ${CROWDIN_ACCESS_TOKEN}`, + 'Content-Type': 'application/json', + }, + method: 'POST', + body: JSON.stringify({ + name: 'top-members', + schema: { + format: 'json', + }, + }), + }, + ); + const json = await response.json(); + console.log(`Report ID: ${json?.data?.identifier}`); + REPORT_ID = json?.data?.identifier; +} + +if (!REPORT_ID) { + throw new Error('Report ID is not found'); +} + +// Check Report Generation Status +let finished = false; +{ + let maxPolls = 10; + do { + maxPolls--; + if (maxPolls < 0) break; + + // Wait for 1 second + await new Promise((resolve) => setTimeout(resolve, 1000)); + + const status = await fetch( + `https://api.crowdin.com/api/v2/projects/${PROJECT_ID}/reports/${REPORT_ID}`, + { + headers: { + Authorization: `Bearer ${CROWDIN_ACCESS_TOKEN}`, + 'Content-Type': 'application/json', + }, + }, + ); + const json = await status.json(); + const progress = json?.data?.progress; + console.log(`Progress: ${progress}% (${maxPolls} retries left)`); + finished = json?.data?.status === 'finished'; + } while (!finished); +} + +if (!finished) { + throw new Error('Failed to generate report'); +} + +// Download Report +let reportURL = null; +{ + const response = await fetch( + `https://api.crowdin.com/api/v2/projects/${PROJECT_ID}/reports/${REPORT_ID}/download`, + { + headers: { + Authorization: `Bearer ${CROWDIN_ACCESS_TOKEN}`, + 'Content-Type': 'application/json', + }, + }, + ); + const json = await response.json(); + reportURL = json?.data?.url; + console.log(`Report URL: ${reportURL}`); +} + +if (!reportURL) { + throw new Error('Report URL is not found'); +} + +// Actually download the report +let members = null; +{ + const response = await fetch(reportURL); + const json = await response.json(); + + const { data } = json; + + if (!data?.length) { + throw new Error('No data found'); + } + + // Sort by 'user.fullName' + data.sort((a, b) => a.user.username.localeCompare(b.user.username)); + members = data + .filter((item) => { + const isMyself = item.user.username === 'cheeaun'; + const translatedMoreThanZero = item.translated > 0; + + return !isMyself && translatedMoreThanZero; + }) + .map((item) => ({ + avatarUrl: item.user.avatarUrl, + username: item.user.username, + languages: item.languages.map((lang) => lang.name), + })); + + console.log(members); + + if (members?.length) { + fs.writeFileSync( + 'i18n-volunteers.json', + JSON.stringify(members, null, '\t'), + ); + } +} + +if (!members?.length) { + throw new Error('No members found'); +} diff --git a/scripts/update-i18n-volunteers-readme.js b/scripts/update-i18n-volunteers-readme.js new file mode 100644 index 00000000..571c8677 --- /dev/null +++ b/scripts/update-i18n-volunteers-readme.js @@ -0,0 +1,27 @@ +// Find for <!-- i18n volunteers start --><!-- i18n volunteers end --> and inject list of i18n volunteers in between + +import fs from 'fs'; + +const i18nVolunteers = JSON.parse(fs.readFileSync('i18n-volunteers.json')); + +const readme = fs.readFileSync('README.md', 'utf8'); + +const i18nVolunteersStart = '<!-- i18n volunteers start -->'; +const i18nVolunteersEnd = '<!-- i18n volunteers end -->'; + +const i18nVolunteersList = i18nVolunteers + .map((member) => { + return `- <img src="${member.avatarUrl}" alt="" width="16" height="16" /> ${ + member.username + } (${member.languages.join(', ')})`; + }) + .join('\n'); + +const readmeUpdated = readme.replace( + new RegExp(`${i18nVolunteersStart}.*${i18nVolunteersEnd}`, 's'), + `${i18nVolunteersStart}\n${i18nVolunteersList}\n${i18nVolunteersEnd}`, +); + +fs.writeFileSync('README.md', readmeUpdated); + +console.log('Updated README.md'); diff --git a/src/app.css b/src/app.css index 30481d83..7046cacb 100644 --- a/src/app.css +++ b/src/app.css @@ -34,6 +34,8 @@ a.mention span { text-decoration-color: inherit; text-decoration-thickness: 2px; text-underline-offset: 2px; + font-variant-numeric: slashed-zero; + font-feature-settings: 'ss01'; } /* a.mention:has(span).hashtag { color: var(--link-light-color); @@ -160,7 +162,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { white-space: nowrap; } .deck > header .header-grid > .header-side:last-of-type { - text-align: right; + text-align: end; grid-column: 3; } .deck > header .header-grid :is(button, .button).plain { @@ -179,8 +181,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { grid-template-columns: 1fr max-content; } .deck > header .header-grid-2 h1 { - text-align: left; - padding-left: 8px; + text-align: start; + padding-inline-start: 8px; } .deck > header .header-grid h1:has(.ancestors-indicator) { display: flex; @@ -215,6 +217,19 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { opacity: 0.25; } } +@keyframes indeterminate-bar-rtl { + 0% { + transform: translateX(50%); + opacity: 0.25; + } + 50% { + opacity: 1; + } + 100% { + transform: translateX(-50%); + opacity: 0.25; + } +} .deck > header.loading:after { pointer-events: none; content: ''; @@ -230,6 +245,9 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { transparent ); animation: indeterminate-bar 1s ease-in-out infinite alternate; + &:dir(rtl) { + animation-name: indeterminate-bar-rtl; + } } @media (min-width: 40em) { .deck > header.loading:after { @@ -266,6 +284,9 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { width: 95vw; max-width: calc(320px * 3.3); transform: translateX(calc(-50% + var(--main-width) / 2)); + &:dir(rtl) { + transform: translateX(calc(50% - var(--main-width) / 2)); + } } } @@ -293,12 +314,47 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { video, img, audio { - min-height: 88px; /* for extreme dimensions */ + min-height: var(--min-dimension); /* for extreme dimensions */ } } } } } + +.deck-container-media-first { + .timeline { + > li:not(.timeline-item-carousel, .timeline-item-container) { + &:has(.status-media-first) { + @media (min-width: 40em) { + width: fit-content; + max-width: min(480px, 100%); + } + + background-color: transparent !important; + border: 0 !important; + box-shadow: none !important; + margin-inline: auto !important; + + &:not(:first-child) { + margin-block: 32px; + } + + &:has(.skeleton) { + width: 100%; + } + } + + &:has(.media[data-orientation='landscape']) { + max-width: 100%; + } + } + + .status-link:has(.status-media-first):hover { + background-color: transparent; + } + } +} + .timeline.grow { /* min-height: 100vh; min-height: 100dvh; */ @@ -309,26 +365,106 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { margin: 0; padding: 0; border-bottom: var(--hairline-width) solid var(--divider-color); + --line-dir: var(--to-forward); +} +.timeline > li + li:not(.timeline-item-carousel, .hero, .ancestor) { + content-visibility: auto; + contain-intrinsic-size: auto 160px; +} +.timeline.contextual + > li:is(:hover, :focus-visible, :focus-within, :has(.status-menu-open)) { + /* Needed to undo the overflow: hidden "effect" due to "content-visibility: auto" */ + content-visibility: visible !important; } .timeline.flat > li { border-bottom: none; } .timeline.contextual { - --thread-start: 40px; - --line-start: 40px; + --indent-large-start: 40px; + --indent-small-start: 10px; + --thread-start: var(--indent-small-start); + --line-start: var(--indent-small-start); --line-width: 3px; --line-end: calc(var(--line-start) + var(--line-width)); + --indent-large-end: calc(var(--indent-large-start) + var(--line-width)); + --indent-small-end: calc(var(--indent-small-start) + var(--line-width)); --line-margin-end: 16px; --line-radius: 10px; --line-diameter: calc(var(--line-radius) * 2); --avatar-size: 50px; --avatar-margin-start: 16px; --avatar-margin-end: 12px; + --line-curve: 45deg; + :dir(rtl) & { + --line-curve: -45deg; + } + + > li:is(.hero:has(+ .thread), .hero:last-child, .thread, .ancestor) { + --thread-start: var(--indent-large-start); + --line-start: var(--indent-large-start); + --line-end: calc(var(--line-start) + var(--line-width)); + } + + > li.descendant.thread:has(+ .descendant:not(.thread)):after { + position: absolute; + inset-inline-start: 10px; + bottom: 0; + content: ''; + display: block; + --curves-width: calc(var(--line-start) + var(--line-width) - 10px); + width: var(--curves-width); + background-color: var(--bg-color); + background-repeat: no-repeat; + /* border-bottom: var(--line-width) dotted var(--comment-line-color); */ + /* height: calc(var(--line-diameter) - var(--line-width)); + background-image: linear-gradient( + transparent calc(var(--line-radius) - var(--line-width)), + var(--comment-line-color) calc(var(--line-radius) - var(--line-width)) + var(--line-radius), + transparent var(--line-radius) + ), + radial-gradient( + circle at bottom var(--forward), + transparent calc(var(--line-radius) - var(--line-width)), + var(--comment-line-color) calc(var(--line-radius) - var(--line-width)) + var(--line-radius), + transparent var(--line-radius) + ), + radial-gradient( + circle at top var(--backward), + transparent calc(var(--line-radius) - var(--line-width)), + var(--comment-line-color) calc(var(--line-radius) - var(--line-width)) + var(--line-radius), + transparent var(--line-radius) + ); + background-position: var(--line-radius) 0, bottom var(--backward), + top var(--forward); + background-size: calc(100% - var(--line-radius) * 2) auto, + var(--line-radius), var(--line-radius); */ + --curves-radius: calc(var(--curves-width) / 2); + height: calc(var(--curves-width) - var(--line-width)); + background-image: radial-gradient( + circle at bottom var(--forward), + transparent calc(var(--curves-radius) - var(--line-width)), + var(--comment-line-color) calc(var(--curves-radius) - var(--line-width)) + var(--curves-radius), + transparent var(--curves-radius) + ), + radial-gradient( + circle at top var(--backward), + transparent calc(var(--curves-radius) - var(--line-width)), + var(--comment-line-color) calc(var(--curves-radius) - var(--line-width)) + var(--curves-radius), + transparent var(--curves-radius) + ); + background-size: var(--curves-radius); + background-position: top var(--backward), bottom var(--forward); + } } .timeline.contextual > li { background-image: linear-gradient( - to right, + var(--line-dir), transparent, transparent var(--line-start), var(--comment-line-color) var(--line-start), @@ -336,6 +472,28 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { transparent var(--line-end), transparent ); + &.hero:not(:has(+ .thread), :first-child, :only-child, :last-child) { + background-image: linear-gradient( + var(--line-dir), + transparent, + transparent var(--indent-small-start), + var(--comment-line-color) var(--indent-small-start), + var(--comment-line-color) var(--indent-small-end), + transparent var(--indent-small-end), + transparent + ), + linear-gradient( + var(--line-dir), + transparent, + transparent var(--indent-large-start), + var(--comment-line-color) var(--indent-large-start), + var(--comment-line-color) var(--indent-large-end), + transparent var(--indent-large-end), + transparent + ); + background-size: 100% 50%; + background-position: bottom, top; + } background-repeat: no-repeat; transition: opacity 0.3s ease-in-out; } @@ -357,7 +515,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { .timeline.contextual > li.descendant:not(.thread) > :is(.status-link, .status-focus) { - padding-left: 40px; + padding-inline-start: var(--line-start); } .timeline.contextual .replies[data-scroll-left]:not([data-scroll-left='0']) { background-color: var(--bg-color); @@ -371,7 +529,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { } .timeline.contextual .replies[data-comments-level='4']:has(.replies) { overflow-x: auto; - mask-image: linear-gradient(to left, transparent, black 32px); + mask-image: linear-gradient(var(--to-backward), transparent, black 32px); } .timeline.contextual .replies[data-comments-level='4']:has(.replies) @@ -389,145 +547,61 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { > :is(.status-link, .status-focus) + .replies .replies-summary { - margin-left: calc( + margin-inline-start: calc( var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + (var(--line-margin-end) * (var(--comments-level) - 1)) ); } -/* .timeline.contextual - > li.descendant.thread - > .status-link - + .replies - .replies - > .replies-summary { - margin-left: calc( - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + - var(--line-margin-end) - ); -} -.timeline.contextual - > li.descendant.thread - > .status-link - + .replies - .replies - .replies - > .replies-summary { - margin-left: calc( - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + - (var(--line-margin-end) * 2) - ); -} */ .timeline.contextual > li.descendant.thread > :is(.status-link, .status-focus) + .replies :is(.status-link, .status-focus) { - padding-left: calc( + padding-inline-start: calc( var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + (var(--line-margin-end) * (var(--comments-level) - 1)) ); } -/* .timeline.contextual - > li.descendant.thread - > .status-link - + .replies - .replies - .status-link { - padding-left: calc( - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + - var(--line-margin-end) - ); -} -.timeline.contextual - > li.descendant.thread - > .status-link - + .replies - .replies - .replies - .status-link { - padding-left: calc( - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + - (var(--line-margin-end) * 2) - ); -} */ .timeline.contextual > li.descendant:not(.thread) > :is(.status-link, .status-focus) + .replies .replies-summary { - margin-left: calc( + margin-inline-start: calc( var(--thread-start) + var(--line-margin-end) * var(--comments-level) ); } -/* .timeline.contextual - > li.descendant:not(.thread) - > .status-link - + .replies - .replies - > .replies-summary { - margin-left: calc( - var(--thread-start) + var(--line-margin-end) + var(--line-margin-end) - ); -} -.timeline.contextual - > li.descendant:not(.thread) - > .status-link - + .replies - .replies - .replies - > .replies-summary { - margin-left: calc( - var(--thread-start) + var(--line-margin-end) + (var(--line-margin-end) * 2) - ); -} */ .timeline.contextual > li.descendant:not(.thread) > :is(.status-link, .status-focus) + .replies :is(.status-link, .status-focus) { - padding-left: calc( + padding-inline-start: calc( var(--thread-start) + var(--line-margin-end) * var(--comments-level) ); } -/* .timeline.contextual - > li.descendant:not(.thread) - > .status-link - + .replies - .replies - .status-link { - padding-left: calc(var(--thread-start) + (var(--line-margin-end) * 2)); -} -.timeline.contextual - > li.descendant:not(.thread) - > .status-link - + .replies - .replies - .replies - .status-link { - padding-left: calc(var(--thread-start) + (var(--line-margin-end) * 3)); -} */ .timeline.contextual > li.descendant:not(.thread):before { content: ''; position: absolute; top: 10px; - left: var(--line-start); + inset-inline-start: var(--line-start); width: var(--line-diameter); height: var(--line-diameter); border-radius: var(--line-radius); border-style: solid; border-width: var(--line-width); border-color: transparent transparent var(--comment-line-color) transparent; - transform: rotate(45deg); + transform: rotate(var(--line-curve)); } .timeline.contextual > li .replies-link { color: var(--text-insignificant-color); - margin-left: 16px; + margin-inline-start: 16px; margin-top: -12px; padding-bottom: 12px; font-size: 90%; } .timeline.contextual > li.ancestor .replies-link { - margin-left: calc( + margin-inline-start: calc( var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) ); } @@ -535,7 +609,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { > li.thread > :is(.status-link, .status-focus) .replies-link { - margin-left: calc( + margin-inline-start: calc( var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) ); } @@ -566,7 +640,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { list-style: none; gap: 8px; align-items: center; - margin-right: calc(44px + 8px); + margin-inline-end: calc(44px + 8px); b { font-weight: 500; @@ -581,7 +655,9 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { transition: transform 0.3s ease; &:not(:first-child) { - margin: 0 0 0 -4px; + transform: rotate(0deg); + margin: 0; + margin-inline-start: -4px; } } } @@ -600,7 +676,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { .replies-parent-link { position: absolute; - right: 4px; + inset-inline-end: 4px; height: 100%; z-index: 2; font-size: 16px; @@ -611,8 +687,11 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { align-items: center; padding: var(--summary-padding) calc(var(--summary-padding) * 2); transform: translateX(100%); - margin: calc(-1 * var(--summary-padding)) calc(-1 * var(--summary-padding)) - calc(-1 * var(--summary-padding)) 0; + &:dir(rtl) { + transform: translateX(-100%); + } + margin: calc(-1 * var(--summary-padding)) 0; + margin-inline-end: calc(-1 * var(--summary-padding)); border-radius: 8px; background-color: var(--link-bg-color); @@ -644,7 +723,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { color: var(--text-color); background-color: var(--comment-line-color); background-image: linear-gradient( - to top right, + to top var(--forward), var(--comment-line-color), var(--bg-faded-color) ); @@ -660,7 +739,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { } } .timeline.contextual > li .replies[open] > .replies-summary { - border-bottom-left-radius: 0; + border-end-start-radius: 0; .avatars { opacity: 0.5; @@ -690,7 +769,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { ); --line-end: calc(var(--line-start) + var(--line-width)); background-image: linear-gradient( - to right, + var(--line-dir), transparent, transparent var(--line-start), var(--comment-line-color) var(--line-start), @@ -731,14 +810,14 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { content: ''; position: absolute; top: 10px; - left: var(--line-start); + inset-inline-start: var(--line-start); width: var(--line-diameter); height: var(--line-diameter); border-radius: var(--line-radius); border-style: solid; border-width: var(--line-width); border-color: transparent transparent var(--comment-line-color) transparent; - transform: rotate(45deg); + transform: rotate(var(--line-curve)); } /* .timeline.contextual > li .replies .replies li:before { --line-start: calc( @@ -777,8 +856,11 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { > ul > li:only-child { > .replies { > ul > li:only-child { - margin-left: calc(-1 * var(--line-margin-end)); - background-position: calc(16px) 0; + margin-inline-start: calc(-1 * var(--line-margin-end)); + background-position: 16px 0; + &:dir(rtl) { + background-position: -16px 0; + } background-size: 100% calc(20px + 8px); &:before { @@ -819,7 +901,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { --line-width: 3px; --line-end: calc(var(--line-start) + var(--line-width)); background-image: linear-gradient( - to right, + var(--line-dir), transparent, transparent var(--line-start), var(--comment-line-color) var(--line-start), @@ -831,8 +913,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { } .timeline:not(.flat) > li.timeline-item-container-start { margin-bottom: 0; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; + border-end-start-radius: 0; + border-end-end-radius: 0; border-bottom: 0; background-position: 0 calc(16px + var(--avatar-size)); } @@ -845,8 +927,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { } .timeline:not(.flat) > li.timeline-item-container-end { margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; + border-start-start-radius: 0; + border-start-end-radius: 0; border-top: 0; background-size: 100% 16px; @@ -872,8 +954,10 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { } .timeline .show-more { - padding-left: calc(var(--line-end) + var(--line-margin-end)) !important; - text-align: left; + padding-inline-start: calc( + var(--line-end) + var(--line-margin-end) + ) !important; + text-align: start; background-color: transparent !important; backdrop-filter: none !important; position: relative; @@ -881,7 +965,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { padding-block: 16px !important; .avatars-bunch > .avatar:not(:first-child) { - margin-left: -4px; + margin-inline-start: -4px; } } .timeline .show-more:hover { @@ -893,14 +977,14 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { content: ''; position: absolute; top: 10px; - left: var(--line-start); + inset-inline-start: var(--line-start); width: var(--line-diameter); height: var(--line-diameter); border-radius: var(--line-radius); border-style: solid; border-width: var(--line-width); border-color: transparent transparent var(--comment-line-color) transparent; - transform: rotate(45deg); + transform: rotate(var(--line-curve)); } .status-loading { @@ -951,7 +1035,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { .status-carousel { --carousel-faded-color: var(--bg-faded-color); background: linear-gradient( - to bottom right, + to bottom var(--forward), var(--carousel-faded-color), transparent ); @@ -1021,12 +1105,12 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { display: none; } .status-carousel .status-carousel-beacon { - margin-right: calc(-1 * var(--carousel-gap)); + margin-inline-end: calc(-1 * var(--carousel-gap)); pointer-events: none; opacity: 0; ~ .status-carousel-beacon { - margin-left: calc(-1 * var(--carousel-gap)); + margin-inline-start: calc(-1 * var(--carousel-gap)); } } /* @@ -1070,12 +1154,21 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { .status-carousel.boosts-carousel > ul > li:before { content: counter(index); position: absolute; - left: 0; + inset-inline-start: 0; font-size: 10px; color: var(--text-insignificant-color); padding: 6px; } +.status-carousel.boosts-carousel .timeline-item-carousel-group { + flex-direction: column; + gap: 8px; + + &:before { + content: ''; + } +} + .ui-state { padding: 16px; text-align: center; @@ -1101,11 +1194,11 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { box-shadow: 0 1px var(--bg-color); &:has(.status-badge:not(:empty)) { - border-top-right-radius: 8px; + border-start-end-radius: 8px; } - .status-carousel.boosts-carousel & { - border-top-left-radius: 8px; + .status-carousel.boosts-carousel &:not(.timeline-item-carousel-group &) { + border-start-start-radius: 8px; } } .status-carousel-link::focus { @@ -1143,14 +1236,29 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { transform: translate3d(0, 0, 0); } } +@keyframes slide-in-rtl { + 0% { + transform: translate3d(-100%, 0, 0); + } + 100% { + transform: translate3d(0, 0, 0); + } +} .deck-backdrop .deck { width: var(--main-width); max-width: 100vw; background-color: var(--bg-color); box-shadow: -1px 0 var(--bg-color); + &:dir(rtl) { + box-shadow: 1px 0 var(--bg-color); + } } .deck-backdrop .deck.slide-in:not(.deck-view-full) { animation: slide-in 0.5s var(--timing-function); + + &:dir(rtl) { + animation-name: slide-in-rtl; + } } .deck-backdrop .deck .status { max-width: var(--main-width); @@ -1194,7 +1302,7 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { content: ''; display: inline-block; position: absolute; - right: 10px; + inset-inline-end: 10px; width: 4px; height: 4px; border-radius: 50%; @@ -1287,6 +1395,11 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { user-select: none; width: 100%; gap: 16px; + --accent-gradient: var(--accent-gradient-light); + @media (prefers-color-scheme: dark) { + --accent-gradient: var(--accent-gradient-dark); + } + background-image: linear-gradient(to var(--forward), var(--accent-gradient)); } .carousel::-webkit-scrollbar { display: none; @@ -1301,7 +1414,10 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { width: 100%; height: 100vh; height: 100dvh; - background-color: var(--accent-alpha-color); + background-color: var(--accent-light-color); + @media (prefers-color-scheme: dark) { + background-color: var(--accent-dark-color); + } /* background-image: radial-gradient( closest-side, var(--accent-color) 10%, @@ -1473,6 +1589,7 @@ body:has(.media-modal-container + .status-deck) .media-post-link { .media-modal-container + .status-deck { /* display: none; */ position: absolute; + inset-inline-end: 0; z-index: -1; pointer-events: none; user-select: none; @@ -1500,8 +1617,8 @@ body:has(.media-modal-container + .status-deck) .media-post-link { ) #modal-container > div { - left: 0; - right: 350px; + inset-inline-start: 0; + inset-inline-end: 350px; width: auto; } /* ✨ New */ @@ -1532,8 +1649,8 @@ body:has(.media-modal-container + .status-deck) .media-post-link { position: fixed; bottom: 16px; bottom: max(16px, env(safe-area-inset-bottom)); - right: 16px; - right: max(16px, env(safe-area-inset-right)); + inset-inline-end: 16px; + inset-inline-end: max(16px, env(safe-area-inset-right)); padding: 16px; background-color: var(--button-bg-blur-color); /* backdrop-filter: blur(16px); */ @@ -1542,8 +1659,8 @@ body:has(.media-modal-container + .status-deck) .media-post-link { 0 10px 36px -4px var(--button-bg-blur-color); transition: all 0.3s ease-in-out; } -.deck-container:has(header[hidden]) ~ #compose-button, -#compose-button[hidden] { +.deck-container:has(header[hidden]) ~ #compose-button:not(.loading), +#compose-button[hidden]:not(.loading) { transform: translateY(200%); pointer-events: none; user-select: none; @@ -1572,10 +1689,53 @@ body:has(.media-modal-container + .status-deck) .media-post-link { bottom: calc(16px + env(safe-area-inset-bottom) + 52px); } } +#compose-button { + &.min { + outline: 2px solid var(--button-text-color); + z-index: 1001; /* Higher than modal */ + + &:after { + content: ''; + display: block; + position: absolute; + top: 0; + inset-inline-end: 0; + width: 14px; + height: 14px; + border-radius: 50%; + background-color: var(--button-bg-color); + border: 2px solid var(--button-text-color); + box-shadow: 0 2px 8px var(--drop-shadow-color); + opacity: 0; + transition: opacity 0.2s ease-out 0.5s; + opacity: 1; + } + } + + &.loading { + outline-color: var(--button-bg-blur-color); + + &:before { + position: absolute; + inset: 0; + content: ''; + border-radius: 50%; + animation: spin 5s linear infinite; + border: 2px dashed var(--button-text-color); + } + } + + &.error { + &:after { + background-color: var(--red-color); + } + } +} /* SHEET */ .sheet { + timeline-scope: --sheet-scroll; align-self: flex-end; display: flex; flex-direction: column; @@ -1607,6 +1767,10 @@ body:has(.media-modal-container + .status-deck) .media-post-link { border-radius: 0; padding: 0; right: env(safe-area-inset-right); + &:dir(rtl) { + right: auto; + left: env(safe-area-inset-left); + } width: 44px; height: 44px; display: inline-flex; @@ -1646,8 +1810,34 @@ body:has(.media-modal-container + .status-deck) .media-post-link { padding-right: max(16px, env(safe-area-inset-right)); user-select: none; } +@keyframes header-border { + 0% { + box-shadow: none; + } + 100% { + box-shadow: 0 0 0 1px var(--outline-color), + 0 8px 16px -8px var(--drop-shadow-color); + } +} +@supports ((animation-timeline: scroll()) and (animation-range: 0% 100%)) { + .sheet header { + animation: header-border 1s linear both; + animation-timeline: --sheet-scroll; + animation-range: 0 8px; + position: relative; + z-index: 1; + } + .sheet header + main { + mask-image: none !important; + } +} .sheet .sheet-close:not(.outer) + header { padding-right: max(44px, env(safe-area-inset-right)); + + &:dir(rtl) { + padding-right: max(16px, env(safe-area-inset-right)); + padding-left: max(44px, env(safe-area-inset-left)); + } } .sheet header :is(h1, h2, h3) { margin: 0; @@ -1659,6 +1849,7 @@ body:has(.media-modal-container + .status-deck) .media-post-link { align-items: center; } .sheet main { + scroll-timeline: --sheet-scroll; overflow: auto; overflow-x: hidden; overscroll-behavior: contain; @@ -1685,6 +1876,10 @@ body:has(.media-modal-container + .status-deck) .media-post-link { width: 100%; height: 100%; } + + :dir(rtl) &.rtl-flip { + transform: scaleX(-1); + } } /* TAG */ @@ -1743,16 +1938,17 @@ body > .szh-menu-container { env(safe-area-inset-bottom) env(safe-area-inset-left); } .szh-menu { - padding: 8px 0; + padding: 4px 0; margin: 0; font-size: var(--text-size); background-color: var(--bg-color); - border: 1px solid var(--outline-color); + border: 1px solid var(--outline-stronger-color); border-radius: 8px; - box-shadow: 0 3px 16px -3px var(--drop-shadow-color); - text-align: left; + 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; */ - width: 16em; + min-width: 16em; max-width: 90vw; /* overflow: hidden; */ } @@ -1762,7 +1958,7 @@ body > .szh-menu-container { box-shadow: 0 3px 24px -3px var(--drop-shadow-color); } .szh-menu__header { - margin: -8px 0 8px; + margin: -4px 0 8px; padding: 8px 16px; color: var(--text-insignificant-color); font-size: 90%; @@ -1807,13 +2003,16 @@ body > .szh-menu-container { display: flex; gap: 8px; align-items: center; - line-height: 1.1; + line-height: 1.3; padding: 8px 16px !important; /* transition: all 0.1s ease-in-out; */ text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + + --menu-item-bg-inset: 0 4px; + --menu-item-bg-color: var(--button-bg-color); } .szh-menu .szh-menu__item--focusable { background-color: transparent; @@ -1850,13 +2049,39 @@ body > .szh-menu-container { .szh-menu__item:not(.szh-menu__item--disabled, .szh-menu__item--hover) { color: var(--text-color); } +.szh-menu .szh-menu__item:not(.menu-field) { + position: relative; + & > * { + /* z-index: 1; */ + } + + &:before { + content: ''; + background-color: var(--menu-item-bg-color); + position: absolute; + inset: var(--menu-item-bg-inset); + border-radius: 4px; + z-index: -1; + opacity: 0; + } +} .szh-menu .szh-menu__item--hover:not(.menu-field) { color: var(--button-text-color); - background-color: var(--button-bg-color); + /* background-color: var(--button-bg-color); */ + background-color: transparent; + + &:before { + opacity: 1; + } } .szh-menu__divider { background-color: var(--divider-color); margin-block: 4px; + + > &:first-child, + li[role='none']:first-child + & { + display: none; + } } .szh-menu .szh-menu__item .menu-grow { flex-grow: 1; @@ -1880,12 +2105,13 @@ body > .szh-menu-container { /* two columns only */ grid-template-columns: repeat(2, 1fr); } -.szh-menu .menu-horizontal:has(> .szh-menu__item:only-child) { +.szh-menu .menu-horizontal:has(> .szh-menu__item:only-child), +.szh-menu .menu-horizontal:has(> .szh-menu__submenu:only-child) { grid-template-columns: 1fr; } .szh-menu .menu-horizontal > .szh-menu__item:not(:only-child):first-child, .szh-menu .menu-horizontal > *:not(:only-child):first-child .szh-menu__item { - padding-right: 4px !important; + padding-inline-end: 4px !important; } .szh-menu .menu-horizontal @@ -1894,12 +2120,12 @@ body > .szh-menu-container { .menu-horizontal > *:not(:only-child):not(:first-child):not(:last-child) .szh-menu__item { - padding-left: 8px !important; - padding-right: 4px !important; + padding-inline-start: 8px !important; + padding-inline-end: 4px !important; } .szh-menu .menu-horizontal > .szh-menu__item:not(:only-child):last-child, .szh-menu .menu-horizontal > *:not(:only-child):last-child .szh-menu__item { - padding-left: 8px !important; + padding-inline-start: 8px !important; } .szh-menu .szh-menu__item .menu-shortcut { opacity: 0.5; @@ -1923,11 +2149,17 @@ body > .szh-menu-container { .szh-menu__item:not(.szh-menu__item--disabled):not( .szh-menu__item--hover ).danger { - color: var(--red-color); + color: var(--red-text-color); } .szh-menu .szh-menu__item.danger:not(.szh-menu__item--disabled).szh-menu__item--hover { - background-color: var(--red-color); + /* background-color: var(--red-text-color); */ + --menu-item-bg-color: var(--red-text-color); + + @media (prefers-color-scheme: dark) { + /* background-color: var(--red-color); */ + --menu-item-bg-color: var(--red-color); + } } .szh-menu .szh-menu__item:not(.szh-menu__item--disabled):not( @@ -1959,15 +2191,27 @@ body > .szh-menu-container { text-align: center; opacity: 0.5; text-overflow: clip; - mask-image: linear-gradient(to left, transparent, black 16px); + mask-image: linear-gradient( + var(--to-backward), + transparent, + black 16px + ); } } + + &:before { + content: ''; + } + } + + .szh-menu__item--hover { + background-color: var(--menu-item-bg-color); } } .menu-control-group-horizontal:first-child, - li[aria-hidden='true'] + .menu-control-group-horizontal { - margin-top: -8px; + li[role='none'] + .menu-control-group-horizontal { + margin-top: -4px; margin-bottom: -4px; .szh-menu__item { @@ -1975,10 +2219,10 @@ body > .szh-menu-container { } > [class^='szh-menu']:first-child { - border-top-left-radius: 8px; + border-start-start-radius: 8px; } > [class^='szh-menu']:last-child { - border-top-right-radius: 8px; + border-start-end-radius: 8px; } } } @@ -2002,6 +2246,8 @@ body > .szh-menu-container { } .szh-menu .menu-wrap { + min-width: 16em; + width: min-content; display: flex; flex-wrap: wrap; } @@ -2016,79 +2262,96 @@ body > .szh-menu-container { background-color: var(--bg-blur-color); backdrop-filter: blur(8px) saturate(3); border: var(--hairline-width) solid var(--bg-color); - box-shadow: 0 3px 8px -1px var(--drop-shadow-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); + /* background-color: var(--button-bg-blur-color); */ text-shadow: none; } -/* DONUT METER */ +/* CHAR COUNTER */ -meter.donut { - appearance: none; -} - -meter.donut::-webkit-meter-inner-element, -meter.donut::-webkit-meter-bar, -meter.donut::-webkit-meter-optimum-value, -meter.donut::-webkit-meter-suboptimum-value, -meter.donut::-webkit-meter-even-less-good-value { - display: none; -} - -meter.donut::-moz-meter-bar { - background: transparent; -} - -meter.donut { - position: relative; +.char-counter { --dimension: 24px; - --border-width: 2px; - --middle-circle-radius: calc(var(--dimension) / 2 - var(--border-width)); - width: var(--dimension); - height: var(--dimension); - border-radius: 50%; - --fill: calc(var(--percentage) * 1%); - --color: var(--link-color); - --middle-circle: radial-gradient( - circle at 50% 50%, - var(--bg-color) var(--middle-circle-radius), - transparent var(--middle-circle-radius) - ); - background-image: var(--middle-circle), - conic-gradient(var(--color) var(--fill), var(--outline-color) 0); - transform: scale(0.7); - transition: transform 0.2s ease-in-out; -} -meter.donut.warning { - --color: var(--orange-color); - transform: scale(1); -} -meter.donut.danger { - --color: var(--red-color); - transform: scale(1); -} -meter.donut.explode { - background-image: none; - transform: scale(1); -} -meter.donut:is(.warning, .danger, .explode):after { - content: attr(data-left); - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - font-size: 12px; - color: var(--text-insignificant-color); -} -meter.donut:is(.danger, .explode):after { - color: var(--red-color); -} -meter.donut[hidden] { + min-width: var(--dimension); + min-height: var(--dimension); + position: relative; display: inline-block; - visibility: hidden; + + &[hidden] { + visibility: hidden; + } + + * { + pointer-events: none; + } + + meter { + appearance: none; + position: relative; + --border-width: 2px; + --middle-circle-radius: calc(var(--dimension) / 2 - var(--border-width)); + width: var(--dimension); + height: var(--dimension); + border-radius: 50%; + --fill: calc(var(--percentage) * 1%); + --color: var(--link-color); + --middle-circle: radial-gradient( + circle at 50% 50%, + var(--bg-color) var(--middle-circle-radius), + transparent var(--middle-circle-radius) + ); + background-image: var(--middle-circle), + conic-gradient(var(--color) var(--fill), var(--outline-color) 0); + transform: scale(0.7); + &:dir(rtl) { + transform: scale(-0.7, 0.7); + } + transition: transform 0.2s ease-in-out; + + &::-webkit-meter-inner-element, + &::-webkit-meter-bar, + &::-webkit-meter-optimum-value, + &::-webkit-meter-suboptimum-value, + &::-webkit-meter-even-less-good-value { + display: none; + } + + &::-moz-meter-bar { + background: transparent; + } + + &.warning { + --color: var(--orange-color); + transform: scale(1); + } + &.danger { + --color: var(--red-color); + transform: scale(1); + } + &.explode { + background-image: none; + transform: scale(1); + } + &:is(.warning, .danger, .explode) + .counter { + opacity: 1; + color: var(--text-insignificant-color); + } + &:is(.danger, .explode) + .counter { + opacity: 1; + color: var(--red-color); + } + } + + .counter { + line-height: 1; + opacity: 0; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 12px; + } } /* SHINY PILL */ @@ -2126,6 +2389,8 @@ meter.donut[hidden] { 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; + max-width: calc(100vw - 32px); } .toastify-bottom { margin-bottom: env(safe-area-inset-bottom); @@ -2200,7 +2465,7 @@ meter.donut[hidden] { } } -@supports (animation-timeline: scroll()) { +@supports ((animation-timeline: scroll()) and (animation-range: 0% 100%)) { .header-account { animation: peekaboo-header 1s linear both; animation-timeline: scroll(); @@ -2251,12 +2516,12 @@ ul.link-list li a { } } ul.link-list li:first-child a { - border-top-left-radius: var(--radius); - border-top-right-radius: var(--radius); + border-start-start-radius: var(--radius); + border-start-end-radius: var(--radius); } ul.link-list li:last-child a { - border-bottom-left-radius: var(--radius); - border-bottom-right-radius: var(--radius); + border-end-start-radius: var(--radius); + border-end-end-radius: var(--radius); } ul.link-list li a:is(:hover, :focus) { color: var(--text-color); @@ -2286,15 +2551,15 @@ ul.link-list li a .icon { filter: none !important; } .nav-menu-button .avatar { - transition: box-shadow 0.3s ease-out; + 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-light-color); + 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; - bottom: 4px; - right: 8px; + inset-block-end: 4px; + inset-inline-end: 8px; background-color: var(--bg-color); border-radius: 2px; } @@ -2305,10 +2570,11 @@ ul.link-list li a .icon { /* COLUMNS */ #columns { + --column-size: 360px; display: flex; width: 100vw; overflow-y: hidden; - overflow-x: scroll; + overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; /* scrollbar-width: none; */ @@ -2316,19 +2582,28 @@ ul.link-list li a .icon { overscroll-behavior-x: contain; /* This `transform` fixes horizontal scrolling for pointer devices on iPad */ transform: translateZ(0); + + /* 360px * 2 */ + @media (min-width: 720px) { + scroll-snap-type: none; + } } /* #columns::-webkit-scrollbar { display: none; } */ #columns > * { overscroll-behavior: auto; - scroll-snap-align: left; + scroll-snap-align: start; scroll-snap-stop: always; overscroll-behavior: auto; - flex-basis: min(100vw, 360px); + flex-basis: min(100vw, var(--column-size)); flex-shrink: 0; 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), + 3px 0 var(--bg-color); + } } #columns:has(> :nth-child(3)) > *:nth-child(even), #columns:has(> :nth-child(3)) @@ -2341,6 +2616,17 @@ ul.link-list li a .icon { #columns > .deck-container > .timeline-deck { content-visibility: auto; } +#columns > .deck-container { + &:first-child:not(:only-child) > .deck { + margin-inline-start: auto; + margin-inline-end: 0; + } + + &:last-child:not(:only-child) > .deck { + margin-inline-end: auto; + margin-inline-start: 0; + } +} #columns .header-grid input { pointer-events: none; } @@ -2369,6 +2655,15 @@ ul.link-list li a .icon { } #columns > * { padding: 0 16px; + + &:is(#notifications-page) { + padding-inline: 0; + + .timeline-deck > header { + margin-inline: 16px; + } + } + border-inline: var(--hairline-width) solid var(--bg-faded-color); /* border-radius: 16px; */ /* box-shadow: -4px 0 16px -8px var(--drop-shadow-color); */ @@ -2461,7 +2756,7 @@ ul.link-list li a .icon { gap: 8px; overflow-x: auto; mask-image: linear-gradient( - to right, + var(--to-forward), transparent, black 16px, black calc(100% - 16px), @@ -2475,6 +2770,9 @@ ul.link-list li a .icon { width: 95vw; max-width: calc(320px * 3.3); transform: translateX(calc(-50% + var(--main-width) / 2)); + &:dir(rtl) { + transform: translateX(calc(50% - var(--main-width) / 2)); + } } } @@ -2593,7 +2891,8 @@ ul.link-list li a .icon { min-width: 16px; min-height: 16px; padding: 4px; - margin: -4px -8px -4px 0; + margin: -4px 0; + margin-inline-end: -8px; background-color: var(--bg-faded-color); border-radius: 999px; } @@ -2623,11 +2922,14 @@ ul.link-list li a .icon { .deck-container:has(~ .deck-backdrop .deck) { transition: transform 0.4s ease-out; transform: translate3d(-5vw, 0, 0); + &:dir(rtl) { + transform: translate3d(5vw, 0, 0); + } } .deck-backdrop .deck { /* width: 50%; min-width: var(--main-width); */ - border-left: 1px solid var(--divider-color); + border-inline-start: 1px solid var(--divider-color); } .timeline-deck { border: 0; @@ -2673,6 +2975,10 @@ ul.link-list li a .icon { box-shadow: 0px 1px var(--bg-blur-color); transition: transform 0.4s var(--timing-function); --back-transition: transform 0.4s ease-out; + + &:is(:empty, :has(> a:empty)) { + display: none; + } } .timeline:not(.flat) > li > a { border-radius: inherit; @@ -2684,16 +2990,19 @@ ul.link-list li a .icon { > li:not(.timeline-item-container-end, .timeline-item-container-middle):has( .status-badge:not(:empty) ) { - border-top-right-radius: 8px; + border-start-end-radius: 8px; } .timeline:not(.flat) > li:has(.status-link.is-active) { transition: var(--back-transition); transform: translate3d(-2.5vw, 0, 0); + &:dir(rtl) { + transform: translate3d(2.5vw, 0, 0); + } } .timeline:not(.flat) > li.timeline-item-container:has(.status-link.is-active) { - border-top-left-radius: var(--item-radius); - border-bottom-left-radius: var(--item-radius); + border-start-start-radius: var(--item-radius); + border-end-start-radius: var(--item-radius); } .timeline:not(.flat) > li:not(:has(.status-carousel)):has(+ li .status-link.is-active), @@ -2702,19 +3011,22 @@ ul.link-list li a .icon { + li { transition: var(--back-transition); transform: translate3d(-1.25vw, 0, 0); + &:dir(rtl) { + transform: translate3d(1.25vw, 0, 0); + } } .timeline:not(.flat) > li.timeline-item-container:not(:has(.status-carousel)):has( + li .status-link.is-active ) { - border-top-left-radius: var(--item-radius); + border-start-start-radius: var(--item-radius); } .timeline:not(.flat) > li.timeline-item-container:not(:has(.status-carousel)):has( .status-link.is-active ) + li.timeline-item-container { - border-bottom-left-radius: var(--item-radius); + border-end-start-radius: var(--item-radius); } .box { padding: 32px; @@ -2726,5 +3038,42 @@ ul.link-list li a .icon { width: 95vw; max-width: calc(320px * 3.3); transform: translateX(calc(-50% + var(--main-width) / 2)); + &:dir(rtl) { + transform: translateX(calc(50% - var(--main-width) / 2)); + } + } +} + +/* LANG SELECTOR */ + +.lang-selector { + display: inline-flex; + gap: 4px; + align-items: center; + + select { + width: 10em; + } +} + +/* DEBUG */ + +.debug-info { + font-size: smaller; + summary { + height: 1em; + width: 100%; + list-style: none; + display: inline-block; + } + summary::-webkit-details-marker { + display: none; + } + + p, + ol, + ul { + margin-block-start: 0; + padding-block-start: 0; } } diff --git a/src/app.jsx b/src/app.jsx index 8e39b0e0..d8acfdb9 100644 --- a/src/app.jsx +++ b/src/app.jsx @@ -1,7 +1,8 @@ import './app.css'; +import { useLingui } from '@lingui/react'; import debounce from 'just-debounce-it'; -import { lazy, Suspense } from 'preact/compat'; +import { memo } from 'preact/compat'; import { useEffect, useLayoutEffect, @@ -10,7 +11,9 @@ import { useState, } from 'preact/hooks'; import { matchPath, Route, Routes, useLocation } from 'react-router-dom'; + import 'swiped-events'; + import { subscribe } from 'valtio'; import BackgroundService from './components/background-service'; @@ -18,15 +21,17 @@ import ComposeButton from './components/compose-button'; import { ICONS } from './components/ICONS'; import KeyboardShortcutsHelp from './components/keyboard-shortcuts-help'; import Loader from './components/loader'; -// import Modals from './components/modals'; +import Modals from './components/modals'; import NotificationService from './components/notification-service'; import SearchCommand from './components/search-command'; import Shortcuts from './components/shortcuts'; import NotFound from './pages/404'; import AccountStatuses from './pages/account-statuses'; +import AnnualReport from './pages/annual-report'; import Bookmarks from './pages/bookmarks'; -// import Catchup from './pages/catchup'; +import Catchup from './pages/catchup'; import Favourites from './pages/favourites'; +import Filters from './pages/filters'; import FollowedHashtags from './pages/followed-hashtags'; import Following from './pages/following'; import Hashtag from './pages/hashtag'; @@ -44,6 +49,8 @@ import Trending from './pages/trending'; import Welcome from './pages/welcome'; import { api, + hasInstance, + hasPreferences, initAccount, initClient, initInstance, @@ -53,11 +60,13 @@ import { getAccessToken } from './utils/auth'; import focusDeck from './utils/focus-deck'; import states, { initStates, statusKey } from './utils/states'; import store from './utils/store'; -import { getCurrentAccount } from './utils/store-utils'; -import './utils/toast-alert'; +import { + getAccount, + getCurrentAccount, + setCurrentAccountID, +} from './utils/store-utils'; -const Catchup = lazy(() => import('./pages/catchup')); -const Modals = lazy(() => import('./components/modals')); +import './utils/toast-alert'; window.__STATES__ = states; window.__STATES_STATS__ = () => { @@ -90,52 +99,57 @@ window.__STATES_STATS__ = () => { // Experimental "garbage collection" for states // Every 15 minutes // Only posts for now -setInterval(() => { - if (!window.__IDLE__) return; - const { statuses, unfurledLinks, notifications } = states; - let keysCount = 0; - const { instance } = api(); - for (const key in statuses) { - if (!window.__IDLE__) break; - try { - const $post = document.querySelector( - `[data-state-post-id~="${key}"], [data-state-post-ids~="${key}"]`, - ); - const postInNotifications = notifications.some( - (n) => key === statusKey(n.status?.id, instance), - ); - if (!$post && !postInNotifications) { - delete states.statuses[key]; - delete states.statusQuotes[key]; - for (const link in unfurledLinks) { - const unfurled = unfurledLinks[link]; - const sKey = statusKey(unfurled.id, unfurled.instance); - if (sKey === key) { - delete states.unfurledLinks[link]; - break; +setInterval( + () => { + if (!window.__IDLE__) return; + const { statuses, unfurledLinks, notifications } = states; + let keysCount = 0; + const { instance } = api(); + for (const key in statuses) { + if (!window.__IDLE__) break; + try { + const $post = document.querySelector( + `[data-state-post-id~="${key}"], [data-state-post-ids~="${key}"]`, + ); + const postInNotifications = notifications.some( + (n) => key === statusKey(n.status?.id, instance), + ); + if (!$post && !postInNotifications) { + delete states.statuses[key]; + delete states.statusQuotes[key]; + for (const link in unfurledLinks) { + const unfurled = unfurledLinks[link]; + const sKey = statusKey(unfurled.id, unfurled.instance); + if (sKey === key) { + delete states.unfurledLinks[link]; + break; + } } + keysCount++; } - keysCount++; - } - } catch (e) {} - } - if (keysCount) { - console.info(`GC: Removed ${keysCount} keys`); - } -}, 15 * 60 * 1000); + } catch (e) {} + } + if (keysCount) { + console.info(`GC: Removed ${keysCount} keys`); + } + }, + 15 * 60 * 1000, +); // Preload icons // There's probably a better way to do this // Related: https://github.com/vitejs/vite/issues/10600 setTimeout(() => { for (const icon in ICONS) { - queueMicrotask(() => { + setTimeout(() => { if (Array.isArray(ICONS[icon])) { ICONS[icon][0]?.(); + } else if (typeof ICONS[icon] === 'object') { + ICONS[icon].module?.(); } else { ICONS[icon]?.(); } - }); + }, 1); } }, 5000); @@ -200,6 +214,12 @@ const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent); if (isIOS) { document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'visible') { + // Don't reset theme color if media modal is showing + // Media modal will set its own theme color based on the media's color + const showingMediaModal = + document.getElementsByClassName('media-modal-container').length > 0; + if (showingMediaModal) return; + const theme = store.local.get('theme'); let $meta; if (theme) { @@ -294,9 +314,36 @@ subscribe(states, (changes) => { } }); +const BENCHES = new Map(); +window.__BENCH_RESULTS = new Map(); +window.__BENCHMARK = { + start(name) { + if (!import.meta.env.DEV && !import.meta.env.PHANPY_DEV) return; + // If already started, ignore + if (BENCHES.has(name)) return; + const start = performance.now(); + BENCHES.set(name, start); + }, + end(name) { + if (!import.meta.env.DEV && !import.meta.env.PHANPY_DEV) return; + const start = BENCHES.get(name); + if (start) { + const end = performance.now(); + const duration = end - start; + __BENCH_RESULTS.set(name, duration); + BENCHES.delete(name); + } + }, +}; + function App() { const [isLoggedIn, setIsLoggedIn] = useState(false); const [uiState, setUIState] = useState('loading'); + __BENCHMARK.start('app-init'); + __BENCHMARK.start('time-to-following'); + __BENCHMARK.start('time-to-home'); + __BENCHMARK.start('time-to-isLoggedIn'); + useLingui(); useEffect(() => { const instanceURL = store.local.get('instanceURL'); @@ -313,9 +360,10 @@ function App() { window.location.pathname || '/', ); - const clientID = store.session.get('clientID'); - const clientSecret = store.session.get('clientSecret'); - const vapidKey = store.session.get('vapidKey'); + const clientID = store.sessionCookie.get('clientID'); + const clientSecret = store.sessionCookie.get('clientSecret'); + const vapidKey = store.sessionCookie.get('vapidKey'); + const verifier = store.sessionCookie.get('codeVerifier'); (async () => { setUIState('loading'); @@ -324,43 +372,83 @@ function App() { client_id: clientID, client_secret: clientSecret, code, + code_verifier: verifier || undefined, }); - const client = initClient({ instance: instanceURL, accessToken }); - await Promise.allSettled([ - initInstance(client, instanceURL), - initAccount(client, instanceURL, accessToken, vapidKey), - ]); - initStates(); - initPreferences(client); + if (accessToken) { + const client = initClient({ instance: instanceURL, accessToken }); + await Promise.allSettled([ + initPreferences(client), + initInstance(client, instanceURL), + initAccount(client, instanceURL, accessToken, vapidKey), + ]); + initStates(); + window.__IGNORE_GET_ACCOUNT_ERROR__ = true; - setIsLoggedIn(true); - setUIState('default'); + setIsLoggedIn(true); + setUIState('default'); + } else { + setUIState('error'); + } + __BENCHMARK.end('app-init'); })(); } else { window.__IGNORE_GET_ACCOUNT_ERROR__ = true; - const account = getCurrentAccount(); + const searchAccount = decodeURIComponent( + (window.location.search.match(/account=([^&]+)/) || [, ''])[1], + ); + let account; + if (searchAccount) { + account = getAccount(searchAccount); + console.log('searchAccount', searchAccount, account); + if (account) { + setCurrentAccountID(account.info.id); + window.history.replaceState( + {}, + document.title, + window.location.pathname || '/', + ); + } + } + if (!account) { + account = getCurrentAccount(); + } if (account) { - store.session.set('currentAccount', account.info.id); + setCurrentAccountID(account.info.id); const { client } = api({ account }); const { instance } = client; // console.log('masto', masto); initStates(); - initPreferences(client); setUIState('loading'); (async () => { try { - await initInstance(client, instance); + if (hasPreferences() && hasInstance(instance)) { + // Non-blocking + initPreferences(client); + initInstance(client, instance); + } else { + await Promise.allSettled([ + initPreferences(client), + initInstance(client, instance), + ]); + } } catch (e) { } finally { setIsLoggedIn(true); setUIState('default'); + __BENCHMARK.end('app-init'); } })(); } else { setUIState('default'); + __BENCHMARK.end('app-init'); } } + + // Cleanup + store.sessionCookie.del('clientID'); + store.sessionCookie.del('clientSecret'); + store.sessionCookie.del('codeVerifier'); }, []); let location = useLocation(); @@ -375,29 +463,36 @@ function App() { return <HttpRoute />; } + if (uiState === 'loading') { + return <Loader id="loader-root" />; + } + return ( <> - <PrimaryRoutes isLoggedIn={isLoggedIn} loading={uiState === 'loading'} /> + <PrimaryRoutes isLoggedIn={isLoggedIn} /> <SecondaryRoutes isLoggedIn={isLoggedIn} /> - {uiState === 'default' && ( - <Routes> - <Route path="/:instance?/s/:id" element={<StatusRoute />} /> - </Routes> - )} + <Routes> + <Route path="/:instance?/s/:id" element={<StatusRoute />} /> + </Routes> {isLoggedIn && <ComposeButton />} {isLoggedIn && <Shortcuts />} - <Suspense> - <Modals /> - </Suspense> + <Modals /> {isLoggedIn && <NotificationService />} <BackgroundService isLoggedIn={isLoggedIn} /> - {uiState !== 'loading' && <SearchCommand onClose={focusDeck} />} + <SearchCommand onClose={focusDeck} /> <KeyboardShortcutsHelp /> </> ); } -function PrimaryRoutes({ isLoggedIn, loading }) { +function Root({ isLoggedIn }) { + if (isLoggedIn) { + __BENCHMARK.end('time-to-isLoggedIn'); + } + return isLoggedIn ? <Home /> : <Welcome />; +} + +const PrimaryRoutes = memo(({ isLoggedIn }) => { const location = useLocation(); const nonRootLocation = useMemo(() => { const { pathname } = location; @@ -406,23 +501,12 @@ function PrimaryRoutes({ isLoggedIn, loading }) { return ( <Routes location={nonRootLocation || location}> - <Route - path="/" - element={ - isLoggedIn ? ( - <Home /> - ) : loading ? ( - <Loader id="loader-root" /> - ) : ( - <Welcome /> - ) - } - /> + <Route path="/" element={<Root isLoggedIn={isLoggedIn} />} /> <Route path="/login" element={<Login />} /> <Route path="/welcome" element={<Welcome />} /> </Routes> ); -} +}); function getPrevLocation() { return states.prevLocation || null; @@ -463,15 +547,10 @@ function SecondaryRoutes({ isLoggedIn }) { <Route index element={<Lists />} /> <Route path=":id" element={<List />} /> </Route> - <Route path="/ft" element={<FollowedHashtags />} /> - <Route - path="/catchup" - element={ - <Suspense> - <Catchup /> - </Suspense> - } - /> + <Route path="/fh" element={<FollowedHashtags />} /> + <Route path="/ft" element={<Filters />} /> + <Route path="/catchup" element={<Catchup />} /> + <Route path="/annual_report/:year" element={<AnnualReport />} /> </> )} <Route path="/:instance?/t/:hashtag" element={<Hashtag />} /> diff --git a/src/assets/powered-by-giphy.svg b/src/assets/powered-by-giphy.svg new file mode 100644 index 00000000..b7b77c54 --- /dev/null +++ b/src/assets/powered-by-giphy.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" version="1.0" viewBox="0 0 641 223"> + <path fill="#aaa" d="M86 214c-9-1-17-4-24-8l-6-3-5-5-5-4-4-6-4-6-3-8-2-8v-27l2-9 3-9 4-6 4-6 5-5 5-5 7-3 6-4 7-2 7-2 12-1h12l7 1 8 2 7 4 7 3 5 5 5 4-10 10-10 9-4-3-10-5-5-1H88l-5 2-6 3-3 4-4 4-2 5-2 6v6l-1 7 1 7 2 7 3 5 2 4 4 3 4 3 5 2 6 2h9l10-1 5-2 6-3v-16H91v-27h59v54l-1 3-2 3-5 4-4 4-5 3-5 2-8 2-8 2-10 1H92l-6-1zm266-62V91h34v46h44V91h34v121h-34v-46h-44v46h-34v-61zm-182-1V90h34v121h-34v-60zm59-1V90h35l36 1 5 2c3 0 8 2 10 4l5 2 4 5 5 4 3 7 3 7 1 13v13l-4 6-3 7-4 4-5 5-5 2-5 3-6 2-5 1-18 1h-18v32h-34v-61zm67-2 3-2 2-4 2-5v-5l-2-4-2-4-3-2-3-3h-30v31h30l3-2zm226 39v-24l-8-12-18-28a1751 1751 0 0 0-20-31v-2h39l7 12 12 21 6 9 13-21 13-21h38v2l-41 61-7 10v48h-34v-24zM109 66l-4-1-5-5-5-4-1-5-3-9v-5l1-5c2-7 3-10 8-15l4-4 7-2 7-2h7l6 1 5 2 5 2 3 4 4 3 2 6 2 5v13l-2 5-2 6-4 4-3 3-5 2-4 2-9 1h-9l-5-2zm22-11 4-2 3-4 2-5V34l-2-4-2-4-3-2-4-3-5-1h-6l-4 2-5 2-2 4-3 5-1 3v4l1 5 2 5 2 2 5 3 4 2h10l4-2zM37 39V11h33l3 1 3 2 4 3 3 3 1 5 1 4v5l-1 4-3 4-3 5-4 1-3 2-11 1H49v16H37V39zm31 0 3-2 1-2 1-2v-4l-1-3-3-2-2-2H49v18h15l4-1zm107 25a512 512 0 0 0-19-53h14l4 14 6 19 1 4 1-1 7-19 5-17h9l6 19 7 18v-1l2-6 5-17 4-13h14v1l-4 12-16 41v2h-5l-5-1-6-15-6-15-1 1-3 7-6 15-2 8h-11l-1-3zm74-25V11h42v11h-29v2l-1 5v4h29v11h-28v11h2l15 1h13v11h-43V39zm55 0V11h33l5 3 5 2 2 4 2 5v10l-2 3-1 4-5 3-5 3 5 5 8 10 3 4h-14l-7-9-8-10h-9v19h-12V39zm33-3 2-3v-6l-3-3-2-3h-18v16h1v1h17l2-2zm26 3V11h42v11h-29l-1 6v5h29v11h-28v5l-1 5 1 1v1h30v11h-43V39zm54 0V11h17l18 1 4 2 5 3 2 4 3 4 2 6 1 6v5c-1 6-3 12-6 15l-3 4-5 3-5 2-17 1h-16V39zm33 14 5-5 2-3v-6l-1-6-1-3-1-3-4-3-3-2h-5l-6-1-3 1h-3v34h9l8-1 3-2zm50-14V11h34l5 2 4 2 2 3 2 3v9l-2 2-3 4-1 1 3 3 3 4 1 3 1 4-1 4-1 4-3 3-3 3-5 1-5 1h-31V39zm34 15 2-1v-6l-2-2-2-2h-20v13h20l2-2zm-3-22 4-2v-6l-2-1-2-2h-19v12h16l4-1zm42 24V45l-6-9-11-17-5-8h15l4 8 7 11 2 3 7-11 7-11h14l-11 16-11 17v23h-12V56z"/> +</svg> diff --git a/src/cloak-mode.css b/src/cloak-mode.css index b0d0f757..2b9a0b0b 100644 --- a/src/cloak-mode.css +++ b/src/cloak-mode.css @@ -9,13 +9,17 @@ body.cloak, .status .content-container, .status .content-container *, .status .content-compact > *, + .account-container .actions small, .account-container :is(header, main > *:not(.actions)), .account-container :is(header, main > *:not(.actions)) *, - .header-double-lines, + .header-double-lines *, .account-block, .catchup-filters .filter-author *, .post-peek-html *, - .post-peek-content > * { + .post-peek-content > *, + .request-notifications-account *, + .status.compact-thread *, + .status .content-compact { text-decoration-thickness: 1.1em; text-decoration-line: line-through; /* text-rendering: optimizeSpeed; */ @@ -49,9 +53,19 @@ body.cloak, body.cloak, .cloak { + .header-double-lines *, + .account-container .profile-metadata b, + .account-container .actions small, + .account-container .stats *, .media-container figcaption, .media-container figcaption > *, - .catchup-filters .filter-author * { + .catchup-filters .filter-author *, + .request-notifications-account * { color: var(--text-color) !important; } + + .account-container .actions small, + .status .content-compact { + background-color: currentColor !important; + } } diff --git a/src/components/ICONS.jsx b/src/components/ICONS.jsx index c05f5bdf..cac8190b 100644 --- a/src/components/ICONS.jsx +++ b/src/components/ICONS.jsx @@ -6,8 +6,14 @@ export const ICONS = { 'x-circle': () => import('@iconify-icons/mingcute/close-circle-line'), transfer: () => import('@iconify-icons/mingcute/transfer-4-line'), rocket: () => import('@iconify-icons/mingcute/rocket-line'), - 'arrow-left': () => import('@iconify-icons/mingcute/arrow-left-line'), - 'arrow-right': () => import('@iconify-icons/mingcute/arrow-right-line'), + 'arrow-left': { + module: () => import('@iconify-icons/mingcute/arrow-left-line'), + rtl: true, + }, + 'arrow-right': { + module: () => import('@iconify-icons/mingcute/arrow-right-line'), + rtl: true, + }, 'arrow-up': () => import('@iconify-icons/mingcute/arrow-up-line'), 'arrow-down': () => import('@iconify-icons/mingcute/arrow-down-line'), earth: () => import('@iconify-icons/mingcute/earth-line'), @@ -16,8 +22,14 @@ export const ICONS = { 'eye-close': () => import('@iconify-icons/mingcute/eye-close-line'), 'eye-open': () => import('@iconify-icons/mingcute/eye-2-line'), message: () => import('@iconify-icons/mingcute/mail-line'), - comment: () => import('@iconify-icons/mingcute/chat-3-line'), - comment2: () => import('@iconify-icons/mingcute/comment-2-line'), + comment: { + module: () => import('@iconify-icons/mingcute/chat-3-line'), + rtl: true, + }, + comment2: { + module: () => import('@iconify-icons/mingcute/comment-2-line'), + rtl: true, + }, home: () => import('@iconify-icons/mingcute/home-3-line'), notification: () => import('@iconify-icons/mingcute/notification-line'), follow: () => import('@iconify-icons/mingcute/user-follow-line'), @@ -31,23 +43,46 @@ export const ICONS = { gear: () => import('@iconify-icons/mingcute/settings-3-line'), more: () => import('@iconify-icons/mingcute/more-3-line'), more2: () => import('@iconify-icons/mingcute/more-1-fill'), - external: () => import('@iconify-icons/mingcute/external-link-line'), - popout: () => import('@iconify-icons/mingcute/external-link-line'), - popin: [() => import('@iconify-icons/mingcute/external-link-line'), '180deg'], + external: { + module: () => import('@iconify-icons/mingcute/external-link-line'), + rtl: true, + }, + popout: { + module: () => import('@iconify-icons/mingcute/external-link-line'), + rtl: true, + }, + popin: { + module: () => import('@iconify-icons/mingcute/external-link-line'), + rotate: '180deg', + rtl: true, + }, plus: () => import('@iconify-icons/mingcute/add-circle-line'), - 'chevron-left': () => import('@iconify-icons/mingcute/left-line'), - 'chevron-right': () => import('@iconify-icons/mingcute/right-line'), + 'chevron-left': { + module: () => import('@iconify-icons/mingcute/left-line'), + rtl: true, + }, + 'chevron-right': { + module: () => import('@iconify-icons/mingcute/right-line'), + rtl: true, + }, 'chevron-down': () => import('@iconify-icons/mingcute/down-line'), - reply: [ - () => import('@iconify-icons/mingcute/share-forward-line'), - '180deg', - 'horizontal', - ], + reply: { + module: () => import('@iconify-icons/mingcute/share-forward-line'), + rotate: '180deg', + flip: 'horizontal', + rtl: true, + }, thread: () => import('@iconify-icons/mingcute/route-line'), - group: () => import('@iconify-icons/mingcute/group-line'), + group: { + module: () => import('@iconify-icons/mingcute/group-line'), + rtl: true, + }, bot: () => import('@iconify-icons/mingcute/android-2-line'), menu: () => import('@iconify-icons/mingcute/rows-4-line'), - list: () => import('@iconify-icons/mingcute/list-check-line'), + list: { + module: () => import('@iconify-icons/mingcute/list-check-line'), + rtl: true, + }, search: () => import('@iconify-icons/mingcute/search-2-line'), hashtag: () => import('@iconify-icons/mingcute/hashtag-line'), info: () => import('@iconify-icons/mingcute/information-line'), @@ -62,12 +97,21 @@ export const ICONS = { share: () => import('@iconify-icons/mingcute/share-2-line'), sparkles: () => import('@iconify-icons/mingcute/sparkles-line'), sparkles2: () => import('@iconify-icons/mingcute/sparkles-2-line'), - exit: () => import('@iconify-icons/mingcute/exit-line'), + exit: { + module: () => import('@iconify-icons/mingcute/exit-line'), + rtl: true, + }, translate: () => import('@iconify-icons/mingcute/translate-line'), play: () => import('@iconify-icons/mingcute/play-fill'), trash: () => import('@iconify-icons/mingcute/delete-2-line'), - mute: () => import('@iconify-icons/mingcute/volume-mute-line'), - unmute: () => import('@iconify-icons/mingcute/volume-line'), + mute: { + module: () => import('@iconify-icons/mingcute/volume-mute-line'), + rtl: true, + }, + unmute: { + module: () => import('@iconify-icons/mingcute/volume-line'), + rtl: true, + }, block: () => import('@iconify-icons/mingcute/forbid-circle-line'), unblock: [ () => import('@iconify-icons/mingcute/forbid-circle-line'), @@ -78,30 +122,56 @@ export const ICONS = { refresh: () => import('@iconify-icons/mingcute/refresh-2-line'), emoji2: () => import('@iconify-icons/mingcute/emoji-2-line'), filter: () => import('@iconify-icons/mingcute/filter-2-line'), + filters: () => import('@iconify-icons/mingcute/filter-line'), chart: () => import('@iconify-icons/mingcute/chart-line-line'), react: () => import('@iconify-icons/mingcute/react-line'), - layout4: () => import('@iconify-icons/mingcute/layout-4-line'), + layout4: { + module: () => import('@iconify-icons/mingcute/layout-4-line'), + rtl: true, + }, layout5: () => import('@iconify-icons/mingcute/layout-5-line'), - announce: () => import('@iconify-icons/mingcute/announcement-line'), + announce: { + module: () => import('@iconify-icons/mingcute/announcement-line'), + rtl: true, + }, alert: () => import('@iconify-icons/mingcute/alert-line'), round: () => import('@iconify-icons/mingcute/round-fill'), 'arrow-up-circle': () => import('@iconify-icons/mingcute/arrow-up-circle-line'), 'arrow-down-circle': () => import('@iconify-icons/mingcute/arrow-down-circle-line'), - clipboard: () => import('@iconify-icons/mingcute/clipboard-line'), + clipboard: { + module: () => import('@iconify-icons/mingcute/clipboard-line'), + rtl: true, + }, 'account-edit': () => import('@iconify-icons/mingcute/user-edit-line'), 'account-warning': () => import('@iconify-icons/mingcute/user-warning-line'), keyboard: () => import('@iconify-icons/mingcute/keyboard-line'), cloud: () => import('@iconify-icons/mingcute/cloud-line'), - month: () => import('@iconify-icons/mingcute/calendar-month-line'), + month: { + module: () => import('@iconify-icons/mingcute/calendar-month-line'), + rtl: true, + }, media: () => import('@iconify-icons/mingcute/photo-album-line'), speak: () => import('@iconify-icons/mingcute/radar-line'), building: () => import('@iconify-icons/mingcute/building-5-line'), - history2: () => import('@iconify-icons/mingcute/history-2-line'), + history2: { + module: () => import('@iconify-icons/mingcute/history-2-line'), + rtl: true, + }, document: () => import('@iconify-icons/mingcute/document-line'), - 'arrows-right': () => import('@iconify-icons/mingcute/arrows-right-line'), + 'arrows-right': { + module: () => import('@iconify-icons/mingcute/arrows-right-line'), + rtl: true, + }, code: () => import('@iconify-icons/mingcute/code-line'), copy: () => import('@iconify-icons/mingcute/copy-2-line'), - quote: () => import('@iconify-icons/mingcute/quote-left-line'), + quote: { + module: () => import('@iconify-icons/mingcute/quote-left-line'), + rtl: true, + }, + settings: () => import('@iconify-icons/mingcute/settings-6-line'), + 'heart-break': () => import('@iconify-icons/mingcute/heart-crack-line'), + 'user-x': () => import('@iconify-icons/mingcute/user-x-line'), + minimize: () => import('@iconify-icons/mingcute/arrows-down-line'), }; diff --git a/src/components/account-block.css b/src/components/account-block.css index 14309fb9..890e4968 100644 --- a/src/components/account-block.css +++ b/src/components/account-block.css @@ -29,6 +29,8 @@ line-clamp: 1; text-overflow: ellipsis; overflow: hidden; + unicode-bidi: isolate; + direction: initial; } a { diff --git a/src/components/account-block.jsx b/src/components/account-block.jsx index 47c15774..0d1f2faa 100644 --- a/src/components/account-block.jsx +++ b/src/components/account-block.jsx @@ -1,5 +1,7 @@ import './account-block.css'; +import { Plural, t, Trans } from '@lingui/macro'; + // import { useNavigate } from 'react-router-dom'; import enhanceContent from '../utils/enhance-content'; import niceDateTime from '../utils/nice-date-time'; @@ -33,7 +35,7 @@ function AccountBlock({ <span> <b>████████</b> <br /> - <span class="account-block-acct">@██████</span> + <span class="account-block-acct">██████</span> </span> </div> ); @@ -87,7 +89,7 @@ function AccountBlock({ class="account-block" href={url} target={external ? '_blank' : null} - title={`@${acct}`} + title={acct2 ? acct : `@${acct}`} onClick={(e) => { if (external) return; e.preventDefault(); @@ -103,11 +105,13 @@ function AccountBlock({ } }} > - <Avatar - url={useAvatarStatic ? avatarStatic : avatar || avatarStatic} - size={avatarSize} - squircle={bot} - /> + <div class="avatar-container"> + <Avatar + url={useAvatarStatic ? avatarStatic : avatar || avatarStatic} + size={avatarSize} + squircle={bot} + /> + </div> <span class="account-block-content"> {!hideDisplayName && ( <> @@ -120,47 +124,48 @@ function AccountBlock({ )} </> )}{' '} - <span class="account-block-acct"> - @{acct1} + <span class="account-block-acct bidi-isolate"> + {acct2 ? '' : '@'} + {acct1} <wbr /> {acct2} {locked && ( <> {' '} - <Icon icon="lock" size="s" alt="Locked" /> + <Icon icon="lock" size="s" alt={t`Locked`} /> </> )} </span> {showActivity && ( - <> - <br /> - <small class="last-status-at insignificant"> - Posts: {statusesCount} - {!!lastStatusAt && ( - <> - {' '} - · Last posted:{' '} + <div class="account-block-stats"> + <Trans>Posts: {shortenNumber(statusesCount)}</Trans> + {!!lastStatusAt && ( + <> + {' '} + ·{' '} + <Trans> + Last posted:{' '} {niceDateTime(lastStatusAt, { hideTime: true, })} - </> - )} - </small> - </> + </Trans> + </> + )} + </div> )} {showStats && ( <div class="account-block-stats"> {bot && ( <> <span class="tag collapsed"> - <Icon icon="bot" /> Automated + <Icon icon="bot" /> <Trans>Automated</Trans> </span> </> )} {!!group && ( <> <span class="tag collapsed"> - <Icon icon="group" /> Group + <Icon icon="group" /> <Trans>Group</Trans> </span> </> )} @@ -169,26 +174,37 @@ function AccountBlock({ <div class="shazam-container-inner"> {excludedRelationship.following && excludedRelationship.followedBy ? ( - <span class="tag minimal">Mutual</span> + <span class="tag minimal"> + <Trans>Mutual</Trans> + </span> ) : excludedRelationship.requested ? ( - <span class="tag minimal">Requested</span> + <span class="tag minimal"> + <Trans>Requested</Trans> + </span> ) : excludedRelationship.following ? ( - <span class="tag minimal">Following</span> + <span class="tag minimal"> + <Trans>Following</Trans> + </span> ) : excludedRelationship.followedBy ? ( - <span class="tag minimal">Follows you</span> + <span class="tag minimal"> + <Trans>Follows you</Trans> + </span> ) : null} </div> </div> )} {!!followersCount && ( <span class="ib"> - {shortenNumber(followersCount)}{' '} - {followersCount === 1 ? 'follower' : 'followers'} + <Plural + value={followersCount} + one="# follower" + other="# followers" + /> </span> )} {!!verifiedField && ( <span class="verified-field"> - <Icon icon="check-circle" size="s" />{' '} + <Icon icon="check-circle" size="s" alt={t`Verified`} />{' '} <span dangerouslySetInnerHTML={{ __html: enhanceContent(verifiedField.value, { emojis }), @@ -203,12 +219,14 @@ function AccountBlock({ !verifiedField && !!createdAt && ( <span class="created-at"> - Joined{' '} - <time datetime={createdAt}> - {niceDateTime(createdAt, { - hideTime: true, - })} - </time> + <Trans> + Joined{' '} + <time datetime={createdAt}> + {niceDateTime(createdAt, { + hideTime: true, + })} + </time> + </Trans> </span> )} </div> diff --git a/src/components/account-info.css b/src/components/account-info.css index 8811c652..1c8f34c6 100644 --- a/src/components/account-info.css +++ b/src/components/account-info.css @@ -57,7 +57,7 @@ background-repeat: no-repeat; animation: swoosh-bg-image 0.3s ease-in-out 0.3s both; background-image: linear-gradient( - to right, + var(--to-forward), var(--original-color) 0%, var(--original-color) calc(var(--originals-percentage) - var(--gap)), var(--gap-color) calc(var(--originals-percentage) - var(--gap)), @@ -181,8 +181,8 @@ opacity: 1; } .sheet .account-container .header-banner { - border-top-left-radius: 16px; - border-top-right-radius: 16px; + border-start-start-radius: 16px; + border-start-end-radius: 16px; } .account-container .header-banner.header-is-avatar { mask-image: linear-gradient( @@ -217,13 +217,13 @@ background-image: none; } - & + header .avatar + * { + & + header .avatar-container + * { transition: opacity 0.3s ease-in-out; opacity: 0 !important; } &, - & + header .avatar { + & + header .avatar-container { transition: filter 0.3s ease-in-out; filter: none !important; } @@ -250,16 +250,21 @@ -8px 0 24px var(--header-color-3, --bg-color), 8px 0 24px var(--header-color-4, --bg-color); animation: fade-in 0.3s both ease-in-out 0.1s; -} -.account-container header .avatar { - /* box-shadow: -8px 0 24px var(--header-color-3, --bg-color), + + .avatar-container { + filter: drop-shadow(-2px 0 4px var(--header-color-3, --bg-color)) + drop-shadow(2px 0 4px var(--header-color-4, --bg-color)); + } + + .avatar { + /* box-shadow: -8px 0 24px var(--header-color-3, --bg-color), 8px 0 24px var(--header-color-4, --bg-color); */ - overflow: initial; - filter: drop-shadow(-2px 0 4px var(--header-color-3, --bg-color)) - drop-shadow(2px 0 4px var(--header-color-4, --bg-color)); -} -.account-container header .avatar:not(.has-alpha) img { - border-radius: inherit; + /* overflow: initial; */ + + &:not(.has-alpha) img { + border-radius: inherit; + } + } } .account-container main > *:first-child { @@ -288,10 +293,17 @@ align-self: center !important; /* clip a dog ear on top right */ clip-path: polygon(0 0, calc(100% - 4px) 0, 100% 4px, 100% 100%, 0 100%); + &:dir(rtl) { + /* top left */ + clip-path: polygon(4px 0, 100% 0, 100% 100%, 0 100%, 0 4px); + } /* 4x4px square on top right */ background-size: 4px 4px; background-repeat: no-repeat; background-position: top right; + &:dir(rtl) { + background-position: top left; + } background-image: linear-gradient( to bottom, var(--private-note-border-color), @@ -311,7 +323,7 @@ box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; - text-align: left; + text-align: start; } &:hover:not(:active) { @@ -370,7 +382,8 @@ animation: appear 1s both ease-in-out; > *:not(:first-child) { - margin: 0 0 0 -4px; + margin: 0; + margin-inline-start: -4px; } } } @@ -422,15 +435,15 @@ } &:has(+ .account-metadata-box) { - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; + border-end-start-radius: 4px; + border-end-end-radius: 4px; } + .account-metadata-box { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-left-radius: 16px; - border-bottom-right-radius: 16px; + border-start-start-radius: 4px; + border-start-end-radius: 4px; + border-end-start-radius: 16px; + border-end-end-radius: 16px; } } @@ -577,7 +590,7 @@ margin-top: calc(-1 * var(--banner-overlap)); } - @supports (animation-timeline: scroll()) { + @supports ((animation-timeline: scroll()) and (animation-range: 0% 100%)) { .header-banner:not(.header-is-avatar):not(:hover):not(:active) { animation: bye-banner 1s linear both; animation-timeline: view(); @@ -746,12 +759,16 @@ letter-spacing: -0.5px; mix-blend-mode: multiply; gap: 12px; - } - .timeline-start .account-container header .account-block .avatar { - width: 112px !important; - height: 112px !important; - filter: drop-shadow(-8px 0 8px var(--header-color-3, --bg-color)) - drop-shadow(8px 0 8px var(--header-color-4, --bg-color)); + + .avatar-container { + filter: drop-shadow(-8px 0 8px var(--header-color-3, --bg-color)) + drop-shadow(8px 0 8px var(--header-color-4, --bg-color)); + } + + .avatar { + width: 112px !important; + height: 112px !important; + } } } @@ -781,3 +798,108 @@ } } } + +#edit-profile-container { + p { + margin-block: 8px; + } + + label { + input, + textarea { + display: block; + width: 100%; + } + + textarea { + resize: vertical; + min-height: 5em; + max-height: 50vh; + } + } + + table { + width: 100%; + + th { + text-align: start; + color: var(--text-insignificant-color); + font-weight: normal; + font-size: 0.8em; + text-transform: uppercase; + } + + tbody tr td:first-child { + width: 40%; + } + + input { + width: 100%; + } + } + + footer { + display: flex; + justify-content: space-between; + padding: 8px 0; + + * { + vertical-align: middle; + } + } +} + +.handle-info { + .handle-handle { + display: inline-block; + margin-block: 5px; + + b { + font-weight: 600; + padding: 2px 4px; + border-radius: 4px; + display: inline-block; + box-shadow: 0 0 0 5px var(--bg-blur-color); + + &.handle-username { + color: var(--orange-fg-color); + background-color: var(--orange-bg-color); + } + + &.handle-server { + color: var(--purple-fg-color); + background-color: var(--purple-bg-color); + } + } + } + + .handle-at { + display: inline-block; + margin-inline: -3px; + position: relative; + z-index: 1; + } + + .handle-legend { + margin-top: 0.25em; + } + + .handle-legend-icon { + overflow: hidden; + display: inline-block; + width: 14px; + height: 14px; + border: 4px solid transparent; + border-radius: 8px; + background-clip: padding-box; + + &.username { + background-color: var(--orange-fg-color); + border-color: var(--orange-bg-color); + } + &.server { + background-color: var(--purple-fg-color); + border-color: var(--purple-bg-color); + } + } +} diff --git a/src/components/account-info.jsx b/src/components/account-info.jsx index 37e5f599..226194c9 100644 --- a/src/components/account-info.jsx +++ b/src/components/account-info.jsx @@ -1,6 +1,8 @@ import './account-info.css'; -import { Menu, MenuDivider, MenuItem, SubMenu } from '@szhsin/react-menu'; +import { msg, plural, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; +import { MenuDivider, MenuItem } from '@szhsin/react-menu'; import { useCallback, useEffect, @@ -9,18 +11,23 @@ import { useRef, useState, } from 'preact/hooks'; +import punycode from 'punycode/'; import { api } from '../utils/api'; import enhanceContent from '../utils/enhance-content'; import getHTMLText from '../utils/getHTMLText'; import handleContentLinks from '../utils/handle-content-links'; +import i18nDuration from '../utils/i18n-duration'; +import { getLists } from '../utils/lists'; import niceDateTime from '../utils/nice-date-time'; import pmem from '../utils/pmem'; import shortenNumber from '../utils/shorten-number'; +import showCompose from '../utils/show-compose'; import showToast from '../utils/show-toast'; import states, { hideAllModals } from '../utils/states'; import store from '../utils/store'; -import { updateAccount } from '../utils/store-utils'; +import { getCurrentAccountID, updateAccount } from '../utils/store-utils'; +import supports from '../utils/supports'; import AccountBlock from './account-block'; import Avatar from './avatar'; @@ -29,9 +36,11 @@ import Icon from './icon'; import Link from './link'; import ListAddEdit from './list-add-edit'; import Loader from './loader'; -import Menu2 from './menu2'; import MenuConfirm from './menu-confirm'; +import MenuLink from './menu-link'; +import Menu2 from './menu2'; import Modal from './modal'; +import SubMenu2 from './submenu2'; import TranslationBlock from './translation-block'; const MUTE_DURATIONS = [ @@ -42,17 +51,19 @@ const MUTE_DURATIONS = [ 60 * 60 * 24, // 1 day 60 * 60 * 24 * 3, // 3 days 60 * 60 * 24 * 7, // 1 week + 60 * 60 * 24 * 30, // 30 days 0, // forever ]; const MUTE_DURATIONS_LABELS = { - 0: 'Forever', - 300: '5 minutes', - 1_800: '30 minutes', - 3_600: '1 hour', - 21_600: '6 hours', - 86_400: '1 day', - 259_200: '3 days', - 604_800: '1 week', + 0: msg`Forever`, + 300: i18nDuration(5, 'minute'), + 1_800: i18nDuration(30, 'minute'), + 3_600: i18nDuration(1, 'hour'), + 21_600: i18nDuration(6, 'hour'), + 86_400: i18nDuration(1, 'day'), + 259_200: i18nDuration(3, 'day'), + 604_800: i18nDuration(1, 'week'), + 2592_000: i18nDuration(30, 'day'), }; const LIMIT = 80; @@ -124,6 +135,7 @@ function AccountInfo({ instance, authenticated, }) { + const { i18n } = useLingui(); const { masto } = api({ instance, }); @@ -181,6 +193,7 @@ function AccountInfo({ memorial, moved, roles, + hideCollections, } = info || {}; let headerIsAvatar = false; let { header, headerStatic } = info || {}; @@ -194,10 +207,7 @@ function AccountInfo({ } } - const isSelf = useMemo( - () => id === store.session.get('currentAccount'), - [id], - ); + const isSelf = useMemo(() => id === getCurrentAccountID(), [id]); useEffect(() => { const infoHasEssentials = !!( @@ -227,7 +237,7 @@ function AccountInfo({ const accountInstance = useMemo(() => { if (!url) return null; - const domain = new URL(url).hostname; + const domain = punycode.toUnicode(URL.parse(url).hostname); return domain; }, [url]); @@ -250,12 +260,13 @@ function AccountInfo({ // On first load, fetch familiar followers, merge to top of results' `value` // Remove dups on every fetch if (firstLoad) { - const familiarFollowers = await masto.v1.accounts.familiarFollowers.fetch( - { + let familiarFollowers = []; + try { + familiarFollowers = await masto.v1.accounts.familiarFollowers.fetch({ id: [id], - }, - ); - familiarFollowersCache.current = familiarFollowers[0].accounts; + }); + } catch (e) {} + familiarFollowersCache.current = familiarFollowers?.[0]?.accounts || []; newValue = [ ...familiarFollowersCache.current, ...value.filter( @@ -340,6 +351,17 @@ function AccountInfo({ [standalone, id, statusesCount], ); + const onProfileUpdate = useCallback( + (newAccount) => { + if (newAccount.id === id) { + console.log('Updated account info', newAccount); + setInfo(newAccount); + states.accounts[`${newAccount.id}@${instance}`] = newAccount; + } + }, + [id, instance], + ); + return ( <div tabIndex="-1" @@ -353,14 +375,16 @@ function AccountInfo({ > {uiState === 'error' && ( <div class="ui-state"> - <p>Unable to load account.</p> + <p> + <Trans>Unable to load account.</Trans> + </p> <p> <a href={isString ? account : url} target="_blank" rel="noopener noreferrer" > - Go to account page <Icon icon="external" /> + <Trans>Go to account page</Trans> <Icon icon="external" /> </a> </p> </div> @@ -388,21 +412,21 @@ function AccountInfo({ </div> <div class="stats"> <div> - <span>██</span> Followers + <span>██</span> <Trans>Followers</Trans> </div> <div> - <span>██</span> Following + <span>██</span> <Trans id="following.stats">Following</Trans> </div> <div> - <span>██</span> Posts + <span>██</span> <Trans>Posts</Trans> </div> </div> </div> <div class="actions"> <span /> <span class="buttons"> - <button type="button" title="More" class="plain" disabled> - <Icon icon="more" size="l" alt="More" /> + <button type="button" class="plain" disabled> + <Icon icon="more" size="l" alt={t`More`} /> </button> </span> </div> @@ -414,8 +438,10 @@ function AccountInfo({ {!!moved && ( <div class="account-moved"> <p> - <b>{displayName}</b> has indicated that their new account is - now: + <Trans> + <b>{displayName}</b> has indicated that their new account is + now: + </Trans> </p> <AccountBlock account={moved} @@ -453,12 +479,15 @@ function AccountInfo({ e.target.classList.add('loaded'); try { // Get color from four corners of image - const canvas = document.createElement('canvas'); + const canvas = window.OffscreenCanvas + ? new OffscreenCanvas(1, 1) + : document.createElement('canvas'); const ctx = canvas.getContext('2d', { willReadFrequently: true, }); canvas.width = e.target.width; canvas.height = e.target.height; + ctx.imageSmoothingEnabled = false; ctx.drawImage(e.target, 0, 0); // const colors = [ // ctx.getImageData(0, 0, 1, 1).data, @@ -526,25 +555,90 @@ function AccountInfo({ /> )} <header> - <AccountBlock - account={info} - instance={instance} - avatarSize="xxxl" - external={standalone} - internal={!standalone} - /> + {standalone ? ( + <Menu2 + shift={ + window.matchMedia('(min-width: calc(40em))').matches + ? 114 + : 64 + } + menuButton={ + <div> + <AccountBlock + account={info} + instance={instance} + avatarSize="xxxl" + onClick={() => {}} + /> + </div> + } + > + <div class="szh-menu__header"> + <AccountHandleInfo acct={acct} instance={instance} /> + </div> + <MenuItem + onClick={() => { + const handleWithInstance = acct.includes('@') + ? `@${acct}` + : `@${acct}@${instance}`; + try { + navigator.clipboard.writeText(handleWithInstance); + showToast(t`Handle copied`); + } catch (e) { + console.error(e); + showToast(t`Unable to copy handle`); + } + }} + > + <Icon icon="link" /> + <span> + <Trans>Copy handle</Trans> + </span> + </MenuItem> + <MenuItem href={url} target="_blank"> + <Icon icon="external" /> + <span> + <Trans>Go to original profile page</Trans> + </span> + </MenuItem> + <MenuDivider /> + <MenuLink href={info.avatar} target="_blank"> + <Icon icon="user" /> + <span> + <Trans>View profile image</Trans> + </span> + </MenuLink> + <MenuLink href={info.header} target="_blank"> + <Icon icon="media" /> + <span> + <Trans>View profile header</Trans> + </span> + </MenuLink> + </Menu2> + ) : ( + <AccountBlock + account={info} + instance={instance} + avatarSize="xxxl" + internal + /> + )} </header> <div class="faux-header-bg" aria-hidden="true" /> <main> - {!!memorial && <span class="tag">In Memoriam</span>} + {!!memorial && ( + <span class="tag"> + <Trans>In Memoriam</Trans> + </span> + )} {!!bot && ( <span class="tag"> - <Icon icon="bot" /> Automated + <Icon icon="bot" /> <Trans>Automated</Trans> </span> )} {!!group && ( <span class="tag"> - <Icon icon="group" /> Group + <Icon icon="group" /> <Trans>Group</Trans> </span> )} {roles?.map((role) => ( @@ -582,7 +676,11 @@ function AccountInfo({ <b> <EmojiText text={name} emojis={emojis} />{' '} {!!verifiedAt && ( - <Icon icon="check-circle" size="s" /> + <Icon + icon="check-circle" + size="s" + alt={t`Verified`} + /> )} </b> <p @@ -602,12 +700,16 @@ function AccountInfo({ // states.showAccount = false; setTimeout(() => { states.showGenericAccounts = { - heading: 'Followers', + id: 'followers', + heading: t`Followers`, fetchAccounts: fetchFollowers, instance, excludeRelationshipAttrs: isSelf ? ['followedBy'] : [], + blankCopy: hideCollections + ? t`This user has chosen to not make this information available.` + : undefined, }; }, 0); }} @@ -629,7 +731,7 @@ function AccountInfo({ <span title={followersCount}> {shortenNumber(followersCount)} </span>{' '} - Followers + <Trans>Followers</Trans> </LinkOrDiv> <LinkOrDiv class="insignificant" @@ -639,10 +741,16 @@ function AccountInfo({ // states.showAccount = false; setTimeout(() => { states.showGenericAccounts = { - heading: 'Following', + heading: t({ + id: 'following.stats', + message: 'Following', + }), fetchAccounts: fetchFollowing, instance, excludeRelationshipAttrs: isSelf ? ['following'] : [], + blankCopy: hideCollections + ? t`This user has chosen to not make this information available.` + : undefined, }; }, 0); }} @@ -650,7 +758,7 @@ function AccountInfo({ <span title={followingCount}> {shortenNumber(followingCount)} </span>{' '} - Following + <Trans id="following.stats">Following</Trans> <br /> </LinkOrDiv> <LinkOrDiv @@ -667,16 +775,18 @@ function AccountInfo({ <span title={statusesCount}> {shortenNumber(statusesCount)} </span>{' '} - Posts + <Trans>Posts</Trans> </LinkOrDiv> {!!createdAt && ( <div class="insignificant"> - Joined{' '} - <time datetime={createdAt}> - {niceDateTime(createdAt, { - hideTime: true, - })} - </time> + <Trans> + Joined{' '} + <time datetime={createdAt}> + {niceDateTime(createdAt, { + hideTime: true, + })} + </time> + </Trans> </div> )} </div> @@ -694,25 +804,39 @@ function AccountInfo({ {hasPostingStats ? ( <div class="posting-stats" - title={`${Math.round( - (postingStats.originals / postingStats.total) * 100, - )}% original posts, ${Math.round( - (postingStats.replies / postingStats.total) * 100, - )}% replies, ${Math.round( - (postingStats.boosts / postingStats.total) * 100, - )}% boosts`} + title={t`${( + postingStats.originals / postingStats.total + ).toLocaleString(i18n.locale || undefined, { + style: 'percent', + })} original posts, ${( + postingStats.replies / postingStats.total + ).toLocaleString(i18n.locale || undefined, { + style: 'percent', + })} replies, ${( + postingStats.boosts / postingStats.total + ).toLocaleString(i18n.locale || undefined, { + style: 'percent', + })} boosts`} > <div> {postingStats.daysSinceLastPost < 365 - ? `Last ${postingStats.total} post${ - postingStats.total > 1 ? 's' : '' - } in the past - ${postingStats.daysSinceLastPost} day${ - postingStats.daysSinceLastPost > 1 ? 's' : '' - }` - : ` - Last ${postingStats.total} posts in the past year(s) - `} + ? plural(postingStats.total, { + one: plural(postingStats.daysSinceLastPost, { + one: `Last 1 post in the past 1 day`, + other: `Last 1 post in the past ${postingStats.daysSinceLastPost} days`, + }), + other: plural( + postingStats.daysSinceLastPost, + { + one: `Last ${postingStats.total} posts in the past 1 day`, + other: `Last ${postingStats.total} posts in the past ${postingStats.daysSinceLastPost} days`, + }, + ), + }) + : plural(postingStats.total, { + one: 'Last 1 post in the past year(s)', + other: `Last ${postingStats.total} posts in the past year(s)`, + })} </div> <div class="posting-stats-bar" @@ -733,64 +857,70 @@ function AccountInfo({ <div class="posting-stats-legends"> <span class="ib"> <span class="posting-stats-legend-item posting-stats-legend-item-originals" />{' '} - Original + <Trans>Original</Trans> </span>{' '} <span class="ib"> <span class="posting-stats-legend-item posting-stats-legend-item-replies" />{' '} - Replies + <Trans>Replies</Trans> </span>{' '} <span class="ib"> <span class="posting-stats-legend-item posting-stats-legend-item-boosts" />{' '} - Boosts + <Trans>Boosts</Trans> </span> </div> </div> ) : ( - <div class="posting-stats">Post stats unavailable.</div> + <div class="posting-stats"> + <Trans>Post stats unavailable.</Trans> + </div> )} </div> </div> </LinkOrDiv> )} - <div class="account-metadata-box"> - <div - class="shazam-container no-animation" - hidden={!!postingStats} - > - <div class="shazam-container-inner"> - <button - type="button" - class="posting-stats-button" - disabled={postingStatsUIState === 'loading'} - onClick={() => { - renderPostingStats(); - }} - > - <div - class={`posting-stats-bar posting-stats-icon ${ - postingStatsUIState === 'loading' ? 'loading' : '' - }`} - style={{ - '--originals-percentage': '33%', - '--replies-percentage': '66%', + {!moved && ( + <div class="account-metadata-box"> + <div + class="shazam-container no-animation" + hidden={!!postingStats} + > + <div class="shazam-container-inner"> + <button + type="button" + class="posting-stats-button" + disabled={postingStatsUIState === 'loading'} + onClick={() => { + renderPostingStats(); }} - /> - View post stats{' '} - {/* <Loader + > + <div + class={`posting-stats-bar posting-stats-icon ${ + postingStatsUIState === 'loading' ? 'loading' : '' + }`} + style={{ + '--originals-percentage': '33%', + '--replies-percentage': '66%', + }} + /> + <Trans>View post stats</Trans>{' '} + {/* <Loader abrupt hidden={postingStatsUIState !== 'loading'} /> */} - </button> + </button> + </div> </div> </div> - </div> + )} </main> <footer> <RelatedActions info={info} instance={instance} + standalone={standalone} authenticated={authenticated} onRelationshipChange={onRelationshipChange} + onProfileUpdate={onProfileUpdate} /> </footer> </> @@ -805,10 +935,13 @@ const FAMILIAR_FOLLOWERS_LIMIT = 3; function RelatedActions({ info, instance, + standalone, authenticated, onRelationshipChange = () => {}, + onProfileUpdate = () => {}, }) { if (!info) return null; + const { _ } = useLingui(); const { masto: currentMasto, instance: currentInstance, @@ -841,9 +974,11 @@ function RelatedActions({ const [currentInfo, setCurrentInfo] = useState(null); const [isSelf, setIsSelf] = useState(false); + const acctWithInstance = acct.includes('@') ? acct : `${acct}@${instance}`; + useEffect(() => { if (info) { - const currentAccount = store.session.get('currentAccount'); + const currentAccount = getCurrentAccountID(); let currentID; (async () => { if (sameInstance && authenticated) { @@ -878,7 +1013,7 @@ function RelatedActions({ accountID.current = currentID; - if (moved) return; + // if (moved) return; setRelationshipUIState('loading'); @@ -917,6 +1052,7 @@ function RelatedActions({ const [showTranslatedBio, setShowTranslatedBio] = useState(false); const [showAddRemoveLists, setShowAddRemoveLists] = useState(false); const [showPrivateNoteModal, setShowPrivateNoteModal] = useState(false); + const [showEditProfile, setShowEditProfile] = useState(false); const [lists, setLists] = useState([]); return ( @@ -924,28 +1060,40 @@ function RelatedActions({ <div class="actions"> <span> {followedBy ? ( - <span class="tag">Follows you</span> + <span class="tag"> + <Trans>Follows you</Trans> + </span> ) : !!lastStatusAt ? ( <small class="insignificant"> - Last post:{' '} - <span class="ib"> - {niceDateTime(lastStatusAt, { - hideTime: true, - })} - </span> + <Trans> + Last post:{' '} + <span class="ib"> + {niceDateTime(lastStatusAt, { + hideTime: true, + })} + </span> + </Trans> </small> ) : ( <span /> )} - {muting && <span class="tag danger">Muted</span>} - {blocking && <span class="tag danger">Blocked</span>} + {muting && ( + <span class="tag danger"> + <Trans>Muted</Trans> + </span> + )} + {blocking && ( + <span class="tag danger"> + <Trans>Blocked</Trans> + </span> + )} </span>{' '} <span class="buttons"> {!!privateNote && ( <button type="button" class="private-note-tag" - title="Private note" + title={t`Private note`} onClick={() => { setShowPrivateNoteModal(true); }} @@ -968,13 +1116,8 @@ function RelatedActions({ position="anchor" overflow="auto" menuButton={ - <button - type="button" - title="More" - class="plain" - disabled={loading} - > - <Icon icon="more" size="l" alt="More" /> + <button type="button" class="plain" disabled={loading}> + <Icon icon="more" size="l" alt={t`More`} /> </button> } onMenuChange={(e) => { @@ -998,15 +1141,19 @@ function RelatedActions({ <> <MenuItem onClick={() => { - states.showCompose = { + showCompose({ draftStatus: { status: `@${currentInfo?.acct || acct} `, }, - }; + }); }} > <Icon icon="at" /> - <span>Mention @{username}</span> + <span> + <Trans> + Mention <span class="bidi-isolate">@{username}</span> + </Trans> + </span> </MenuItem> <MenuItem onClick={() => { @@ -1014,18 +1161,86 @@ function RelatedActions({ }} > <Icon icon="translate" /> - <span>Translate bio</span> - </MenuItem> - <MenuItem - onClick={() => { - setShowPrivateNoteModal(true); - }} - > - <Icon icon="pencil" /> <span> - {privateNote ? 'Edit private note' : 'Add private note'} + <Trans>Translate bio</Trans> </span> </MenuItem> + {supports('@mastodon/profile-private-note') && ( + <MenuItem + onClick={() => { + setShowPrivateNoteModal(true); + }} + > + <Icon icon="pencil" /> + <span> + {privateNote ? t`Edit private note` : t`Add private note`} + </span> + </MenuItem> + )} + {following && !!relationship && ( + <> + <MenuItem + onClick={() => { + setRelationshipUIState('loading'); + (async () => { + try { + const rel = await currentMasto.v1.accounts + .$select(accountID.current) + .follow({ + notify: !notifying, + }); + if (rel) setRelationship(rel); + setRelationshipUIState('default'); + showToast( + rel.notifying + ? t`Notifications enabled for @${username}'s posts.` + : t` Notifications disabled for @${username}'s posts.`, + ); + } catch (e) { + alert(e); + setRelationshipUIState('error'); + } + })(); + }} + > + <Icon icon="notification" /> + <span> + {notifying + ? t`Disable notifications` + : t`Enable notifications`} + </span> + </MenuItem> + <MenuItem + onClick={() => { + setRelationshipUIState('loading'); + (async () => { + try { + const rel = await currentMasto.v1.accounts + .$select(accountID.current) + .follow({ + reblogs: !showingReblogs, + }); + if (rel) setRelationship(rel); + setRelationshipUIState('default'); + showToast( + rel.showingReblogs + ? t`Boosts from @${username} enabled.` + : t`Boosts from @${username} disabled.`, + ); + } catch (e) { + alert(e); + setRelationshipUIState('error'); + } + })(); + }} + > + <Icon icon="rocket" /> + <span> + {showingReblogs ? t`Disable boosts` : t`Enable boosts`} + </span> + </MenuItem> + </> + )} {/* Add/remove from lists is only possible if following the account */} {following && ( <MenuItem @@ -1037,7 +1252,7 @@ function RelatedActions({ {lists.length ? ( <> <small class="menu-grow"> - Add/Remove from Lists + <Trans>Add/Remove from Lists</Trans> <br /> <span class="more-insignificant"> {lists.map((list) => list.title).join(', ')} @@ -1046,7 +1261,9 @@ function RelatedActions({ <small class="more-insignificant">{lists.length}</small> </> ) : ( - <span>Add/Remove from Lists</span> + <span> + <Trans>Add/Remove from Lists</Trans> + </span> )} </MenuItem> )} @@ -1055,22 +1272,22 @@ function RelatedActions({ )} <MenuItem onClick={() => { - const handle = `@${currentInfo?.acct || acct}`; + const handle = `@${currentInfo?.acct || acctWithInstance}`; try { navigator.clipboard.writeText(handle); - showToast('Handle copied'); + showToast(t`Handle copied`); } catch (e) { console.error(e); - showToast('Unable to copy handle'); + showToast(t`Unable to copy handle`); } }} > <Icon icon="copy" /> <small> - Copy handle + <Trans>Copy handle</Trans> <br /> - <span class="more-insignificant"> - @{currentInfo?.acct || acct} + <span class="more-insignificant bidi-isolate"> + @{currentInfo?.acct || acctWithInstance} </span> </small> </MenuItem> @@ -1084,15 +1301,17 @@ function RelatedActions({ // Copy url to clipboard try { navigator.clipboard.writeText(url); - showToast('Link copied'); + showToast(t`Link copied`); } catch (e) { console.error(e); - showToast('Unable to copy link'); + showToast(t`Unable to copy link`); } }} > <Icon icon="link" /> - <span>Copy</span> + <span> + <Trans>Copy</Trans> + </span> </MenuItem> {navigator?.share && navigator?.canShare?.({ @@ -1106,12 +1325,14 @@ function RelatedActions({ }); } catch (e) { console.error(e); - alert("Sharing doesn't seem to work."); + alert(t`Sharing doesn't seem to work.`); } }} > <Icon icon="share" /> - <span>Share…</span> + <span> + <Trans>Share…</Trans> + </span> </MenuItem> )} </div> @@ -1130,7 +1351,7 @@ function RelatedActions({ console.log('unmuting', newRelationship); setRelationship(newRelationship); setRelationshipUIState('default'); - showToast(`Unmuted @${username}`); + showToast(t`Unmuted @${username}`); states.reloadGenericAccounts.id = 'mute'; states.reloadGenericAccounts.counter++; } catch (e) { @@ -1141,10 +1362,14 @@ function RelatedActions({ }} > <Icon icon="unmute" /> - <span>Unmute @{username}</span> + <span> + <Trans> + Unmute <span class="bidi-isolate">@{username}</span> + </Trans> + </span> </MenuItem> ) : ( - <SubMenu + <SubMenu2 menuClassName="menu-blur" openTrigger="clickOnly" direction="bottom" @@ -1153,7 +1378,11 @@ function RelatedActions({ label={ <> <Icon icon="mute" /> - <span class="menu-grow">Mute @{username}…</span> + <span class="menu-grow"> + <Trans> + Mute <span class="bidi-isolate">@{username}</span>… + </Trans> + </span> <span style={{ textOverflow: 'clip', @@ -1182,23 +1411,74 @@ function RelatedActions({ setRelationship(newRelationship); setRelationshipUIState('default'); showToast( - `Muted @${username} for ${MUTE_DURATIONS_LABELS[duration]}`, + t`Muted @${username} for ${ + typeof MUTE_DURATIONS_LABELS[duration] === + 'function' + ? MUTE_DURATIONS_LABELS[duration]() + : _(MUTE_DURATIONS_LABELS[duration]) + }`, ); states.reloadGenericAccounts.id = 'mute'; states.reloadGenericAccounts.counter++; } catch (e) { console.error(e); setRelationshipUIState('error'); - showToast(`Unable to mute @${username}`); + showToast(t`Unable to mute @${username}`); } })(); }} > - {MUTE_DURATIONS_LABELS[duration]} + {typeof MUTE_DURATIONS_LABELS[duration] === 'function' + ? MUTE_DURATIONS_LABELS[duration]() + : _(MUTE_DURATIONS_LABELS[duration])} </MenuItem> ))} </div> - </SubMenu> + </SubMenu2> + )} + {followedBy && ( + <MenuConfirm + subMenu + menuItemClassName="danger" + confirmLabel={ + <> + <Icon icon="user-x" /> + <span> + <Trans> + Remove <span class="bidi-isolate">@{username}</span>{' '} + from followers? + </Trans> + </span> + </> + } + onClick={() => { + setRelationshipUIState('loading'); + (async () => { + try { + const newRelationship = await currentMasto.v1.accounts + .$select(currentInfo?.id || id) + .removeFromFollowers(); + console.log( + 'removing from followers', + newRelationship, + ); + setRelationship(newRelationship); + setRelationshipUIState('default'); + showToast(t`@${username} removed from followers`); + states.reloadGenericAccounts.id = 'followers'; + states.reloadGenericAccounts.counter++; + } catch (e) { + console.error(e); + setRelationshipUIState('error'); + } + })(); + }} + > + <Icon icon="user-x" /> + <span> + <Trans>Remove follower…</Trans> + </span> + </MenuConfirm> )} <MenuConfirm subMenu @@ -1206,9 +1486,16 @@ function RelatedActions({ confirmLabel={ <> <Icon icon="block" /> - <span>Block @{username}?</span> + <span> + <Trans> + Block <span class="bidi-isolate">@{username}</span>? + </Trans> + </span> </> } + itemProps={{ + className: 'danger', + }} menuItemClassName="danger" onClick={() => { // if (!blocking && !confirm(`Block @${username}?`)) { @@ -1224,7 +1511,7 @@ function RelatedActions({ console.log('unblocking', newRelationship); setRelationship(newRelationship); setRelationshipUIState('default'); - showToast(`Unblocked @${username}`); + showToast(t`Unblocked @${username}`); } else { const newRelationship = await currentMasto.v1.accounts .$select(currentInfo?.id || id) @@ -1232,7 +1519,7 @@ function RelatedActions({ console.log('blocking', newRelationship); setRelationship(newRelationship); setRelationshipUIState('default'); - showToast(`Blocked @${username}`); + showToast(t`Blocked @${username}`); } states.reloadGenericAccounts.id = 'block'; states.reloadGenericAccounts.counter++; @@ -1240,9 +1527,9 @@ function RelatedActions({ console.error(e); setRelationshipUIState('error'); if (blocking) { - showToast(`Unable to unblock @${username}`); + showToast(t`Unable to unblock @${username}`); } else { - showToast(`Unable to block @${username}`); + showToast(t`Unable to block @${username}`); } } })(); @@ -1251,12 +1538,20 @@ function RelatedActions({ {blocking ? ( <> <Icon icon="unblock" /> - <span>Unblock @{username}</span> + <span> + <Trans> + Unblock <span class="bidi-isolate">@{username}</span> + </Trans> + </span> </> ) : ( <> <Icon icon="block" /> - <span>Block @{username}…</span> + <span> + <Trans> + Block <span class="bidi-isolate">@{username}</span>… + </Trans> + </span> </> )} </MenuConfirm> @@ -1269,10 +1564,32 @@ function RelatedActions({ }} > <Icon icon="flag" /> - <span>Report @{username}…</span> + <span> + <Trans> + Report <span class="bidi-isolate">@{username}</span>… + </Trans> + </span> </MenuItem> </> )} + {currentAuthenticated && + isSelf && + standalone && + supports('@mastodon/profile-edit') && ( + <> + <MenuDivider /> + <MenuItem + onClick={() => { + setShowEditProfile(true); + }} + > + <Icon icon="pencil" /> + <span> + <Trans>Edit profile</Trans> + </span> + </MenuItem> + </> + )} {import.meta.env.DEV && currentAuthenticated && isSelf && ( <> <MenuDivider /> @@ -1298,14 +1615,14 @@ function RelatedActions({ {!relationship && relationshipUIState === 'loading' && ( <Loader abrupt /> )} - {!!relationship && ( + {!!relationship && !moved && ( <MenuConfirm confirm={following || requested} confirmLabel={ <span> {requested - ? 'Withdraw follow request?' - : `Unfollow @${info.acct || info.username}?`} + ? t`Withdraw follow request?` + : t`Unfollow @${info.acct || info.username}?`} </span> } menuItemClassName="danger" @@ -1352,20 +1669,31 @@ function RelatedActions({ > {following ? ( <> - <span>Following</span> - <span>Unfollow…</span> + <span> + <Trans>Following</Trans> + </span> + <span> + <Trans>Unfollow…</Trans> + </span> </> ) : requested ? ( <> - <span>Requested</span> - <span>Withdraw…</span> + <span> + <Trans>Requested</Trans> + </span> + <span> + <Trans>Withdraw…</Trans> + </span> </> ) : locked ? ( <> - <Icon icon="lock" /> <span>Follow</span> + <Icon icon="lock" />{' '} + <span> + <Trans>Follow</Trans> + </span> </> ) : ( - 'Follow' + t`Follow` )} </button> </MenuConfirm> @@ -1414,6 +1742,22 @@ function RelatedActions({ /> </Modal> )} + {!!showEditProfile && ( + <Modal + onClose={() => { + setShowEditProfile(false); + }} + > + <EditProfileSheet + onClose={({ state, account } = {}) => { + setShowEditProfile(false); + if (state === 'success' && account) { + onProfileUpdate(account); + } + }} + /> + </Modal> + )} </> ); } @@ -1436,12 +1780,12 @@ function lightenRGB([r, g, b]) { function niceAccountURL(url) { if (!url) return; - const urlObj = new URL(url); + const urlObj = URL.parse(url); const { host, pathname } = urlObj; const path = pathname.replace(/\/$/, '').replace(/^\//, ''); return ( <> - <span class="more-insignificant">{host}/</span> + <span class="more-insignificant">{punycode.toUnicode(host)}/</span> <wbr /> <span>{path}</span> </> @@ -1460,11 +1804,13 @@ function TranslatedBioSheet({ note, fields, onClose }) { <div class="sheet"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <h2>Translated Bio</h2> + <h2> + <Trans>Translated Bio</Trans> + </h2> </header> <main> <p @@ -1491,13 +1837,12 @@ function AddRemoveListsSheet({ accountID, onClose }) { setUIState('loading'); (async () => { try { - const lists = await masto.v1.lists.list(); - lists.sort((a, b) => a.title.localeCompare(b.title)); + const lists = await getLists(); + setLists(lists); const listsContainingAccount = await masto.v1.accounts .$select(accountID) .lists.list(); console.log({ lists, listsContainingAccount }); - setLists(lists); setListsContainingAccount(listsContainingAccount); setUIState('default'); } catch (e) { @@ -1513,11 +1858,13 @@ function AddRemoveListsSheet({ accountID, onClose }) { <div class="sheet" id="list-add-remove-container"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <h2>Add/Remove from Lists</h2> + <h2> + <Trans>Add/Remove from Lists</Trans> + </h2> </header> <main> {lists.length > 0 ? ( @@ -1556,14 +1903,14 @@ function AddRemoveListsSheet({ accountID, onClose }) { setUIState('error'); alert( inList - ? 'Unable to remove from list.' - : 'Unable to add to list.', + ? t`Unable to remove from list.` + : t`Unable to add to list.`, ); } })(); }} > - <Icon icon="check-circle" /> + <Icon icon="check-circle" alt="☑️" /> <span>{list.title}</span> </button> </li> @@ -1575,9 +1922,13 @@ function AddRemoveListsSheet({ accountID, onClose }) { <Loader abrupt /> </p> ) : uiState === 'error' ? ( - <p class="ui-state">Unable to load lists.</p> + <p class="ui-state"> + <Trans>Unable to load lists.</Trans> + </p> ) : ( - <p class="ui-state">No lists.</p> + <p class="ui-state"> + <Trans>No lists.</Trans> + </p> )} <button type="button" @@ -1585,7 +1936,10 @@ function AddRemoveListsSheet({ accountID, onClose }) { onClick={() => setShowListAddEditModal(true)} disabled={uiState !== 'default'} > - <Icon icon="plus" size="l" /> <span>New list</span> + <Icon icon="plus" size="l" />{' '} + <span> + <Trans>New list</Trans> + </span> </button> </main> {showListAddEditModal && ( @@ -1637,11 +1991,18 @@ function PrivateNoteSheet({ <div class="sheet" id="private-note-container"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <b>Private note about @{account?.username || account?.acct}</b> + <b> + <Trans> + Private note about{' '} + <span class="bidi-isolate"> + @{account?.username || account?.acct} + </span> + </Trans> + </b> </header> <main> <form @@ -1665,7 +2026,7 @@ function PrivateNoteSheet({ } catch (e) { console.error(e); setUIState('error'); - alert(e?.message || 'Unable to update private note.'); + alert(e?.message || t`Unable to update private note.`); } })(); } @@ -1675,6 +2036,7 @@ function PrivateNoteSheet({ ref={textareaRef} name="note" disabled={uiState === 'loading'} + dir="auto" > {initialNote} </textarea> @@ -1687,12 +2049,12 @@ function PrivateNoteSheet({ onClose?.(); }} > - Cancel + <Trans>Cancel</Trans> </button> <span> <Loader abrupt hidden={uiState !== 'loading'} /> <button disabled={uiState === 'loading'} type="submit"> - Save & close + <Trans>Save & close</Trans> </button> </span> </footer> @@ -1702,4 +2064,227 @@ function PrivateNoteSheet({ ); } +function EditProfileSheet({ onClose = () => {} }) { + const { masto } = api(); + const [uiState, setUIState] = useState('loading'); + const [account, setAccount] = useState(null); + + useEffect(() => { + (async () => { + try { + const acc = await masto.v1.accounts.verifyCredentials(); + setAccount(acc); + setUIState('default'); + } catch (e) { + console.error(e); + setUIState('error'); + } + })(); + }, []); + + console.log('EditProfileSheet', account); + const { displayName, source } = account || {}; + const { note, fields } = source || {}; + const fieldsAttributesRef = useRef(null); + + return ( + <div class="sheet" id="edit-profile-container"> + {!!onClose && ( + <button type="button" class="sheet-close" onClick={onClose}> + <Icon icon="x" alt={t`Close`} /> + </button> + )} + <header> + <b> + <Trans>Edit profile</Trans> + </b> + </header> + <main> + {uiState === 'loading' ? ( + <p class="ui-state"> + <Loader abrupt /> + </p> + ) : ( + <form + onSubmit={(e) => { + e.preventDefault(); + const formData = new FormData(e.target); + const displayName = formData.get('display_name'); + const note = formData.get('note'); + const fieldsAttributesFields = + fieldsAttributesRef.current.querySelectorAll( + 'input[name^="fields_attributes"]', + ); + const fieldsAttributes = []; + fieldsAttributesFields.forEach((field) => { + const name = field.name; + const [_, index, key] = + name.match(/fields_attributes\[(\d+)\]\[(.+)\]/) || []; + const value = field.value ? field.value.trim() : ''; + if (index && key && value) { + if (!fieldsAttributes[index]) fieldsAttributes[index] = {}; + fieldsAttributes[index][key] = value; + } + }); + // Fill in the blanks + fieldsAttributes.forEach((field) => { + if (field.name && !field.value) { + field.value = ''; + } + }); + + (async () => { + try { + const newAccount = await masto.v1.accounts.updateCredentials({ + displayName, + note, + fieldsAttributes, + }); + console.log('updated account', newAccount); + onClose?.({ + state: 'success', + account: newAccount, + }); + } catch (e) { + console.error(e); + alert(e?.message || t`Unable to update profile.`); + } + })(); + }} + > + <p> + <label> + <Trans>Name</Trans>{' '} + <input + type="text" + name="display_name" + defaultValue={displayName} + maxLength={30} + disabled={uiState === 'loading'} + dir="auto" + /> + </label> + </p> + <p> + <label> + <Trans>Bio</Trans> + <textarea + defaultValue={note} + name="note" + maxLength={500} + rows="5" + disabled={uiState === 'loading'} + dir="auto" + /> + </label> + </p> + {/* Table for fields; name and values are in fields, min 4 rows */} + <p> + <Trans>Extra fields</Trans> + </p> + <table ref={fieldsAttributesRef}> + <thead> + <tr> + <th> + <Trans>Label</Trans> + </th> + <th> + <Trans>Content</Trans> + </th> + </tr> + </thead> + <tbody> + {Array.from({ length: Math.max(4, fields.length) }).map( + (_, i) => { + const { name = '', value = '' } = fields[i] || {}; + return ( + <FieldsAttributesRow + key={i} + name={name} + value={value} + index={i} + disabled={uiState === 'loading'} + /> + ); + }, + )} + </tbody> + </table> + <footer> + <button + type="button" + class="light" + disabled={uiState === 'loading'} + onClick={() => { + onClose?.(); + }} + > + <Trans>Cancel</Trans> + </button> + <button type="submit" disabled={uiState === 'loading'}> + <Trans>Save</Trans> + </button> + </footer> + </form> + )} + </main> + </div> + ); +} + +function FieldsAttributesRow({ name, value, disabled, index: i }) { + const [hasValue, setHasValue] = useState(!!value); + return ( + <tr> + <td> + <input + type="text" + name={`fields_attributes[${i}][name]`} + defaultValue={name} + disabled={disabled} + maxLength={255} + required={hasValue} + dir="auto" + /> + </td> + <td> + <input + type="text" + name={`fields_attributes[${i}][value]`} + defaultValue={value} + disabled={disabled} + maxLength={255} + onChange={(e) => setHasValue(!!e.currentTarget.value)} + dir="auto" + /> + </td> + </tr> + ); +} + +function AccountHandleInfo({ acct, instance }) { + // acct = username or username@server + let [username, server] = acct.split('@'); + if (!server) server = instance; + const encodedAcct = punycode.toASCII(acct); + return ( + <div class="handle-info"> + <span class="handle-handle" title={encodedAcct}> + <b class="handle-username">{username}</b> + <span class="handle-at">@</span> + <b class="handle-server">{server}</b> + </span> + <div class="handle-legend"> + <span class="ib"> + <span class="handle-legend-icon username" /> <Trans>username</Trans> + </span>{' '} + <span class="ib"> + <span class="handle-legend-icon server" />{' '} + <Trans>server domain name</Trans> + </span> + </div> + </div> + ); +} + export default AccountInfo; diff --git a/src/components/account-sheet.jsx b/src/components/account-sheet.jsx index f0a3bae3..593c0bfc 100644 --- a/src/components/account-sheet.jsx +++ b/src/components/account-sheet.jsx @@ -1,3 +1,4 @@ +import { t } from '@lingui/macro'; import { useEffect } from 'preact/hooks'; import { api } from '../utils/api'; @@ -33,7 +34,7 @@ function AccountSheet({ account, instance: propInstance, onClose }) { > {!!onClose && ( <button type="button" class="sheet-close outer" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <AccountInfo @@ -58,7 +59,7 @@ function AccountSheet({ account, instance: propInstance, onClose }) { if (result.accounts.length) { return result.accounts[0]; } else if (/https?:\/\/[^/]+\/@/.test(account)) { - const accountURL = new URL(account); + const accountURL = URL.parse(account); const { hostname, pathname } = accountURL; const acct = pathname.replace(/^\//, '').replace(/\/$/, '') + diff --git a/src/components/avatar.jsx b/src/components/avatar.jsx index 0edc9d3b..d19fcd13 100644 --- a/src/components/avatar.jsx +++ b/src/components/avatar.jsx @@ -21,11 +21,14 @@ const canvas = window.OffscreenCanvas const ctx = canvas.getContext('2d', { willReadFrequently: true, }); +ctx.imageSmoothingEnabled = false; + +const MISSING_IMAGE_PATH_REGEX = /missing\.png$/; function Avatar({ url, size, alt = '', squircle, ...props }) { size = SIZES[size] || size || SIZES.m; const avatarRef = useRef(); - const isMissing = /missing\.png$/.test(url); + const isMissing = MISSING_IMAGE_PATH_REGEX.test(url); return ( <span ref={avatarRef} @@ -47,6 +50,7 @@ function Avatar({ url, size, alt = '', squircle, ...props }) { alt={alt} loading="lazy" decoding="async" + fetchPriority="low" crossOrigin={ alphaCache[url] === undefined && !isMissing ? 'anonymous' @@ -62,7 +66,7 @@ function Avatar({ url, size, alt = '', squircle, ...props }) { if (avatarRef.current) avatarRef.current.dataset.loaded = true; if (alphaCache[url] !== undefined) return; if (isMissing) return; - queueMicrotask(() => { + setTimeout(() => { try { // Check if image has alpha channel const { width, height } = e.target; @@ -87,7 +91,7 @@ function Avatar({ url, size, alt = '', squircle, ...props }) { // Silent fail alphaCache[url] = false; } - }); + }, 1); }} /> )} diff --git a/src/components/background-service.jsx b/src/components/background-service.jsx index 15647fe1..64144832 100644 --- a/src/components/background-service.jsx +++ b/src/components/background-service.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { memo } from 'preact/compat'; import { useEffect, useRef, useState } from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; @@ -9,13 +10,24 @@ import useInterval from '../utils/useInterval'; import usePageVisibility from '../utils/usePageVisibility'; const STREAMING_TIMEOUT = 1000 * 3; // 3 seconds -const POLL_INTERVAL = 15_000; // 15 seconds +const POLL_INTERVAL = 20_000; // 20 seconds export default memo(function BackgroundService({ isLoggedIn }) { // Notifications service // - WebSocket to receive notifications when page is visible const [visible, setVisible] = useState(true); - usePageVisibility(setVisible); + const visibleTimeout = useRef(); + usePageVisibility((visible) => { + clearTimeout(visibleTimeout.current); + if (visible) { + setVisible(true); + } else { + visibleTimeout.current = setTimeout(() => { + setVisible(false); + }, POLL_INTERVAL); + } + }); + const checkLatestNotification = async (masto, instance, skipCheckMarkers) => { if (states.notificationsLast) { const notificationsIterator = masto.v1.notifications.list({ @@ -46,6 +58,7 @@ export default memo(function BackgroundService({ isLoggedIn }) { useEffect(() => { let sub; + let streamTimeout; let pollNotifications; if (isLoggedIn && visible) { const { masto, streaming, instance } = api(); @@ -56,7 +69,7 @@ export default memo(function BackgroundService({ isLoggedIn }) { let hasStreaming = false; // 2. Start streaming if (streaming) { - pollNotifications = setTimeout(() => { + streamTimeout = setTimeout(() => { (async () => { try { hasStreaming = true; @@ -94,7 +107,7 @@ export default memo(function BackgroundService({ isLoggedIn }) { return () => { sub?.unsubscribe?.(); sub = null; - clearTimeout(pollNotifications); + clearTimeout(streamTimeout); clearInterval(pollNotifications); }; }, [visible, isLoggedIn]); @@ -133,7 +146,7 @@ export default memo(function BackgroundService({ isLoggedIn }) { const currentCloakMode = states.settings.cloakMode; states.settings.cloakMode = !currentCloakMode; showToast({ - text: `Cloak mode ${currentCloakMode ? 'disabled' : 'enabled'}`, + text: currentCloakMode ? t`Cloak mode disabled` : t`Cloak mode enabled`, }); }); diff --git a/src/components/columns.jsx b/src/components/columns.jsx index 47036dce..0449c780 100644 --- a/src/components/columns.jsx +++ b/src/components/columns.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { useHotkeys } from 'react-hotkeys-hook'; import { useSnapshot } from 'valtio'; @@ -11,11 +12,18 @@ import Notifications from '../pages/notifications'; import Public from '../pages/public'; import Search from '../pages/search'; import Trending from '../pages/trending'; +import isRTL from '../utils/is-rtl'; import states from '../utils/states'; import useTitle from '../utils/useTitle'; +const scrollIntoViewOptions = { + block: 'nearest', + inline: 'nearest', + behavior: 'smooth', +}; + function Columns() { - useTitle('Home', '/'); + useTitle(t`Home`, '/'); const snapStates = useSnapshot(states); const { shortcuts } = snapStates; @@ -39,6 +47,8 @@ function Columns() { if (!Component) return null; // Don't show Search column with no query, for now if (type === 'search' && !params.query) return null; + // Don't show List column with no list, for now + if (type === 'list' && !params.id) return null; return ( <Component key={type + JSON.stringify(params)} {...params} columnMode /> ); @@ -47,12 +57,42 @@ function Columns() { useHotkeys(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => { try { const index = parseInt(handler.keys[0], 10) - 1; - document.querySelectorAll('#columns > *')[index].focus(); + const $column = document.querySelectorAll('#columns > *')[index]; + if ($column) { + $column.focus(); + $column.scrollIntoView(scrollIntoViewOptions); + } } catch (e) { console.error(e); } }); + useHotkeys(['[', ']'], (e, handler) => { + const key = handler.keys[0]; + const currentFocusedColumn = document.activeElement.closest('#columns > *'); + + const rtl = isRTL(); + const prevColKey = rtl ? ']' : '['; + const nextColKey = rtl ? '[' : ']'; + let $column; + + if (key === prevColKey) { + // If [, focus on left of focused column, else first column + $column = currentFocusedColumn + ? currentFocusedColumn.previousElementSibling + : document.querySelectorAll('#columns > *')[0]; + } else if (key === nextColKey) { + // If ], focus on right of focused column, else 2nd column + $column = currentFocusedColumn + ? currentFocusedColumn.nextElementSibling + : document.querySelectorAll('#columns > *')[1]; + } + if ($column) { + $column.focus(); + $column.scrollIntoView(scrollIntoViewOptions); + } + }); + return ( <div id="columns" @@ -67,6 +107,18 @@ function Columns() { states.showShortcutsSettings = true; } }} + onFocus={() => { + // Get current focused column + const currentFocusedColumn = + document.activeElement.closest('#columns > *'); + if (currentFocusedColumn) { + // Remove focus classes from all columns + // Add focus class to current focused column + document.querySelectorAll('#columns > *').forEach((column) => { + column.classList.toggle('focus', column === currentFocusedColumn); + }); + } + }} > {components} </div> diff --git a/src/components/compose-button.jsx b/src/components/compose-button.jsx index 3587c2f6..20a7e8d1 100644 --- a/src/components/compose-button.jsx +++ b/src/components/compose-button.jsx @@ -1,12 +1,23 @@ +import { t, Trans } from '@lingui/macro'; import { useHotkeys } from 'react-hotkeys-hook'; +import { useSnapshot } from 'valtio'; import openCompose from '../utils/open-compose'; +import openOSK from '../utils/open-osk'; import states from '../utils/states'; import Icon from './icon'; export default function ComposeButton() { + const snapStates = useSnapshot(states); + function handleButton(e) { + if (snapStates.composerState.minimized) { + states.composerState.minimized = false; + openOSK(); + return; + } + if (e.shiftKey) { const newWin = openCompose(); @@ -14,6 +25,7 @@ export default function ComposeButton() { states.showCompose = true; } } else { + openOSK(); states.showCompose = true; } } @@ -26,8 +38,15 @@ export default function ComposeButton() { }); return ( - <button type="button" id="compose-button" onClick={handleButton}> - <Icon icon="quill" size="xl" alt="Compose" /> + <button + type="button" + id="compose-button" + onClick={handleButton} + class={`${snapStates.composerState.minimized ? 'min' : ''} ${ + snapStates.composerState.publishing ? 'loading' : '' + } ${snapStates.composerState.publishingError ? 'error' : ''}`} + > + <Icon icon="quill" size="xl" alt={t`Compose`} /> </button> ); } diff --git a/src/components/compose-suspense.jsx b/src/components/compose-suspense.jsx new file mode 100644 index 00000000..63864bba --- /dev/null +++ b/src/components/compose-suspense.jsx @@ -0,0 +1,48 @@ +import { shouldPolyfill } from '@formatjs/intl-segmenter/should-polyfill'; +import { useEffect, useState } from 'preact/hooks'; + +import Loader from './loader'; + +const supportsIntlSegmenter = !shouldPolyfill(); + +function importIntlSegmenter() { + if (!supportsIntlSegmenter) { + return import('@formatjs/intl-segmenter/polyfill-force').catch(() => {}); + } +} + +function importCompose() { + return import('./compose'); +} + +export async function preload() { + try { + await importIntlSegmenter(); + importCompose(); + } catch (e) { + console.error(e); + } +} + +export default function ComposeSuspense(props) { + const [Compose, setCompose] = useState(null); + + useEffect(() => { + (async () => { + try { + if (supportsIntlSegmenter) { + const component = await importCompose(); + setCompose(component); + } else { + await importIntlSegmenter(); + const component = await importCompose(); + setCompose(component); + } + } catch (e) { + console.error(e); + } + })(); + }, []); + + return Compose?.default ? <Compose.default {...props} /> : <Loader />; +} diff --git a/src/components/compose.css b/src/components/compose.css index 5e8d3bcf..554bf0b8 100644 --- a/src/components/compose.css +++ b/src/components/compose.css @@ -16,16 +16,19 @@ } #compose-container .compose-top { - text-align: right; display: flex; justify-content: space-between; gap: 8px; align-items: center; - padding: 16px; + padding: 8px; position: sticky; top: 0; z-index: 100; white-space: nowrap; + + @media (min-width: 480px) { + padding: 16px; + } } #compose-container .compose-top .account-block { text-align: start; @@ -62,7 +65,7 @@ box-shadow: 0 -3px 12px -3px var(--drop-shadow-color); } #compose-container .status-preview:has(.status-badge:not(:empty)) { - border-top-right-radius: 8px; + border-start-end-radius: 8px; } #compose-container .status-preview :is(.content-container, .time) { pointer-events: none; @@ -95,6 +98,10 @@ 0 1px 10px var(--bg-color), 0 1px 10px var(--bg-color), 0 1px 10px var(--bg-color); z-index: 2; + + strong { + color: var(--red-color); + } } #_compose-container .status-preview-legend.reply-to { color: var(--reply-to-color); @@ -107,10 +114,10 @@ } #compose-container form { - --form-padding-inline: 12px; - --form-padding-block: 8px; + --form-spacing-inline: 4px; + --form-spacing-block: 0; /* border-radius: 16px; */ - padding: var(--form-padding-block) var(--form-padding-inline); + padding: var(--form-spacing-block) var(--form-spacing-inline); background-color: var(--bg-blur-color); /* background-image: linear-gradient(var(--bg-color) 85%, transparent); */ position: relative; @@ -118,6 +125,10 @@ --drop-shadow: 0 3px 6px -3px var(--drop-shadow-color); box-shadow: var(--drop-shadow); + @media (min-width: 480px) { + --form-spacing-inline: 8px; + } + @media (min-width: 40em) { border-radius: 16px; } @@ -150,8 +161,8 @@ display: flex; justify-content: space-between; align-items: center; - padding: 8px 0; - gap: 8px; + padding: var(--form-spacing-inline) 0; + gap: var(--form-spacing-inline); } #compose-container .toolbar.wrap { flex-wrap: wrap; @@ -178,6 +189,11 @@ white-space: nowrap; border: 2px solid transparent; vertical-align: middle; + + &.active { + filter: brightness(0.8); + background-color: var(--bg-color); + } } #compose-container .toolbar-button > * { vertical-align: middle; @@ -204,7 +220,7 @@ left: -100vw !important; } #compose-container .toolbar-button select { - background-color: transparent; + background-color: inherit; border: 0; padding: 0 0 0 8px; margin: 0; @@ -212,8 +228,8 @@ line-height: 1em; } #compose-container .toolbar-button:not(.show-field) select { - right: 0; - left: auto !important; + inset-inline-end: 0; + inset-inline-start: auto !important; } #compose-container .toolbar-button:not(:disabled):is( @@ -243,6 +259,39 @@ text-overflow: ellipsis; overflow: hidden; max-width: 100%; + min-width: 4ch; +} + +#compose-container .compose-footer { + .add-toolbar-button-group { + display: flex; + overflow: auto; + } + .add-sub-toolbar-button-group { + flex-grow: 1; + display: flex; + overflow: auto; + transition: 0.5s ease-in-out; + transition-property: opacity, width; + scrollbar-width: none; + padding-inline-end: 16px; + mask-image: linear-gradient( + var(--to-backward), + transparent 0, + black 16px, + black 100% + ); + + &::-webkit-scrollbar { + display: none; + } + + &[hidden] { + opacity: 0; + pointer-events: none; + width: 0; + } + } } #compose-container text-expander { @@ -294,19 +343,28 @@ height: 2.2em; } #compose-container .text-expander-menu li:is(:hover, :focus, [aria-selected]) { - color: var(--bg-color); - background-color: var(--link-color); -} -#compose-container - .text-expander-menu:hover - li[aria-selected]:not(:hover, :focus) { + background-color: var(--link-bg-color); color: var(--text-color); - background-color: var(--bg-color); +} +#compose-container .text-expander-menu li[aria-selected] { + box-shadow: inset 4px 0 0 0 var(--button-bg-color); + :dir(rtl) & { + box-shadow: inset -4px 0 0 0 var(--button-bg-color); + } +} +#compose-container .text-expander-menu li[data-more] { + &:not(:hover, :focus, [aria-selected]) { + color: var(--text-insignificant-color); + background-color: var(--bg-faded-color); + } + + font-size: 0.8em; + justify-content: center; } #compose-container .form-visibility-direct { --yellow-stripes: repeating-linear-gradient( - -45deg, + 135deg, var(--reply-to-faded-color), var(--reply-to-faded-color) 10px, var(--reply-to-faded-color) 10px, @@ -330,6 +388,21 @@ display: flex; gap: 8px; align-items: stretch; + + .media-error { + padding: 2px; + color: var(--orange-fg-color); + background-color: transparent; + border: 1.5px dashed transparent; + line-height: 1; + border-radius: 4px; + display: flex; + + &:is(:hover, :focus) { + background-color: var(--bg-color); + border-color: var(--orange-fg-color); + } + } } #compose-container .media-preview { flex-shrink: 0; @@ -469,14 +542,14 @@ display: flex; gap: 4px; align-items: center; - border-left: 1px solid var(--outline-color); - padding-left: 8px; + border-inline-start: 1px solid var(--outline-color); + padding-inline-start: 8px; } #compose-container .expires-in { flex-grow: 1; - border-left: 1px solid var(--outline-color); - padding-left: 8px; + border-inline-start: 1px solid var(--outline-color); + padding-inline-start: 8px; display: flex; gap: 4px; flex-wrap: wrap; @@ -489,6 +562,37 @@ color: var(--red-color); } +.compose-menu-add-media { + position: relative; + + .compose-menu-add-media-field { + position: absolute; + inset: 0; + opacity: 0; + cursor: inherit; + } +} + +.icon-gif { + display: inline-block !important; + min-width: 16px; + height: 16px; + font-size: 10px !important; + letter-spacing: -0.5px; + font-size-adjust: none; + overflow: hidden; + white-space: nowrap; + text-align: center; + line-height: 16px; + font-weight: bold; + text-rendering: optimizeSpeed; + + &:after { + display: block; + content: 'GIF'; + } +} + @media (display-mode: standalone) { /* No popping in standalone mode */ #compose-container .pop-button { @@ -496,9 +600,12 @@ } } -@media (min-width: 480px) { - #compose-container button[type='submit'] { +#compose-container button[type='submit'] { + border-radius: 8px; + + @media (min-width: 480px) { padding-inline: 24px; + font-size: 125%; } } @@ -590,51 +697,210 @@ } */ } +#mention-sheet { + height: 50vh; + + .accounts-list { + --list-gap: 1px; + list-style: none; + margin: 0; + padding: 8px 0; + display: flex; + flex-direction: column; + row-gap: var(--list-gap); + + &.loading { + opacity: 0.5; + } + + li { + display: flex; + flex-grow: 1; + /* align-items: center; */ + margin: 0 -8px; + padding: 8px; + gap: 8px; + position: relative; + justify-content: space-between; + border-radius: 8px; + /* align-items: center; */ + + &:hover { + background-image: linear-gradient( + var(--to-forward), + transparent 75%, + var(--link-bg-color) + ); + } + + &.selected { + background-image: linear-gradient( + var(--to-forward), + var(--bg-faded-color) 75%, + var(--link-bg-color) + ); + } + + &:before { + content: ''; + display: block; + border-top: var(--hairline-width) solid var(--divider-color); + position: absolute; + bottom: 0; + inset-inline-start: 58px; + inset-inline-end: 0; + } + + &:has(+ li:is(.selected, :hover)):before, + &:is(.selected, :hover):before { + opacity: 0; + } + + > button { + border-radius: 4px; + &:hover { + outline: 2px solid var(--button-bg-blur-color); + } + } + } + } +} + #custom-emojis-sheet { max-height: 50vh; max-height: 50dvh; -} -#custom-emojis-sheet main { - mask-image: none; -} -#custom-emojis-sheet .custom-emojis-list .section-header { - font-size: 80%; - text-transform: uppercase; - color: var(--text-insignificant-color); - padding: 8px 0 4px; - position: sticky; - top: 0; - background-color: var(--bg-blur-color); - backdrop-filter: blur(1px); -} -#custom-emojis-sheet .custom-emojis-list section { - display: flex; - flex-wrap: wrap; -} -#custom-emojis-sheet .custom-emojis-list button { - border-radius: 8px; - background-image: radial-gradient( - closest-side, - var(--img-bg-color), - transparent - ); -} -#custom-emojis-sheet .custom-emojis-list button:is(:hover, :focus) { - filter: none; - background-color: var(--bg-faded-color); -} -#custom-emojis-sheet .custom-emojis-list button img { - transition: transform 0.1s ease-out; -} -#custom-emojis-sheet .custom-emojis-list button:is(:hover, :focus) img { - transform: scale(1.5); + + header { + .loader-container { + margin: 0; + } + + form { + margin: 8px 0 0; + + input { + width: 100%; + min-width: 0; + } + } + } + + main { + mask-image: none; + min-height: 40vh; + padding-bottom: 88px; + } + + .custom-emojis-matches { + margin: 0; + padding: 0; + list-style: none; + display: flex; + flex-wrap: wrap; + } + + .custom-emojis-list { + .section-container { + position: relative; + content-visibility: auto; + content-intrinsic-size: auto 88px; + } + .section-header { + font-size: 80%; + text-transform: uppercase; + color: var(--text-insignificant-color); + padding: 8px 0 4px; + position: sticky; + top: 0; + background-color: var(--bg-color); + z-index: 1; + display: inline-block; + padding-inline-end: 8px; + pointer-events: none; + border-end-end-radius: 8px; + } + section { + display: flex; + flex-wrap: wrap; + } + button { + color: var(--text-color); + border-radius: 8px; + background-image: radial-gradient( + closest-side, + var(--img-bg-color), + transparent + ); + text-shadow: 0 1px 0 var(--bg-color); + position: relative; + min-width: 44px; + min-height: 44px; + font-variant-numeric: slashed-zero; + font-feature-settings: 'ss01'; + + &[data-title]:after { + max-width: 50vw; + pointer-events: none; + position: absolute; + content: attr(data-title); + left: 50%; + top: 0; + background-color: var(--bg-color); + padding: 2px 4px; + border-radius: 4px; + font-size: 12px; + border: 1px solid var(--text-color); + transform: translate(-50%, -110%); + opacity: 0; + transition: opacity 0.1s ease-out 0.1s; + font-family: var(--monospace-font); + line-height: 1; + } + &.edge-left[data-title]:after { + left: 0; + transform: translate(0, -110%); + } + &.edge-right[data-title]:after { + left: 100%; + transform: translate(-100%, -110%); + } + + &:is(:hover, :focus) { + z-index: 1; + filter: none; + background-color: var(--bg-faded-color); + + &[data-title]:after { + opacity: 1; + } + } + + img { + transition: transform 0.1s ease-out; + } + + &:is(:hover, :focus) img { + transform: scale(2); + } + &.edge-left img { + transform-origin: left center; + } + &.edge-right img { + transform-origin: right center; + } + + code { + font-size: 0.8em; + } + } + } } .compose-field-container { display: grid !important; - @media (width < 30em) { - margin-inline: calc(-1 * var(--form-padding-inline)); + @media (width < 480px) { + margin-inline: calc(-1 * var(--form-spacing-inline)); width: 100vw !important; max-width: 100vw; @@ -723,3 +989,205 @@ } } } + +@keyframes gif-shake { + 0% { + transform: rotate(0deg); + } + 25% { + transform: rotate(5deg); + } + 50% { + transform: rotate(0deg); + } + 75% { + transform: rotate(-5deg); + } + 100% { + transform: rotate(0deg); + } +} + +@keyframes jump-scare { + from { + opacity: 0.5; + transform: scale(0.25) translateX(80px); + } + to { + opacity: 1; + transform: scale(1) translateX(0); + } +} +@keyframes jump-scare-rtl { + from { + opacity: 0.5; + transform: scale(0.25) translateX(-80px); + } + to { + opacity: 1; + transform: scale(1) translateX(0); + } +} + +.add-button { + transform-origin: var(--forward) center; + background-color: var(--bg-blur-color) !important; + animation: jump-scare 0.2s ease-in-out both; + :dir(rtl) & { + animation-name: jump-scare-rtl; + } + + .icon { + transition: transform 0.3s ease-in-out; + } + &.active { + .icon { + transform: rotate(135deg); + } + } +} + +.gif-picker-button { + /* span { + font-weight: bold; + font-size: 11.5px; + display: block; + line-height: 1; + } */ + + &:is(:hover, :focus) { + .icon { + animation: gif-shake 0.3s 3; + } + } +} + +#gif-picker-sheet { + height: 50vh; + + form { + display: flex; + flex-direction: row; + gap: 8px; + align-items: center; + + input[type='search'] { + flex-grow: 1; + min-width: 0; + } + } + + main { + overflow-x: auto; + overflow-y: hidden; + mask-image: linear-gradient( + var(--to-forward), + transparent 2px, + black 16px, + black calc(100% - 16px), + transparent calc(100% - 2px) + ); + + @media (min-height: 480px) { + overflow-y: auto; + max-height: 50vh; + } + + &.loading { + opacity: 0.25; + } + + .ui-state { + min-height: 100px; + } + + ul { + min-height: 100px; + display: flex; + gap: 4px; + list-style: none; + padding: 8px 2px; + margin: 0; + + @media (min-height: 480px) { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + grid-auto-rows: 1fr; + } + + li { + list-style: none; + padding: 0; + margin: 0; + max-width: 100%; + display: flex; + + button { + padding: 4px; + margin: 0; + border: none; + background-color: transparent; + color: inherit; + cursor: pointer; + border-radius: 8px; + background-color: var(--bg-faded-color); + + @media (min-height: 480px) { + width: 100%; + text-align: center; + } + + &:is(:hover, :focus) { + background-color: var(--link-bg-color); + box-shadow: 0 0 0 2px var(--link-light-color); + filter: none; + } + } + + figure { + margin: 0; + padding: 0; + width: var(--figure-width); + max-width: 100%; + + @media (min-height: 480px) { + width: 100%; + text-align: center; + } + + figcaption { + font-size: 0.8em; + padding: 2px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + color: var(--text-insignificant-color); + } + } + + img { + background-color: var(--img-bg-color); + border-radius: 4px; + vertical-align: top; + object-fit: contain; + } + } + } + + .pagination { + display: flex; + justify-content: space-between; + gap: 8px; + padding: 0; + margin: 0; + position: sticky; + bottom: 0; + left: 0; + right: 0; + + @media (min-height: 480px) { + position: static; + } + } + } +} diff --git a/src/components/compose.jsx b/src/components/compose.jsx index 84034257..775fd637 100644 --- a/src/components/compose.jsx +++ b/src/components/compose.jsx @@ -1,24 +1,44 @@ import './compose.css'; - import '@github/text-expander-element'; + +import { msg, plural, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { MenuItem } from '@szhsin/react-menu'; import { deepEqual } from 'fast-equals'; -import { forwardRef } from 'preact/compat'; -import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; +import Fuse from 'fuse.js'; +import { forwardRef, memo } from 'preact/compat'; +import { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; import stringLength from 'string-length'; +// import { detectAll } from 'tinyld/light'; import { uid } from 'uid/single'; import { useDebouncedCallback, useThrottledCallback } from 'use-debounce'; +import useResizeObserver from 'use-resize-observer'; import { useSnapshot } from 'valtio'; +import poweredByGiphyURL from '../assets/powered-by-giphy.svg'; + import Menu2 from '../components/menu2'; import supportedLanguages from '../data/status-supported-languages'; import urlRegex from '../data/url-regex'; import { api } from '../utils/api'; import db from '../utils/db'; import emojifyText from '../utils/emojify-text'; +import i18nDuration from '../utils/i18n-duration'; +import isRTL from '../utils/is-rtl'; import localeMatch from '../utils/locale-match'; +import localeCode2Text from '../utils/localeCode2Text'; +import mem from '../utils/mem'; import openCompose from '../utils/open-compose'; +import pmem from '../utils/pmem'; +import prettyBytes from '../utils/pretty-bytes'; +import { fetchRelationships } from '../utils/relationships'; import shortenNumber from '../utils/shorten-number'; import showToast from '../utils/show-toast'; import states, { saveStatus } from '../utils/states'; @@ -41,7 +61,10 @@ import Loader from './loader'; import Modal from './modal'; import Status from './status'; -const { PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL } = import.meta.env; +const { + PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL, + PHANPY_GIPHY_API_KEY: GIPHY_API_KEY, +} = import.meta.env; const supportedLanguagesMap = supportedLanguages.reduce((acc, l) => { const [code, common, native] = l; @@ -57,16 +80,15 @@ const supportedLanguagesMap = supportedLanguages.reduce((acc, l) => { */ const expiryOptions = { - '5 minutes': 5 * 60, - '30 minutes': 30 * 60, - '1 hour': 60 * 60, - '6 hours': 6 * 60 * 60, - '12 hours': 12 * 60 * 60, - '1 day': 24 * 60 * 60, - '3 days': 3 * 24 * 60 * 60, - '7 days': 7 * 24 * 60 * 60, + 300: i18nDuration(5, 'minute'), + 1_800: i18nDuration(30, 'minute'), + 3_600: i18nDuration(1, 'hour'), + 21_600: i18nDuration(6, 'hour'), + 86_400: i18nDuration(1, 'day'), + 259_200: i18nDuration(3, 'day'), + 604_800: i18nDuration(1, 'week'), }; -const expirySeconds = Object.values(expiryOptions); +const expirySeconds = Object.keys(expiryOptions); const oneDay = 24 * 60 * 60; const expiresInFromExpiresAt = (expiresAt) => { @@ -87,7 +109,8 @@ const observer = new IntersectionObserver((entries) => { const { left, width } = entry.boundingClientRect; const { innerWidth } = window; if (left + width > innerWidth) { - menu.style.left = innerWidth - width - windowMargin + 'px'; + const insetInlineStart = isRTL() ? 'right' : 'left'; + menu.style[insetInlineStart] = innerWidth - width - windowMargin + 'px'; } } }); @@ -119,35 +142,34 @@ const MENTION_RE = new RegExp( // AI-generated, all other regexes are too complicated const HASHTAG_RE = new RegExp( - `(^|[^=\\/\\w])(#[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?)(?![\\/\\w])`, + `(^|[^=\\/\\w])(#[a-z0-9_]+([a-z0-9_.]+[a-z0-9_]+)?)(?![\\/\\w])`, 'ig', ); // https://github.com/mastodon/mastodon/blob/23e32a4b3031d1da8b911e0145d61b4dd47c4f96/app/models/custom_emoji.rb#L31 const SHORTCODE_RE_FRAGMENT = '[a-zA-Z0-9_]{2,}'; const SCAN_RE = new RegExp( - `([^A-Za-z0-9_:\\n]|^)(:${SHORTCODE_RE_FRAGMENT}:)(?=[^A-Za-z0-9_:]|$)`, + `(^|[^=\\/\\w])(:${SHORTCODE_RE_FRAGMENT}:)(?=[^A-Za-z0-9_:]|$)`, 'g', ); const segmenter = new Intl.Segmenter(); -function highlightText(text, { maxCharacters = Infinity }) { - // Accept text string, return formatted HTML string - // Escape all HTML special characters - let html = text +function escapeHTML(text) { + return text .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); - +} +function highlightText(text, { maxCharacters = Infinity }) { // Exceeded characters limit const { composerCharacterCount } = states; if (composerCharacterCount > maxCharacters) { // Highlight exceeded characters let withinLimitHTML = '', exceedLimitHTML = ''; - const htmlSegments = segmenter.segment(html); + const htmlSegments = segmenter.segment(text); for (const { segment, index } of htmlSegments) { if (index < maxCharacters) { withinLimitHTML += segment; @@ -158,13 +180,13 @@ function highlightText(text, { maxCharacters = Infinity }) { if (exceedLimitHTML) { exceedLimitHTML = '<mark class="compose-highlight-exceeded">' + - exceedLimitHTML + + escapeHTML(exceedLimitHTML) + '</mark>'; } - return withinLimitHTML + exceedLimitHTML; + return escapeHTML(withinLimitHTML) + exceedLimitHTML; } - return html + return escapeHTML(text) .replace(urlRegexObj, '$2<mark class="compose-highlight-url">$3</mark>') // URLs .replace(MENTION_RE, '$1<mark class="compose-highlight-mention">$2</mark>') // Mentions .replace(HASHTAG_RE, '$1<mark class="compose-highlight-hashtag">$2</mark>') // Hashtags @@ -174,6 +196,19 @@ function highlightText(text, { maxCharacters = Infinity }) { ); // Emoji shortcodes } +// const rtf = new Intl.RelativeTimeFormat(); +const RTF = mem((locale) => new Intl.RelativeTimeFormat(locale || undefined)); +const LF = mem((locale) => new Intl.ListFormat(locale || undefined)); + +const CUSTOM_EMOJIS_COUNT = 100; + +const ADD_LABELS = { + media: msg`Add media`, + customEmoji: msg`Add custom emoji`, + gif: msg`Add GIF`, + poll: msg`Add poll`, +}; + function Compose({ onClose, replyToStatus, @@ -182,6 +217,10 @@ function Compose({ standalone, hasOpener, }) { + const { i18n, _ } = useLingui(); + const rtf = RTF(i18n.locale); + const lf = LF(i18n.locale); + console.warn('RENDER COMPOSER'); const { masto, instance } = api(); const [uiState, setUIState] = useState('default'); @@ -197,11 +236,11 @@ function Compose({ const { statuses: { maxCharacters, - maxMediaAttachments, + maxMediaAttachments, // Beware: it can be undefined! charactersReservedPerUrl, } = {}, mediaAttachments: { - supportedMimeTypes = [], + supportedMimeTypes, imageSizeLimit, imageMatrixLimit, videoSizeLimit, @@ -268,10 +307,14 @@ function Compose({ focusTextarea(); setVisibility( visibility === 'public' && prefs['posting:default:visibility'] - ? prefs['posting:default:visibility'] + ? prefs['posting:default:visibility'].toLowerCase() : visibility, ); - setLanguage(language || prefs.postingDefaultLanguage || DEFAULT_LANG); + setLanguage( + language || + prefs['posting:default:language']?.toLowerCase() || + DEFAULT_LANG, + ); setSensitive(sensitive && !!spoilerText); } else if (editStatus) { const { visibility, language, sensitive, poll, mediaAttachments } = @@ -295,9 +338,13 @@ function Compose({ focusTextarea(); spoilerTextRef.current.value = spoilerText; setVisibility(visibility); - setLanguage(language || presf.postingDefaultLanguage || DEFAULT_LANG); + setLanguage( + language || + prefs['posting:default:language']?.toLowerCase() || + DEFAULT_LANG, + ); setSensitive(sensitive); - setPoll(composablePoll); + if (composablePoll) setPoll(composablePoll); setMediaAttachments(mediaAttachments); setUIState('default'); } catch (e) { @@ -310,13 +357,13 @@ function Compose({ focusTextarea(); console.log('Apply prefs', prefs); if (prefs['posting:default:visibility']) { - setVisibility(prefs['posting:default:visibility']); + setVisibility(prefs['posting:default:visibility'].toLowerCase()); } if (prefs['posting:default:language']) { - setLanguage(prefs['posting:default:language']); + setLanguage(prefs['posting:default:language'].toLowerCase()); } if (prefs['posting:default:sensitive']) { - setSensitive(prefs['posting:default:sensitive']); + setSensitive(!!prefs['posting:default:sensitive']); } } if (draftStatus) { @@ -339,7 +386,11 @@ function Compose({ focusTextarea(); if (spoilerText) spoilerTextRef.current.value = spoilerText; if (visibility) setVisibility(visibility); - setLanguage(language || prefs.postingDefaultLanguage || DEFAULT_LANG); + setLanguage( + language || + prefs['posting:default:language']?.toLowerCase() || + DEFAULT_LANG, + ); if (sensitive !== null) setSensitive(sensitive); if (composablePoll) setPoll(composablePoll); if (mediaAttachments) setMediaAttachments(mediaAttachments); @@ -348,7 +399,7 @@ function Compose({ const formRef = useRef(); - const beforeUnloadCopy = 'You have unsaved changes. Discard this post?'; + const beforeUnloadCopy = t`You have unsaved changes. Discard this post?`; const canClose = () => { const { value, dataset } = textareaRef.current; @@ -359,8 +410,11 @@ function Compose({ } // check for status and media attachments + const hasValue = (value || '') + .trim() + .replace(/^\p{White_Space}+|\p{White_Space}+$/gu, ''); const hasMediaAttachments = mediaAttachments.length > 0; - if (!value && !hasMediaAttachments) { + if (!hasValue && !hasMediaAttachments) { console.log('canClose', { value, mediaAttachments }); return true; } @@ -492,6 +546,7 @@ function Compose({ // I don't think this warrant a draft mode for a status that's already posted // Maybe it could be a big edit change but it should be rare if (editStatus) return; + if (states.composerState.minimized) return; const key = draftKey(); const backgroundDraft = { key, @@ -555,17 +610,38 @@ function Compose({ const handleItems = (e) => { const { items } = e.clipboardData || e.dataTransfer; const files = []; + const unsupportedFiles = []; for (let i = 0; i < items.length; i++) { const item = items[i]; if (item.kind === 'file') { const file = item.getAsFile(); - if (file && supportedMimeTypes.includes(file.type)) { + if ( + supportedMimeTypes !== undefined && + !supportedMimeTypes.includes(file.type) + ) { + unsupportedFiles.push(file); + } else { files.push(file); } } } + if (unsupportedFiles.length > 0) { + alert( + plural(unsupportedFiles.length, { + one: `File ${unsupportedFiles[0].name} is not supported.`, + other: `Files ${lf.format( + unsupportedFiles.map((f) => f.name), + )} are not supported.`, + }), + ); + } if (files.length > 0 && mediaAttachments.length >= maxMediaAttachments) { - alert(`You can only attach up to ${maxMediaAttachments} files.`); + alert( + plural(maxMediaAttachments, { + one: 'You can only attach up to 1 file.', + other: 'You can only attach up to # files.', + }), + ); return; } console.log({ files }); @@ -573,11 +649,19 @@ function Compose({ e.preventDefault(); e.stopPropagation(); // Auto-cut-off files to avoid exceeding maxMediaAttachments - const max = maxMediaAttachments - mediaAttachments.length; - const allowedFiles = files.slice(0, max); - if (allowedFiles.length <= 0) { - alert(`You can only attach up to ${maxMediaAttachments} files.`); - return; + let allowedFiles = files; + if (maxMediaAttachments !== undefined) { + const max = maxMediaAttachments - mediaAttachments.length; + allowedFiles = allowedFiles.slice(0, max); + if (allowedFiles.length <= 0) { + alert( + plural(maxMediaAttachments, { + one: 'You can only attach up to 1 file.', + other: 'You can only attach up to # files.', + }), + ); + return; + } } const mediaFiles = allowedFiles.map((file) => ({ file, @@ -607,8 +691,11 @@ function Compose({ }; }, [mediaAttachments]); + const [showMentionPicker, setShowMentionPicker] = useState(false); const [showEmoji2Picker, setShowEmoji2Picker] = useState(false); + const [showGIFPicker, setShowGIFPicker] = useState(false); + const [autoDetectedLanguages, setAutoDetectedLanguages] = useState(null); const [topSupportedLanguages, restSupportedLanguages] = useMemo(() => { const topLanguages = []; const restLanguages = []; @@ -619,7 +706,8 @@ function Compose({ code === language || code === prevLanguage.current || code === DEFAULT_LANG || - contentTranslationHideLanguages.includes(code) + contentTranslationHideLanguages.includes(code) || + (autoDetectedLanguages?.length && autoDetectedLanguages.includes(code)) ) { topLanguages.push(l); } else { @@ -635,7 +723,55 @@ function Compose({ commonA.localeCompare(commonB), ); return [topLanguages, restLanguages]; - }, [language]); + }, [language, autoDetectedLanguages]); + + const replyToStatusMonthsAgo = useMemo( + () => + !!replyToStatus?.createdAt && + Math.floor( + (Date.now() - new Date(replyToStatus.createdAt)) / + (1000 * 60 * 60 * 24 * 30), + ), + [replyToStatus], + ); + + const onMinimize = () => { + saveUnsavedDraft(); + states.composerState.minimized = true; + }; + + const gifPickerDisabled = + uiState === 'loading' || + (maxMediaAttachments !== undefined && + mediaAttachments.length >= maxMediaAttachments) || + !!poll; + + // If maxOptions is not defined or defined and is greater than 1, show poll button + const showPollButton = maxOptions == null || maxOptions > 1; + const pollButtonDisabled = + uiState === 'loading' || !!poll || !!mediaAttachments.length; + const onPollButtonClick = () => { + setPoll({ + options: ['', ''], + expiresIn: 24 * 60 * 60, // 1 day + multiple: false, + }); + }; + + const addSubToolbarRef = useRef(); + const [showAddButton, setShowAddButton] = useState(false); + useResizeObserver({ + ref: addSubToolbarRef, + box: 'border-box', + onResize: ({ width }) => { + // If scrollable, it's truncated + const { scrollWidth } = addSubToolbarRef.current; + const truncated = scrollWidth > width; + const overTruncated = width < 84; // roughly two buttons width + setShowAddButton(overTruncated || truncated); + addSubToolbarRef.current.hidden = overTruncated; + }, + }); return ( <div id="compose-container-outer"> @@ -656,10 +792,10 @@ function Compose({ /> )} {!standalone ? ( - <span> + <span class="compose-controls"> <button type="button" - class="light pop-button" + class="plain4 pop-button" disabled={uiState === 'loading'} onClick={() => { // If there are non-ID media attachments (not yet uploaded), show confirmation dialog because they are not going to be passed to the new window @@ -701,7 +837,14 @@ function Compose({ onClose(); }} > - <Icon icon="popout" alt="Pop out" /> + <Icon icon="popout" alt={t`Pop out`} /> + </button> + <button + type="button" + class="plain4 min-button" + onClick={onMinimize} + > + <Icon icon="minimize" alt={t`Minimize`} /> </button>{' '} <button type="button" @@ -713,7 +856,7 @@ function Compose({ } }} > - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> </span> ) : ( @@ -737,14 +880,20 @@ function Compose({ // } if (!window.opener) { - alert('Looks like you closed the parent window.'); + alert(t`Looks like you closed the parent window.`); return; } if (window.opener.__STATES__.showCompose) { - const yes = confirm( - 'Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?', - ); + if (window.opener.__STATES__.composerState?.publishing) { + alert( + t`Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later.`, + ); + return; + } + + let confirmText = t`Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?`; + const yes = confirm(confirmText); if (!yes) return; } @@ -769,12 +918,23 @@ function Compose({ }, }; window.opener.__COMPOSE__ = passData; // Pass it here instead of `showCompose` due to some weird proxy issue again - window.opener.__STATES__.showCompose = true; + if (window.opener.__STATES__.showCompose) { + window.opener.__STATES__.showCompose = false; + setTimeout(() => { + window.opener.__STATES__.showCompose = true; + }, 10); + } else { + window.opener.__STATES__.showCompose = true; + } + if (window.opener.__STATES__.composerState.minimized) { + // Maximize it + window.opener.__STATES__.composerState.minimized = false; + } }, }); }} > - <Icon icon="popin" alt="Pop in" /> + <Icon icon="popin" alt={t`Pop in`} /> </button> ) )} @@ -783,16 +943,32 @@ function Compose({ <div class="status-preview"> <Status status={replyToStatus} size="s" previewMode /> <div class="status-preview-legend reply-to"> - Replying to @ - {replyToStatus.account.acct || replyToStatus.account.username} - ’s post + {replyToStatusMonthsAgo > 0 ? ( + <Trans> + Replying to @ + {replyToStatus.account.acct || replyToStatus.account.username} + ’s post ( + <strong> + {rtf.format(-replyToStatusMonthsAgo, 'month')} + </strong> + ) + </Trans> + ) : ( + <Trans> + Replying to @ + {replyToStatus.account.acct || replyToStatus.account.username} + ’s post + </Trans> + )} </div> </div> )} {!!editStatus && ( <div class="status-preview"> <Status status={editStatus} size="s" previewMode /> - <div class="status-preview-legend">Editing source post</div> + <div class="status-preview-legend"> + <Trans>Editing source post</Trans> + </div> </div> )} <form @@ -838,11 +1014,11 @@ function Compose({ */ if (poll) { if (poll.options.length < 2) { - alert('Poll must have at least 2 options'); + alert(t`Poll must have at least 2 options`); return; } if (poll.options.some((option) => option === '')) { - alert('Some poll choices are empty'); + alert(t`Some poll choices are empty`); return; } } @@ -855,7 +1031,7 @@ function Compose({ ); if (hasNoDescriptions) { const yes = confirm( - 'Some media have no descriptions. Continue?', + t`Some media have no descriptions. Continue?`, ); if (!yes) return; } @@ -865,6 +1041,8 @@ function Compose({ spoilerText = (sensitive && spoilerText) || undefined; status = status === '' ? undefined : status; + // states.composerState.minimized = true; + states.composerState.publishing = true; setUIState('loading'); (async () => { try { @@ -898,12 +1076,14 @@ function Compose({ return result.status === 'rejected' || !result.value?.id; }) ) { + states.composerState.publishing = false; + states.composerState.publishingError = true; setUIState('error'); // Alert all the reasons results.forEach((result) => { if (result.status === 'rejected') { console.error(result); - alert(result.reason || `Attachment #${i} failed`); + alert(result.reason || t`Attachment #${i} failed`); } }); return; @@ -960,13 +1140,19 @@ function Compose({ } else { try { newStatus = await masto.v1.statuses.create(params, { - idempotencyKey: UID.current, + requestInit: { + headers: { + 'Idempotency-Key': UID.current, + }, + }, }); } catch (_) { // If idempotency key fails, try again without it newStatus = await masto.v1.statuses.create(params); } } + states.composerState.minimized = false; + states.composerState.publishing = false; setUIState('default'); // Close @@ -977,6 +1163,8 @@ function Compose({ instance, }); } catch (e) { + states.composerState.publishing = false; + states.composerState.publishingError = true; console.error(e); alert(e?.reason || e); setUIState('error'); @@ -989,7 +1177,7 @@ function Compose({ ref={spoilerTextRef} type="text" name="spoilerText" - placeholder="Content warning" + placeholder={t`Content warning`} disabled={uiState === 'loading'} class="spoiler-text-field" lang={language} @@ -1005,7 +1193,7 @@ function Compose({ /> <label class={`toolbar-button ${sensitive ? 'highlight' : ''}`} - title="Content warning or sensitive media" + title={t`Content warning or sensitive media`} > <input name="sensitive" @@ -1028,7 +1216,7 @@ function Compose({ class={`toolbar-button ${ visibility !== 'public' && !sensitive ? 'show-field' : '' } ${visibility !== 'public' ? 'highlight' : ''}`} - title={`Visibility: ${visibility}`} + title={visibility} > <Icon icon={visibilityIconsMap[visibility]} alt={visibility} /> <select @@ -1038,13 +1226,26 @@ function Compose({ setVisibility(e.target.value); }} disabled={uiState === 'loading' || !!editStatus} + dir="auto" > <option value="public"> - Public <Icon icon="earth" /> + <Trans>Public</Trans> + </option> + {(supports('@pleroma/local-visibility-post') || + supports('@akkoma/local-visibility-post')) && ( + <option value="local"> + <Trans>Local</Trans> + </option> + )} + <option value="unlisted"> + <Trans>Unlisted</Trans> + </option> + <option value="private"> + <Trans>Followers only</Trans> + </option> + <option value="direct"> + <Trans>Private mention</Trans> </option> - <option value="unlisted">Unlisted</option> - <option value="private">Followers only</option> - <option value="direct">Private mention</option> </select> </label>{' '} </div> @@ -1052,10 +1253,10 @@ function Compose({ ref={textareaRef} placeholder={ replyToStatus - ? 'Post your reply' + ? t`Post your reply` : editStatus - ? 'Edit your post' - : 'What are you doing?' + ? t`Edit your post` + : t`What are you doing?` } required={mediaAttachments?.length === 0} disabled={uiState === 'loading'} @@ -1075,6 +1276,22 @@ function Compose({ } return masto.v2.search.fetch(params); }} + onTrigger={(action) => { + if (action?.name === 'custom-emojis') { + setShowEmoji2Picker({ + defaultSearchTerm: action?.defaultSearchTerm || null, + }); + } else if (action?.name === 'mention') { + setShowMentionPicker({ + defaultSearchTerm: action?.defaultSearchTerm || null, + }); + } else if ( + action?.name === 'auto-detect-language' && + action?.languages + ) { + setAutoDetectedLanguages(action.languages); + } + }} /> {mediaAttachments?.length > 0 && ( <div class="media-attachments"> @@ -1090,7 +1307,10 @@ function Compose({ onDescriptionChange={(value) => { setMediaAttachments((attachments) => { const newAttachments = [...attachments]; - newAttachments[i].description = value; + newAttachments[i] = { + ...newAttachments[i], + description: value, + }; return newAttachments; }); }} @@ -1113,7 +1333,9 @@ function Compose({ setSensitive(sensitive); }} />{' '} - <span>Mark media as sensitive</span>{' '} + <span> + <Trans>Mark media as sensitive</Trans> + </span>{' '} <Icon icon={`eye-${sensitive ? 'close' : 'open'}`} /> </label> </div> @@ -1137,84 +1359,139 @@ function Compose({ }} /> )} - <div - class="toolbar wrap" - style={{ - justifyContent: 'flex-end', - }} - > - <span> - <label class="toolbar-button"> - <input - type="file" - accept={supportedMimeTypes.join(',')} - multiple={mediaAttachments.length < maxMediaAttachments - 1} - disabled={ - uiState === 'loading' || - mediaAttachments.length >= maxMediaAttachments || - !!poll - } - onChange={(e) => { - const files = e.target.files; - if (!files) return; - - const mediaFiles = Array.from(files).map((file) => ({ - file, - type: file.type, - size: file.size, - url: URL.createObjectURL(file), - id: null, // indicate uploaded state - description: null, - })); - console.log('MEDIA ATTACHMENTS', files, mediaFiles); - - // Validate max media attachments - if ( - mediaAttachments.length + mediaFiles.length > - maxMediaAttachments - ) { - alert( - `You can only attach up to ${maxMediaAttachments} files.`, - ); - } else { - setMediaAttachments((attachments) => { - return attachments.concat(mediaFiles); - }); - } - // Reset - e.target.value = ''; + <div class="toolbar compose-footer"> + <span class="add-toolbar-button-group spacer"> + {showAddButton && ( + <Menu2 + portal={{ + target: document.body, }} - /> - <Icon icon="attachment" /> - </label>{' '} - <button - type="button" - class="toolbar-button" - disabled={ - uiState === 'loading' || !!poll || !!mediaAttachments.length - } - onClick={() => { - setPoll({ - options: ['', ''], - expiresIn: 24 * 60 * 60, // 1 day - multiple: false, - }); - }} - > - <Icon icon="poll" alt="Add poll" /> - </button>{' '} - <button + containerProps={{ + style: { + zIndex: 1001, + }, + }} + menuButton={({ open }) => ( + <button + type="button" + class={`toolbar-button add-button ${ + open ? 'active' : '' + }`} + > + <Icon icon="plus" title={t`Add`} /> + </button> + )} + > + <MenuItem className="compose-menu-add-media"> + <label class="compose-menu-add-media-field"> + <FilePickerInput + hidden + supportedMimeTypes={supportedMimeTypes} + maxMediaAttachments={maxMediaAttachments} + mediaAttachments={mediaAttachments} + disabled={ + uiState === 'loading' || + mediaAttachments.length >= maxMediaAttachments || + !!poll + } + setMediaAttachments={setMediaAttachments} + /> + </label> + <Icon icon="media" /> <span>{_(ADD_LABELS.media)}</span> + </MenuItem> + <MenuItem + onClick={() => { + setShowEmoji2Picker(true); + }} + > + <Icon icon="emoji2" />{' '} + <span>{_(ADD_LABELS.customEmoji)}</span> + </MenuItem> + {!!states.settings.composerGIFPicker && ( + <MenuItem + disabled={gifPickerDisabled} + onClick={() => { + setShowGIFPicker(true); + }} + > + <span class="icon icon-gif" role="img" /> + <span>{_(ADD_LABELS.gif)}</span> + </MenuItem> + )} + <MenuItem + disabled={pollButtonDisabled} + onClick={onPollButtonClick} + > + <Icon icon="poll" /> <span>{_(ADD_LABELS.poll)}</span> + </MenuItem> + </Menu2> + )} + <span class="add-sub-toolbar-button-group" ref={addSubToolbarRef}> + <label class="toolbar-button"> + <FilePickerInput + supportedMimeTypes={supportedMimeTypes} + maxMediaAttachments={maxMediaAttachments} + mediaAttachments={mediaAttachments} + disabled={ + uiState === 'loading' || + mediaAttachments.length >= maxMediaAttachments || + !!poll + } + setMediaAttachments={setMediaAttachments} + /> + <Icon icon="media" alt={_(ADD_LABELS.media)} /> + </label> + {/* <button type="button" class="toolbar-button" disabled={uiState === 'loading'} onClick={() => { - setShowEmoji2Picker(true); + setShowMentionPicker(true); }} > - <Icon icon="emoji2" /> - </button> + <Icon icon="at" /> + </button> */} + <button + type="button" + class="toolbar-button" + disabled={uiState === 'loading'} + onClick={() => { + setShowEmoji2Picker(true); + }} + > + <Icon icon="emoji2" alt={_(ADD_LABELS.customEmoji)} /> + </button> + {!!states.settings.composerGIFPicker && ( + <button + type="button" + class="toolbar-button gif-picker-button" + disabled={gifPickerDisabled} + onClick={() => { + setShowGIFPicker(true); + }} + > + <span + class="icon icon-gif" + aria-label={_(ADD_LABELS.gif)} + /> + </button> + )} + {} + {showPollButton && ( + <> + <button + type="button" + class="toolbar-button" + disabled={pollButtonDisabled} + onClick={onPollButtonClick} + > + <Icon icon="poll" alt={_(ADD_LABELS.poll)} /> + </button> + </> + )} + </span> </span> - <div class="spacer" /> + {/* <div class="spacer" /> */} {uiState === 'loading' ? ( <Loader abrupt /> ) : ( @@ -1225,7 +1502,11 @@ function Compose({ )} <label class={`toolbar-button ${ - language !== prevLanguage.current ? 'highlight' : '' + language !== prevLanguage.current || + (autoDetectedLanguages?.length && + !autoDetectedLanguages.includes(language)) + ? 'highlight' + : '' }`} > <span class="icon-text"> @@ -1240,30 +1521,97 @@ function Compose({ store.session.set('currentLanguage', value || DEFAULT_LANG); }} disabled={uiState === 'loading'} + dir="auto" > - {topSupportedLanguages.map(([code, common, native]) => ( - <option value={code} key={code}> - {common} ({native}) - </option> - ))} + {topSupportedLanguages.map(([code, common, native]) => { + const commonText = localeCode2Text({ + code, + fallback: common, + }); + const showCommon = commonText !== native; + return ( + <option value={code} key={code}> + {showCommon ? `${native} - ${commonText}` : commonText} + </option> + ); + })} <hr /> - {restSupportedLanguages.map(([code, common, native]) => ( - <option value={code} key={code}> - {common} ({native}) - </option> - ))} + {restSupportedLanguages.map(([code, common, native]) => { + const commonText = localeCode2Text({ + code, + fallback: common, + }); + const showCommon = commonText !== native; + return ( + <option value={code} key={code}> + {showCommon ? `${native} - ${commonText}` : commonText} + </option> + ); + })} </select> </label>{' '} - <button - type="submit" - class="large" - disabled={uiState === 'loading'} - > - {replyToStatus ? 'Reply' : editStatus ? 'Update' : 'Post'} + <button type="submit" disabled={uiState === 'loading'}> + {replyToStatus + ? t`Reply` + : editStatus + ? t`Update` + : t({ + message: 'Post', + context: 'Submit button in composer', + })} </button> </div> </form> </div> + {showMentionPicker && ( + <Modal + onClick={(e) => { + if (e.target === e.currentTarget) { + setShowMentionPicker(false); + } + }} + > + <MentionModal + masto={masto} + instance={instance} + onClose={() => { + setShowMentionPicker(false); + }} + defaultSearchTerm={showMentionPicker?.defaultSearchTerm} + onSelect={(socialAddress) => { + const textarea = textareaRef.current; + if (!textarea) return; + const { selectionStart, selectionEnd } = textarea; + const text = textarea.value; + const textBeforeMention = text.slice(0, selectionStart); + const spaceBeforeMention = textBeforeMention + ? /[\s\t\n\r]$/.test(textBeforeMention) + ? '' + : ' ' + : ''; + const textAfterMention = text.slice(selectionEnd); + const spaceAfterMention = /^[\s\t\n\r]/.test(textAfterMention) + ? '' + : ' '; + const newText = + textBeforeMention + + spaceBeforeMention + + '@' + + socialAddress + + spaceAfterMention + + textAfterMention; + textarea.value = newText; + textarea.selectionStart = textarea.selectionEnd = + selectionEnd + + 1 + + socialAddress.length + + spaceAfterMention.length; + textarea.focus(); + textarea.dispatchEvent(new Event('input')); + }} + /> + </Modal> + )} {showEmoji2Picker && ( <Modal onClick={(e) => { @@ -1278,29 +1626,154 @@ function Compose({ onClose={() => { setShowEmoji2Picker(false); }} - onSelect={(emoji) => { - const emojiWithSpace = ` ${emoji} `; + defaultSearchTerm={showEmoji2Picker?.defaultSearchTerm} + onSelect={(emojiShortcode) => { const textarea = textareaRef.current; if (!textarea) return; const { selectionStart, selectionEnd } = textarea; const text = textarea.value; + const textBeforeEmoji = text.slice(0, selectionStart); + const spaceBeforeEmoji = textBeforeEmoji + ? /[\s\t\n\r]$/.test(textBeforeEmoji) + ? '' + : ' ' + : ''; + const textAfterEmoji = text.slice(selectionEnd); + const spaceAfterEmoji = /^[\s\t\n\r]/.test(textAfterEmoji) + ? '' + : ' '; const newText = - text.slice(0, selectionStart) + - emojiWithSpace + - text.slice(selectionEnd); + textBeforeEmoji + + spaceBeforeEmoji + + emojiShortcode + + spaceAfterEmoji + + textAfterEmoji; textarea.value = newText; textarea.selectionStart = textarea.selectionEnd = - selectionEnd + emojiWithSpace.length; + selectionEnd + emojiShortcode.length + spaceAfterEmoji.length; textarea.focus(); textarea.dispatchEvent(new Event('input')); }} /> </Modal> )} + {showGIFPicker && ( + <Modal + onClick={(e) => { + if (e.target === e.currentTarget) { + setShowGIFPicker(false); + } + }} + > + <GIFPickerModal + onClose={() => setShowGIFPicker(false)} + onSelect={({ url, type, alt_text }) => { + console.log('GIF URL', url); + if (mediaAttachments.length >= maxMediaAttachments) { + alert( + plural(maxMediaAttachments, { + one: 'You can only attach up to 1 file.', + other: 'You can only attach up to # files.', + }), + ); + return; + } + // Download the GIF and insert it as media attachment + (async () => { + let theToast; + try { + theToast = showToast({ + text: t`Downloading GIF…`, + duration: -1, + }); + const blob = await fetch(url, { + referrerPolicy: 'no-referrer', + }).then((res) => res.blob()); + const file = new File( + [blob], + type === 'video/mp4' ? 'video.mp4' : 'image.gif', + { + type, + }, + ); + const newMediaAttachments = [ + ...mediaAttachments, + { + file, + type, + size: file.size, + id: null, + description: alt_text || '', + }, + ]; + setMediaAttachments(newMediaAttachments); + theToast?.hideToast?.(); + } catch (err) { + console.error(err); + theToast?.hideToast?.(); + showToast(t`Failed to download GIF`); + } + })(); + }} + /> + </Modal> + )} </div> ); } +function FilePickerInput({ + hidden, + supportedMimeTypes, + maxMediaAttachments, + mediaAttachments, + disabled = false, + setMediaAttachments, +}) { + return ( + <input + type="file" + hidden={hidden} + accept={supportedMimeTypes?.join(',')} + multiple={ + maxMediaAttachments === undefined || + maxMediaAttachments - mediaAttachments >= 2 + } + disabled={disabled} + onChange={(e) => { + const files = e.target.files; + if (!files) return; + + const mediaFiles = Array.from(files).map((file) => ({ + file, + type: file.type, + size: file.size, + url: URL.createObjectURL(file), + id: null, // indicate uploaded state + description: null, + })); + console.log('MEDIA ATTACHMENTS', files, mediaFiles); + + // Validate max media attachments + if (mediaAttachments.length + mediaFiles.length > maxMediaAttachments) { + alert( + plural(maxMediaAttachments, { + one: 'You can only attach up to 1 file.', + other: 'You can only attach up to # files.', + }), + ); + } else { + setMediaAttachments((attachments) => { + return attachments.concat(mediaFiles); + }); + } + // Reset + e.target.value = ''; + }} + /> + ); +} + function autoResizeTextarea(textarea) { if (!textarea) return; const { value, offsetHeight, scrollHeight, clientHeight } = textarea; @@ -1313,25 +1786,55 @@ function autoResizeTextarea(textarea) { } } +async function _getCustomEmojis(instance, masto) { + const emojis = await masto.v1.customEmojis.list(); + const visibleEmojis = emojis.filter((e) => e.visibleInPicker); + const searcher = new Fuse(visibleEmojis, { + keys: ['shortcode'], + findAllMatches: true, + }); + return [visibleEmojis, searcher]; +} +const getCustomEmojis = pmem(_getCustomEmojis, { + // Limit by time to reduce memory usage + // Cached by instance + matchesArg: (cacheKeyArg, keyArg) => cacheKeyArg.instance === keyArg.instance, + maxAge: 30 * 60 * 1000, // 30 minutes +}); + +const detectLangs = async (text) => { + const { detectAll } = await import('tinyld/light'); + const langs = detectAll(text); + if (langs?.length) { + // return max 2 + return langs.slice(0, 2).map((lang) => lang.lang); + } + return null; +}; + const Textarea = forwardRef((props, ref) => { - const { masto } = api(); + const { masto, instance } = api(); const [text, setText] = useState(ref.current?.value || ''); - const { maxCharacters, performSearch = () => {}, ...textareaProps } = props; + const { + maxCharacters, + performSearch = () => {}, + onTrigger = () => {}, + ...textareaProps + } = props; // const snapStates = useSnapshot(states); // const charCount = snapStates.composerCharacterCount; - const customEmojis = useRef(); + // const customEmojis = useRef(); + const searcherRef = useRef(); useEffect(() => { - (async () => { - try { - const emojis = await masto.v1.customEmojis.list(); - console.log({ emojis }); - customEmojis.current = emojis; - } catch (e) { - // silent fail + getCustomEmojis(instance, masto) + .then((r) => { + const [emojis, searcher] = r; + searcherRef.current = searcher; + }) + .catch((e) => { console.error(e); - } - })(); + }); }, []); const textExpanderRef = useRef(); @@ -1357,23 +1860,27 @@ const Textarea = forwardRef((props, ref) => { // const emojis = customEmojis.current.filter((emoji) => // emoji.shortcode.startsWith(text), // ); - const emojis = filterShortcodes(customEmojis.current, text); + // const emojis = filterShortcodes(customEmojis.current, text); + const results = searcherRef.current?.search(text, { + limit: 5, + }); let html = ''; - emojis.forEach((emoji) => { + results.forEach(({ item: emoji }) => { const { shortcode, url } = emoji; html += ` <li role="option" data-value="${encodeHTML(shortcode)}"> <img src="${encodeHTML( url, )}" width="16" height="16" alt="" loading="lazy" /> - :${encodeHTML(shortcode)}: + ${encodeHTML(shortcode)} </li>`; }); + html += `<li role="option" data-value="" data-more="${text}">${t`More…`}</li>`; // console.log({ emojis, html }); menu.innerHTML = html; provide( Promise.resolve({ - matched: emojis.length > 0, + matched: results.length > 0, fragment: menu, }), ); @@ -1421,7 +1928,9 @@ const Textarea = forwardRef((props, ref) => { </span> <span> <b>${displayNameWithEmoji || username}</b> - <br>@${encodeHTML(acct)} + <br><span class="bidi-isolate">@${encodeHTML( + acct, + )}</span> </span> </li> `; @@ -1441,8 +1950,11 @@ const Textarea = forwardRef((props, ref) => { </li> `; } - menu.innerHTML = html; }); + if (type === 'accounts') { + html += `<li role="option" data-value="" data-more="${text}">${t`More…`}</li>`; + } + menu.innerHTML = html; console.log('MENU', results, menu); resolve({ matched: results.length > 0, @@ -1460,10 +1972,33 @@ const Textarea = forwardRef((props, ref) => { handleValue = (e) => { const { key, item } = e.detail; + const { value, more } = item.dataset; if (key === ':') { - e.detail.value = `:${item.dataset.value}:`; + e.detail.value = value ? `:${value}:` : '​'; // zero-width space + if (more) { + // Prevent adding space after the above value + e.detail.continue = true; + + setTimeout(() => { + onTrigger?.({ + name: 'custom-emojis', + defaultSearchTerm: more, + }); + }, 300); + } + } else if (key === '@') { + e.detail.value = value ? `@${value} ` : '​'; // zero-width space + if (more) { + e.detail.continue = true; + setTimeout(() => { + onTrigger?.({ + name: 'mention', + defaultSearchTerm: more, + }); + }, 300); + } } else { - e.detail.value = `${key}${item.dataset.value}`; + e.detail.value = `${key}${value}`; } }; @@ -1547,6 +2082,28 @@ const Textarea = forwardRef((props, ref) => { // Newline to prevent multiple line breaks at the end from being collapsed, no idea why }, 500); + const debouncedAutoDetectLanguage = useDebouncedCallback(() => { + // Make use of the highlightRef to get the DOM + // Clone the dom + const dom = composeHighlightRef.current?.cloneNode(true); + if (!dom) return; + // Remove mark + dom.querySelectorAll('mark').forEach((mark) => { + mark.remove(); + }); + const text = dom.innerText?.trim(); + if (!text) return; + (async () => { + const langs = await detectLangs(text); + if (langs?.length) { + onTrigger?.({ + name: 'auto-detect-language', + languages: langs, + }); + } + })(); + }, 2000); + return ( <text-expander ref={textExpanderRef} @@ -1608,11 +2165,13 @@ const Textarea = forwardRef((props, ref) => { }} onInput={(e) => { const { target } = e; - const text = target.value; + // Replace zero-width space + const text = target.value.replace(/\u200b/g, ''); setText(text); autoResizeTextarea(target); props.onInput?.(e); throttleHighlightText(text); + debouncedAutoDetectLanguage(); }} style={{ width: '100%', @@ -1640,30 +2199,44 @@ function CharCountMeter({ maxCharacters = 500, hidden }) { const charCount = snapStates.composerCharacterCount; const leftChars = maxCharacters - charCount; if (hidden) { - return <meter class="donut" hidden />; + return <span class="char-counter" hidden />; } return ( - <meter - class={`donut ${ - leftChars <= -10 - ? 'explode' - : leftChars <= 0 - ? 'danger' - : leftChars <= 20 - ? 'warning' - : '' - }`} - value={charCount} - max={maxCharacters} - data-left={leftChars} + <span + class="char-counter" title={`${leftChars}/${maxCharacters}`} style={{ '--percentage': (charCount / maxCharacters) * 100, }} - /> + > + <meter + class={`${ + leftChars <= -10 + ? 'explode' + : leftChars <= 0 + ? 'danger' + : leftChars <= 20 + ? 'warning' + : '' + }`} + value={charCount} + max={maxCharacters} + /> + <span class="counter">{leftChars}</span> + </span> ); } +function scaleDimension(matrix, matrixLimit, width, height) { + // matrix = number of pixels + // matrixLimit = max number of pixels + // Calculate new width and height, downsize to within the limit, preserve aspect ratio, no decimals + const scalingFactor = Math.sqrt(matrixLimit / matrix); + const newWidth = Math.floor(width * scalingFactor); + const newHeight = Math.floor(height * scalingFactor); + return { newWidth, newHeight }; +} + function MediaAttachment({ attachment, disabled, @@ -1671,6 +2244,7 @@ function MediaAttachment({ onDescriptionChange = () => {}, onRemove = () => {}, }) { + const { i18n } = useLingui(); const [uiState, setUIState] = useState('default'); const supportsEdit = supports('@mastodon/edit-media-attributes'); const { type, id, file } = attachment; @@ -1679,12 +2253,90 @@ function MediaAttachment({ [file, attachment.url], ); console.log({ attachment }); + + const checkMaxError = !!file?.size; + const configuration = checkMaxError ? getCurrentInstanceConfiguration() : {}; + const { + mediaAttachments: { + imageSizeLimit, + imageMatrixLimit, + videoSizeLimit, + videoMatrixLimit, + videoFrameRateLimit, + } = {}, + } = configuration || {}; + + const [maxError, setMaxError] = useState(() => { + if (!checkMaxError) return null; + if ( + type.startsWith('image') && + imageSizeLimit && + file.size > imageSizeLimit + ) { + return { + type: 'imageSizeLimit', + details: { + imageSize: file.size, + imageSizeLimit, + }, + }; + } else if ( + type.startsWith('video') && + videoSizeLimit && + file.size > videoSizeLimit + ) { + return { + type: 'videoSizeLimit', + details: { + videoSize: file.size, + videoSizeLimit, + }, + }; + } + return null; + }); + + const [imageMatrix, setImageMatrix] = useState({}); + useEffect(() => { + if (!checkMaxError || !imageMatrixLimit) return; + if (imageMatrix?.matrix > imageMatrixLimit) { + setMaxError({ + type: 'imageMatrixLimit', + details: { + imageMatrix: imageMatrix?.matrix, + imageMatrixLimit, + width: imageMatrix?.width, + height: imageMatrix?.height, + }, + }); + } + }, [imageMatrix, imageMatrixLimit, checkMaxError]); + + const [videoMatrix, setVideoMatrix] = useState({}); + useEffect(() => { + if (!checkMaxError || !videoMatrixLimit) return; + if (videoMatrix?.matrix > videoMatrixLimit) { + setMaxError({ + type: 'videoMatrixLimit', + details: { + videoMatrix: videoMatrix?.matrix, + videoMatrixLimit, + width: videoMatrix?.width, + height: videoMatrix?.height, + }, + }); + } + }, [videoMatrix, videoMatrixLimit, checkMaxError]); + const [description, setDescription] = useState(attachment.description); const [suffixType, subtype] = type.split('/'); const debouncedOnDescriptionChange = useDebouncedCallback( onDescriptionChange, 250, ); + useEffect(() => { + debouncedOnDescriptionChange(description); + }, [description, debouncedOnDescriptionChange]); const [showModal, setShowModal] = useState(false); const textareaRef = useRef(null); @@ -1704,7 +2356,9 @@ function MediaAttachment({ <> {!!id && !supportsEdit ? ( <div class="media-desc"> - <span class="tag">Uploaded</span> + <span class="tag"> + <Trans>Uploaded</Trans> + </span> <p title={description}> {attachment.description || <i>No description</i>} </p> @@ -1716,9 +2370,9 @@ function MediaAttachment({ lang={lang} placeholder={ { - image: 'Image description', - video: 'Video description', - audio: 'Audio description', + image: t`Image description`, + video: t`Video description`, + audio: t`Audio description`, }[suffixType] } autoCapitalize="sentences" @@ -1733,7 +2387,7 @@ function MediaAttachment({ onInput={(e) => { const { value } = e.target; setDescription(value); - debouncedOnDescriptionChange(value); + // debouncedOnDescriptionChange(value); }} ></textarea> )} @@ -1747,6 +2401,58 @@ function MediaAttachment({ }; }, []); + const maxErrorToast = useRef(null); + + const maxErrorText = (err) => { + const { type, details } = err; + switch (type) { + case 'imageSizeLimit': { + const { imageSize, imageSizeLimit } = details; + return t`File size too large. Uploading might encounter issues. Try reduce the file size from ${prettyBytes( + imageSize, + )} to ${prettyBytes(imageSizeLimit)} or lower.`; + } + case 'imageMatrixLimit': { + const { imageMatrix, imageMatrixLimit, width, height } = details; + const { newWidth, newHeight } = scaleDimension( + imageMatrix, + imageMatrixLimit, + width, + height, + ); + return t`Dimension too large. Uploading might encounter issues. Try reduce dimension from ${i18n.number( + width, + )}×${i18n.number(height)}px to ${i18n.number(newWidth)}×${i18n.number( + newHeight, + )}px.`; + } + case 'videoSizeLimit': { + const { videoSize, videoSizeLimit } = details; + return t`File size too large. Uploading might encounter issues. Try reduce the file size from ${prettyBytes( + videoSize, + )} to ${prettyBytes(videoSizeLimit)} or lower.`; + } + case 'videoMatrixLimit': { + const { videoMatrix, videoMatrixLimit, width, height } = details; + const { newWidth, newHeight } = scaleDimension( + videoMatrix, + videoMatrixLimit, + width, + height, + ); + return t`Dimension too large. Uploading might encounter issues. Try reduce dimension from ${i18n.number( + width, + )}×${i18n.number(height)}px to ${i18n.number(newWidth)}×${i18n.number( + newHeight, + )}px.`; + } + case 'videoFrameRateLimit': { + // Not possible to detect this on client-side for now + return t`Frame rate too high. Uploading might encounter issues.`; + } + } + }; + return ( <> <div class="media-attachment"> @@ -1758,9 +2464,38 @@ function MediaAttachment({ }} > {suffixType === 'image' ? ( - <img src={url} alt="" /> + <img + src={url} + alt="" + onLoad={(e) => { + if (!checkMaxError) return; + const { naturalWidth, naturalHeight } = e.target; + setImageMatrix({ + matrix: naturalWidth * naturalHeight, + width: naturalWidth, + height: naturalHeight, + }); + }} + /> ) : suffixType === 'video' || suffixType === 'gifv' ? ( - <video src={url} playsinline muted /> + <video + src={url + '#t=0.1'} // Make Safari show 1st-frame preview + playsinline + muted + disablePictureInPicture + preload="metadata" + onLoadedMetadata={(e) => { + if (!checkMaxError) return; + const { videoWidth, videoHeight } = e.target; + if (videoWidth && videoHeight) { + setVideoMatrix({ + matrix: videoWidth * videoHeight, + width: videoWidth, + height: videoHeight, + }); + } + }} + /> ) : suffixType === 'audio' ? ( <audio src={url} controls /> ) : null} @@ -1773,16 +2508,32 @@ function MediaAttachment({ disabled={disabled} onClick={onRemove} > - <Icon icon="x" /> + <Icon icon="x" alt={t`Remove`} /> </button> + {!!maxError && ( + <button + type="button" + class="media-error" + title={maxErrorText(maxError)} + onClick={() => { + if (maxErrorToast.current) { + maxErrorToast.current.hideToast(); + } + maxErrorToast.current = showToast({ + text: maxErrorText(maxError), + duration: 10_000, + }); + }} + > + <Icon icon="alert" alt={t`Error`} /> + </button> + )} </div> </div> {showModal && ( <Modal - onClick={(e) => { - if (e.target === e.currentTarget) { - setShowModal(false); - } + onClose={() => { + setShowModal(false); }} > <div id="media-sheet" class="sheet sheet-max"> @@ -1793,15 +2544,15 @@ function MediaAttachment({ setShowModal(false); }} > - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> <header> <h2> { { - image: 'Edit image description', - video: 'Edit video description', - audio: 'Edit audio description', + image: t`Edit image description`, + video: t`Edit video description`, + audio: t`Edit audio description`, }[suffixType] } </h2> @@ -1836,8 +2587,8 @@ function MediaAttachment({ position="anchor" overflow="auto" menuButton={ - <button type="button" title="More" class="plain"> - <Icon icon="more" size="l" alt="More" /> + <button type="button" class="plain"> + <Icon icon="more" size="l" alt={t`More`} /> </button> } > @@ -1846,7 +2597,7 @@ function MediaAttachment({ onClick={() => { setUIState('loading'); toastRef.current = showToast({ - text: 'Generating description. Please wait...', + text: t`Generating description. Please wait…`, duration: -1, }); // POST with multipart @@ -1865,9 +2616,9 @@ function MediaAttachment({ } catch (e) { console.error(e); showToast( - `Failed to generate description${ - e?.message ? `: ${e.message}` : '' - }`, + e.message + ? t`Failed to generate description: ${e.message}` + : t`Failed to generate description`, ); } finally { setUIState('default'); @@ -1877,8 +2628,71 @@ function MediaAttachment({ }} > <Icon icon="sparkles2" /> - <span>Generate description…</span> + {lang && lang !== 'en' ? ( + <small> + <Trans>Generate description…</Trans> + <br /> + (English) + </small> + ) : ( + <span> + <Trans>Generate description…</Trans> + </span> + )} </MenuItem> + {!!lang && lang !== 'en' && ( + <MenuItem + disabled={uiState === 'loading'} + onClick={() => { + setUIState('loading'); + toastRef.current = showToast({ + text: t`Generating description. Please wait…`, + duration: -1, + }); + // POST with multipart + (async function () { + try { + const body = new FormData(); + body.append('image', file); + const params = `?lang=${lang}`; + const response = await fetch( + IMG_ALT_API_URL + params, + { + method: 'POST', + body, + }, + ).then((r) => r.json()); + if (response.error) { + throw new Error(response.error); + } + setDescription(response.description); + } catch (e) { + console.error(e); + showToast( + t`Failed to generate description${ + e?.message ? `: ${e.message}` : '' + }`, + ); + } finally { + setUIState('default'); + toastRef.current?.hideToast?.(); + } + })(); + }} + > + <Icon icon="sparkles2" /> + <small> + <Trans>Generate description…</Trans> + <br /> + <Trans> + ({localeCode2Text(lang)}){' '} + <span class="more-insignificant"> + — experimental + </span> + </Trans> + </small> + </MenuItem> + )} </Menu2> )} <button @@ -1889,7 +2703,7 @@ function MediaAttachment({ }} disabled={uiState === 'loading'} > - Done + <Trans>Done</Trans> </button> </footer> </div> @@ -1911,6 +2725,7 @@ function Poll({ minExpiration, maxCharactersPerOption, }) { + const { _ } = useLingui(); const { options, expiresIn, multiple } = poll; return ( @@ -1924,7 +2739,7 @@ function Poll({ value={option} disabled={disabled} maxlength={maxCharactersPerOption} - placeholder={`Choice ${i + 1}`} + placeholder={t`Choice ${i + 1}`} lang={lang} spellCheck="true" dir="auto" @@ -1943,7 +2758,7 @@ function Poll({ onInput(poll); }} > - <Icon icon="x" size="s" /> + <Icon icon="x" size="s" alt={t`Remove`} /> </button> </div> ))} @@ -1971,10 +2786,10 @@ function Poll({ onInput(poll); }} />{' '} - Multiple choices + <Trans>Multiple choices</Trans> </label> <label class="expires-in"> - Duration{' '} + <Trans>Duration</Trans>{' '} <select value={expiresIn} disabled={disabled} @@ -1985,12 +2800,12 @@ function Poll({ }} > {Object.entries(expiryOptions) - .filter(([label, value]) => { + .filter(([value]) => { return value >= minExpiration && value <= maxExpiration; }) - .map(([label, value]) => ( + .map(([value, label]) => ( <option value={value} key={value}> - {label} + {label()} </option> ))} </select> @@ -2005,7 +2820,7 @@ function Poll({ onInput(null); }} > - Remove poll + <Trans>Remove poll</Trans> </button> </div> </div> @@ -2031,16 +2846,16 @@ function filterShortcodes(emojis, searchTerm) { return bothStartWith ? a.length - b.length : aStartsWith - ? -1 - : bStartsWith - ? 1 - : bothContain - ? a.length - b.length - : aContains - ? -1 - : bContains - ? 1 - : 0; + ? -1 + : bStartsWith + ? 1 + : bothContain + ? a.length - b.length + : aContains + ? -1 + : bContains + ? 1 + : 0; }) .slice(0, 5); } @@ -2060,46 +2875,250 @@ function removeNullUndefined(obj) { return obj; } +function MentionModal({ + onClose = () => {}, + onSelect = () => {}, + defaultSearchTerm, +}) { + const { masto } = api(); + const [uiState, setUIState] = useState('default'); + const [accounts, setAccounts] = useState([]); + const [relationshipsMap, setRelationshipsMap] = useState({}); + + const [selectedIndex, setSelectedIndex] = useState(0); + + const loadRelationships = async (accounts) => { + if (!accounts?.length) return; + const relationships = await fetchRelationships(accounts, relationshipsMap); + if (relationships) { + setRelationshipsMap({ + ...relationshipsMap, + ...relationships, + }); + } + }; + + const loadAccounts = (term) => { + if (!term) return; + setUIState('loading'); + (async () => { + try { + const accounts = await masto.v1.accounts.search.list({ + q: term, + limit: 40, + resolve: false, + }); + setAccounts(accounts); + loadRelationships(accounts); + setUIState('default'); + } catch (e) { + setUIState('error'); + console.error(e); + } + })(); + }; + + const debouncedLoadAccounts = useDebouncedCallback(loadAccounts, 1000); + + useEffect(() => { + loadAccounts(); + }, [loadAccounts]); + + const inputRef = useRef(); + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus(); + // Put cursor at the end + if (inputRef.current.value) { + inputRef.current.selectionStart = inputRef.current.value.length; + inputRef.current.selectionEnd = inputRef.current.value.length; + } + } + }, []); + + useEffect(() => { + if (defaultSearchTerm) { + loadAccounts(defaultSearchTerm); + } + }, [defaultSearchTerm]); + + const selectAccount = (account) => { + const socialAddress = account.acct; + onSelect(socialAddress); + onClose(); + }; + + useHotkeys( + 'enter', + () => { + const selectedAccount = accounts[selectedIndex]; + if (selectedAccount) { + selectAccount(selectedAccount); + } + }, + { + preventDefault: true, + enableOnFormTags: ['input'], + }, + ); + + const listRef = useRef(); + useHotkeys( + 'down', + () => { + if (selectedIndex < accounts.length - 1) { + setSelectedIndex(selectedIndex + 1); + } else { + setSelectedIndex(0); + } + setTimeout(() => { + const selectedItem = listRef.current.querySelector('.selected'); + if (selectedItem) { + selectedItem.scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center', + }); + } + }, 1); + }, + { + preventDefault: true, + enableOnFormTags: ['input'], + }, + ); + + useHotkeys( + 'up', + () => { + if (selectedIndex > 0) { + setSelectedIndex(selectedIndex - 1); + } else { + setSelectedIndex(accounts.length - 1); + } + setTimeout(() => { + const selectedItem = listRef.current.querySelector('.selected'); + if (selectedItem) { + selectedItem.scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center', + }); + } + }, 1); + }, + { + preventDefault: true, + enableOnFormTags: ['input'], + }, + ); + + return ( + <div id="mention-sheet" class="sheet"> + {!!onClose && ( + <button type="button" class="sheet-close" onClick={onClose}> + <Icon icon="x" alt={t`Close`} /> + </button> + )} + <header> + <form + onSubmit={(e) => { + e.preventDefault(); + debouncedLoadAccounts.flush?.(); + // const searchTerm = inputRef.current.value; + // debouncedLoadAccounts(searchTerm); + }} + > + <input + ref={inputRef} + required + type="search" + class="block" + placeholder={t`Search accounts`} + onInput={(e) => { + const { value } = e.target; + debouncedLoadAccounts(value); + }} + autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellCheck="false" + dir="auto" + defaultValue={defaultSearchTerm || ''} + /> + </form> + </header> + <main> + {accounts?.length > 0 ? ( + <ul + ref={listRef} + class={`accounts-list ${uiState === 'loading' ? 'loading' : ''}`} + > + {accounts.map((account, i) => { + const relationship = relationshipsMap[account.id]; + return ( + <li + key={account.id} + class={i === selectedIndex ? 'selected' : ''} + > + <AccountBlock + avatarSize="xxl" + account={account} + relationship={relationship} + showStats + showActivity + /> + <button + type="button" + class="plain2" + onClick={() => { + selectAccount(account); + }} + > + <Icon icon="plus" size="xl" alt={t`Add`} /> + </button> + </li> + ); + })} + </ul> + ) : uiState === 'loading' ? ( + <div class="ui-state"> + <Loader abrupt /> + </div> + ) : uiState === 'error' ? ( + <div class="ui-state"> + <p> + <Trans>Error loading accounts</Trans> + </p> + </div> + ) : null} + </main> + </div> + ); +} + function CustomEmojisModal({ masto, instance, onClose = () => {}, onSelect = () => {}, + defaultSearchTerm, }) { const [uiState, setUIState] = useState('default'); const customEmojisList = useRef([]); - const [customEmojis, setCustomEmojis] = useState({}); + const [customEmojis, setCustomEmojis] = useState([]); const recentlyUsedCustomEmojis = useMemo( () => store.account.get('recentlyUsedCustomEmojis') || [], ); + const searcherRef = useRef(); useEffect(() => { setUIState('loading'); (async () => { try { - const emojis = await masto.v1.customEmojis.list(); - // Group emojis by category - const emojisCat = { - '--recent--': recentlyUsedCustomEmojis.filter((emoji) => - emojis.find((e) => e.shortcode === emoji.shortcode), - ), - }; - const othersCat = []; - emojis.forEach((emoji) => { - if (!emoji.visibleInPicker) return; - customEmojisList.current?.push?.(emoji); - if (!emoji.category) { - othersCat.push(emoji); - return; - } - if (!emojisCat[emoji.category]) { - emojisCat[emoji.category] = []; - } - emojisCat[emoji.category].push(emoji); - }); - if (othersCat.length) { - emojisCat['--others--'] = othersCat; - } - setCustomEmojis(emojisCat); + const [emojis, searcher] = await getCustomEmojis(instance, masto); + console.log('emojis', emojis); + searcherRef.current = searcher; + setCustomEmojis(emojis); setUIState('default'); } catch (e) { setUIState('error'); @@ -2108,110 +3127,509 @@ function CustomEmojisModal({ })(); }, []); + const customEmojisCatList = useMemo(() => { + // Group emojis by category + const emojisCat = { + '--recent--': recentlyUsedCustomEmojis.filter((emoji) => + customEmojis.find((e) => e.shortcode === emoji.shortcode), + ), + }; + const othersCat = []; + customEmojis.forEach((emoji) => { + customEmojisList.current?.push?.(emoji); + if (!emoji.category) { + othersCat.push(emoji); + return; + } + if (!emojisCat[emoji.category]) { + emojisCat[emoji.category] = []; + } + emojisCat[emoji.category].push(emoji); + }); + if (othersCat.length) { + emojisCat['--others--'] = othersCat; + } + return emojisCat; + }, [customEmojis]); + + const scrollableRef = useRef(); + const [matches, setMatches] = useState(null); + const onFind = useCallback( + (e) => { + const { value } = e.target; + if (value) { + const results = searcherRef.current?.search(value, { + limit: CUSTOM_EMOJIS_COUNT, + }); + setMatches(results.map((r) => r.item)); + scrollableRef.current?.scrollTo?.(0, 0); + } else { + setMatches(null); + } + }, + [customEmojis], + ); + useEffect(() => { + if (defaultSearchTerm && customEmojis?.length) { + onFind({ target: { value: defaultSearchTerm } }); + } + }, [defaultSearchTerm, onFind, customEmojis]); + + const onSelectEmoji = useCallback( + (emoji) => { + onSelect?.(emoji); + onClose?.(); + + queueMicrotask(() => { + let recentlyUsedCustomEmojis = + store.account.get('recentlyUsedCustomEmojis') || []; + const recentlyUsedEmojiIndex = recentlyUsedCustomEmojis.findIndex( + (e) => e.shortcode === emoji.shortcode, + ); + if (recentlyUsedEmojiIndex !== -1) { + // Move emoji to index 0 + recentlyUsedCustomEmojis.splice(recentlyUsedEmojiIndex, 1); + recentlyUsedCustomEmojis.unshift(emoji); + } else { + recentlyUsedCustomEmojis.unshift(emoji); + // Remove unavailable ones + recentlyUsedCustomEmojis = recentlyUsedCustomEmojis.filter((e) => + customEmojisList.current?.find?.( + (emoji) => emoji.shortcode === e.shortcode, + ), + ); + // Limit to 10 + recentlyUsedCustomEmojis = recentlyUsedCustomEmojis.slice(0, 10); + } + + // Store back + store.account.set('recentlyUsedCustomEmojis', recentlyUsedCustomEmojis); + }); + }, + [onSelect], + ); + + const inputRef = useRef(); + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus(); + // Put cursor at the end + if (inputRef.current.value) { + inputRef.current.selectionStart = inputRef.current.value.length; + inputRef.current.selectionEnd = inputRef.current.value.length; + } + } + }, []); + return ( <div id="custom-emojis-sheet" class="sheet"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <b>Custom emojis</b>{' '} - {uiState === 'loading' ? ( - <Loader /> - ) : ( - <small class="insignificant"> • {instance}</small> - )} - </header> - <main> - <div class="custom-emojis-list"> - {uiState === 'error' && ( - <div class="ui-state"> - <p>Error loading custom emojis</p> - </div> + <div> + <b> + <Trans>Custom emojis</Trans> + </b>{' '} + {uiState === 'loading' ? ( + <Loader /> + ) : ( + <small class="insignificant"> • {instance}</small> )} - {uiState === 'default' && - Object.entries(customEmojis).map( - ([category, emojis]) => - !!emojis?.length && ( - <> - <div class="section-header"> - {{ - '--recent--': 'Recently used', - '--others--': 'Others', - }[category] || category} - </div> - <section> - {emojis.map((emoji) => ( - <button - key={emoji} - type="button" - class="plain4" - onClick={() => { - onClose(); - requestAnimationFrame(() => { - onSelect(`:${emoji.shortcode}:`); - }); - let recentlyUsedCustomEmojis = - store.account.get('recentlyUsedCustomEmojis') || - []; - const recentlyUsedEmojiIndex = - recentlyUsedCustomEmojis.findIndex( - (e) => e.shortcode === emoji.shortcode, - ); - if (recentlyUsedEmojiIndex !== -1) { - // Move emoji to index 0 - recentlyUsedCustomEmojis.splice( - recentlyUsedEmojiIndex, - 1, - ); - recentlyUsedCustomEmojis.unshift(emoji); - } else { - recentlyUsedCustomEmojis.unshift(emoji); - // Remove unavailable ones - recentlyUsedCustomEmojis = - recentlyUsedCustomEmojis.filter((e) => - customEmojisList.current?.find?.( - (emoji) => emoji.shortcode === e.shortcode, - ), - ); - // Limit to 10 - recentlyUsedCustomEmojis = - recentlyUsedCustomEmojis.slice(0, 10); - } - - // Store back - store.account.set( - 'recentlyUsedCustomEmojis', - recentlyUsedCustomEmojis, - ); - }} - title={`:${emoji.shortcode}:`} - > - <picture> - {!!emoji.staticUrl && ( - <source - srcset={emoji.staticUrl} - media="(prefers-reduced-motion: reduce)" - /> - )} - <img - class="shortcode-emoji" - src={emoji.url || emoji.staticUrl} - alt={emoji.shortcode} - width="16" - height="16" - loading="lazy" - decoding="async" - /> - </picture> - </button> - ))} - </section> - </> - ), - )} </div> + <form + onSubmit={(e) => { + e.preventDefault(); + const emoji = matches[0]; + if (emoji) { + onSelectEmoji(`:${emoji.shortcode}:`); + } + }} + > + <input + ref={inputRef} + type="search" + placeholder={t`Search emoji`} + onInput={onFind} + autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellCheck="false" + dir="auto" + defaultValue={defaultSearchTerm || ''} + /> + </form> + </header> + <main ref={scrollableRef}> + {matches !== null ? ( + <ul class="custom-emojis-matches custom-emojis-list"> + {matches.map((emoji) => ( + <li key={emoji.shortcode} class="custom-emojis-match"> + <CustomEmojiButton + emoji={emoji} + onClick={() => { + onSelectEmoji(`:${emoji.shortcode}:`); + }} + showCode + /> + </li> + ))} + </ul> + ) : ( + <div class="custom-emojis-list"> + {uiState === 'error' && ( + <div class="ui-state"> + <p> + <Trans>Error loading custom emojis</Trans> + </p> + </div> + )} + {uiState === 'default' && + Object.entries(customEmojisCatList).map( + ([category, emojis]) => + !!emojis?.length && ( + <div class="section-container"> + <div class="section-header"> + {{ + '--recent--': t`Recently used`, + '--others--': t`Others`, + }[category] || category} + </div> + <CustomEmojisList + emojis={emojis} + onSelect={onSelectEmoji} + /> + </div> + ), + )} + </div> + )} + </main> + </div> + ); +} + +const CustomEmojisList = memo(({ emojis, onSelect }) => { + const { i18n } = useLingui(); + const [max, setMax] = useState(CUSTOM_EMOJIS_COUNT); + const showMore = emojis.length > max; + return ( + <section> + {emojis.slice(0, max).map((emoji) => ( + <CustomEmojiButton + key={emoji.shortcode} + emoji={emoji} + onClick={() => { + onSelect(`:${emoji.shortcode}:`); + }} + /> + ))} + {showMore && ( + <button + type="button" + class="plain small" + onClick={() => setMax(max + CUSTOM_EMOJIS_COUNT)} + > + <Trans>{i18n.number(emojis.length - max)} more…</Trans> + </button> + )} + </section> + ); +}); + +const CustomEmojiButton = memo(({ emoji, onClick, showCode }) => { + const addEdges = (e) => { + // Add edge-left or edge-right class based on self position relative to scrollable parent + // If near left edge, add edge-left, if near right edge, add edge-right + const buffer = 88; + const parent = e.currentTarget.closest('main'); + if (parent) { + const rect = parent.getBoundingClientRect(); + const selfRect = e.currentTarget.getBoundingClientRect(); + const targetClassList = e.currentTarget.classList; + if (selfRect.left < rect.left + buffer) { + targetClassList.add('edge-left'); + targetClassList.remove('edge-right'); + } else if (selfRect.right > rect.right - buffer) { + targetClassList.add('edge-right'); + targetClassList.remove('edge-left'); + } else { + targetClassList.remove('edge-left', 'edge-right'); + } + } + }; + + return ( + <button + type="button" + className="plain4" + onClick={onClick} + data-title={showCode ? undefined : emoji.shortcode} + onPointerEnter={addEdges} + onFocus={addEdges} + > + <picture> + {!!emoji.staticUrl && ( + <source + srcSet={emoji.staticUrl} + media="(prefers-reduced-motion: reduce)" + /> + )} + <img + className="shortcode-emoji" + src={emoji.url || emoji.staticUrl} + alt={emoji.shortcode} + width="24" + height="24" + loading="lazy" + decoding="async" + /> + </picture> + {showCode && ( + <> + {' '} + <code>{emoji.shortcode}</code> + </> + )} + </button> + ); +}); + +const GIFS_PER_PAGE = 20; +function GIFPickerModal({ onClose = () => {}, onSelect = () => {} }) { + const { i18n } = useLingui(); + const [uiState, setUIState] = useState('default'); + const [results, setResults] = useState([]); + const formRef = useRef(null); + const qRef = useRef(null); + const currentOffset = useRef(0); + const scrollableRef = useRef(null); + + function fetchGIFs({ offset }) { + console.log('fetchGIFs', { offset }); + if (!qRef.current?.value) return; + setUIState('loading'); + scrollableRef.current?.scrollTo?.({ + top: 0, + left: 0, + behavior: 'smooth', + }); + (async () => { + try { + const query = { + api_key: GIPHY_API_KEY, + q: qRef.current.value, + rating: 'g', + limit: GIFS_PER_PAGE, + bundle: 'messaging_non_clips', + offset, + lang: i18n.locale || 'en', + }; + const response = await fetch( + 'https://api.giphy.com/v1/gifs/search?' + new URLSearchParams(query), + { + referrerPolicy: 'no-referrer', + }, + ).then((r) => r.json()); + currentOffset.current = response.pagination?.offset || 0; + setResults(response); + setUIState('results'); + } catch (e) { + setUIState('error'); + console.error(e); + } + })(); + } + + useEffect(() => { + qRef.current?.focus(); + }, []); + + const debouncedOnInput = useDebouncedCallback(() => { + fetchGIFs({ offset: 0 }); + }, 1000); + + return ( + <div id="gif-picker-sheet" class="sheet"> + {!!onClose && ( + <button type="button" class="sheet-close" onClick={onClose}> + <Icon icon="x" alt={t`Close`} /> + </button> + )} + <header> + <form + ref={formRef} + onSubmit={(e) => { + e.preventDefault(); + fetchGIFs({ offset: 0 }); + }} + > + <input + ref={qRef} + type="search" + name="q" + placeholder={t`Search GIFs`} + required + autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellCheck="false" + dir="auto" + onInput={debouncedOnInput} + /> + <input + type="image" + class="powered-button" + src={poweredByGiphyURL} + width="86" + height="30" + alt={t`Powered by GIPHY`} + /> + </form> + </header> + <main ref={scrollableRef} class={uiState === 'loading' ? 'loading' : ''}> + {uiState === 'default' && ( + <div class="ui-state"> + <p class="insignificant"> + <Trans>Type to search GIFs</Trans> + </p> + </div> + )} + {uiState === 'loading' && !results?.data?.length && ( + <div class="ui-state"> + <Loader abrupt /> + </div> + )} + {results?.data?.length > 0 ? ( + <> + <ul> + {results.data.map((gif) => { + const { id, images, title, alt_text } = gif; + const { + fixed_height_small, + fixed_height_downsampled, + fixed_height, + original, + } = images; + const theImage = fixed_height_small?.url + ? fixed_height_small + : fixed_height_downsampled?.url + ? fixed_height_downsampled + : fixed_height; + let { url, webp, width, height } = theImage; + if (+height > 100) { + width = (width / height) * 100; + height = 100; + } + const urlObj = URL.parse(url); + const strippedURL = urlObj.origin + urlObj.pathname; + let strippedWebP; + if (webp) { + const webpObj = URL.parse(webp); + strippedWebP = webpObj.origin + webpObj.pathname; + } + return ( + <li key={id}> + <button + type="button" + onClick={() => { + const { mp4, url } = original; + const theURL = mp4 || url; + const urlObj = URL.parse(theURL); + const strippedURL = urlObj.origin + urlObj.pathname; + onClose(); + onSelect({ + url: strippedURL, + type: mp4 ? 'video/mp4' : 'image/gif', + alt_text: alt_text || title, + }); + }} + > + <figure + style={{ + '--figure-width': width + 'px', + // width: width + 'px' + }} + > + <picture> + {strippedWebP && ( + <source srcset={strippedWebP} type="image/webp" /> + )} + <img + src={strippedURL} + width={width} + height={height} + loading="lazy" + decoding="async" + alt={alt_text} + referrerpolicy="no-referrer" + onLoad={(e) => { + e.target.style.backgroundColor = 'transparent'; + }} + /> + </picture> + <figcaption>{alt_text || title}</figcaption> + </figure> + </button> + </li> + ); + })} + </ul> + <p class="pagination"> + {results.pagination?.offset > 0 && ( + <button + type="button" + class="light small" + disabled={uiState === 'loading'} + onClick={() => { + fetchGIFs({ + offset: results.pagination?.offset - GIFS_PER_PAGE, + }); + }} + > + <Icon icon="chevron-left" /> + <span> + <Trans>Previous</Trans> + </span> + </button> + )} + <span /> + {results.pagination?.offset + results.pagination?.count < + results.pagination?.total_count && ( + <button + type="button" + class="light small" + disabled={uiState === 'loading'} + onClick={() => { + fetchGIFs({ + offset: results.pagination?.offset + GIFS_PER_PAGE, + }); + }} + > + <span> + <Trans>Next</Trans> + </span>{' '} + <Icon icon="chevron-right" /> + </button> + )} + </p> + </> + ) : ( + uiState === 'results' && ( + <div class="ui-state"> + <p>No results</p> + </div> + ) + )} + {uiState === 'error' && ( + <div class="ui-state"> + <p> + <Trans>Error loading GIFs</Trans> + </p> + </div> + )} </main> </div> ); diff --git a/src/components/custom-emoji.jsx b/src/components/custom-emoji.jsx new file mode 100644 index 00000000..58a7eb95 --- /dev/null +++ b/src/components/custom-emoji.jsx @@ -0,0 +1,20 @@ +export default function CustomEmoji({ staticUrl, alt, url }) { + return ( + <picture> + {staticUrl && ( + <source srcset={staticUrl} media="(prefers-reduced-motion: reduce)" /> + )} + <img + key={alt || url} + src={url} + alt={alt} + class="shortcode-emoji emoji" + width="16" + height="16" + loading="lazy" + decoding="async" + fetchPriority="low" + /> + </picture> + ); +} diff --git a/src/components/drafts.css b/src/components/drafts.css index 2b093b8c..198dd46c 100644 --- a/src/components/drafts.css +++ b/src/components/drafts.css @@ -27,7 +27,7 @@ button.draft-item { background-color: var(--bg-color); color: var(--text-color); border: 1px solid var(--link-faded-color); - text-align: left; + text-align: start; padding: 0; } button.draft-item:is(:hover, :focus) { diff --git a/src/components/drafts.jsx b/src/components/drafts.jsx index bf2d8c2a..5c6182ad 100644 --- a/src/components/drafts.jsx +++ b/src/components/drafts.jsx @@ -1,5 +1,6 @@ import './drafts.css'; +import { t, Trans } from '@lingui/macro'; import { useEffect, useMemo, useReducer, useState } from 'react'; import { api } from '../utils/api'; @@ -54,17 +55,20 @@ function Drafts({ onClose }) { <div class="sheet"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> <h2> - Unsent drafts <Loader abrupt hidden={uiState !== 'loading'} /> + <Trans>Unsent drafts</Trans>{' '} + <Loader abrupt hidden={uiState !== 'loading'} /> </h2> {hasDrafts && ( <div class="insignificant"> - Looks like you have unsent drafts. Let's continue where you left - off. + <Trans> + Looks like you have unsent drafts. Let's continue where you left + off. + </Trans> </div> )} </header> @@ -83,7 +87,9 @@ function Drafts({ onClose }) { <time> {!!replyTo && ( <> - @{replyTo.account.acct} + <span class="bidi-isolate"> + @{replyTo.account.acct} + </span> <br /> </> )} @@ -91,7 +97,11 @@ function Drafts({ onClose }) { </time> </b> <MenuConfirm - confirmLabel={<span>Delete this draft?</span>} + confirmLabel={ + <span> + <Trans>Delete this draft?</Trans> + </span> + } menuItemClassName="danger" align="end" disabled={uiState === 'loading'} @@ -104,7 +114,7 @@ function Drafts({ onClose }) { reload(); // } } catch (e) { - alert('Error deleting draft! Please try again.'); + alert(t`Error deleting draft! Please try again.`); } })(); }} @@ -114,7 +124,7 @@ function Drafts({ onClose }) { class="small light" disabled={uiState === 'loading'} > - Delete… + <Trans>Delete…</Trans> </button> </MenuConfirm> </div> @@ -133,7 +143,7 @@ function Drafts({ onClose }) { .fetch(); } catch (e) { console.error(e); - alert('Error fetching reply-to status!'); + alert(t`Error fetching reply-to status!`); setUIState('default'); return; } @@ -156,7 +166,11 @@ function Drafts({ onClose }) { {drafts.length > 1 && ( <p> <MenuConfirm - confirmLabel={<span>Delete all drafts?</span>} + confirmLabel={ + <span> + <Trans>Delete all drafts?</Trans> + </span> + } menuItemClassName="danger" disabled={uiState === 'loading'} onClick={() => { @@ -172,7 +186,7 @@ function Drafts({ onClose }) { reload(); } catch (e) { console.error(e); - alert('Error deleting drafts! Please try again.'); + alert(t`Error deleting drafts! Please try again.`); setUIState('error'); } // } @@ -184,14 +198,16 @@ function Drafts({ onClose }) { class="light danger" disabled={uiState === 'loading'} > - Delete all… + <Trans>Delete all…</Trans> </button> </MenuConfirm> </p> )} </> ) : ( - <p>No drafts found.</p> + <p> + <Trans>No drafts found.</Trans> + </p> )} </main> </div> @@ -226,10 +242,10 @@ function MiniDraft({ draft }) { : {} } > - {hasPoll && <Icon icon="poll" />} + {hasPoll && <Icon icon="poll" alt={t`Poll`} />} {hasMedia && ( <span> - <Icon icon="attachment" />{' '} + <Icon icon="attachment" alt={t`Media`} />{' '} <small>{mediaAttachments?.length}</small> </span> )} diff --git a/src/components/embed-modal.css b/src/components/embed-modal.css index 44f79ee8..2af4fab2 100644 --- a/src/components/embed-modal.css +++ b/src/components/embed-modal.css @@ -23,7 +23,7 @@ pointer-events: auto; max-width: 100%; max-height: 100%; - width: max(var(--width), 480px); + width: max(var(--width), var(--main-width)); height: auto; aspect-ratio: var(--aspect-ratio); } diff --git a/src/components/embed-modal.jsx b/src/components/embed-modal.jsx index f38e1556..66215ae1 100644 --- a/src/components/embed-modal.jsx +++ b/src/components/embed-modal.jsx @@ -1,5 +1,7 @@ import './embed-modal.css'; +import { t, Trans } from '@lingui/macro'; + import Icon from './icon'; function EmbedModal({ html, url, width, height, onClose = () => {} }) { @@ -7,7 +9,7 @@ function EmbedModal({ html, url, width, height, onClose = () => {} }) { <div class="embed-modal-container"> <div class="top-controls"> <button type="button" class="light" onClick={() => onClose()}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> {url && ( <a @@ -16,7 +18,10 @@ function EmbedModal({ html, url, width, height, onClose = () => {} }) { rel="noopener noreferrer" class="button plain" > - <span>Open link</span> <Icon icon="external" /> + <span> + <Trans>Open in new window</Trans> + </span>{' '} + <Icon icon="external" /> </a> )} </div> diff --git a/src/components/emoji-text.jsx b/src/components/emoji-text.jsx index 752a7459..2200aadf 100644 --- a/src/components/emoji-text.jsx +++ b/src/components/emoji-text.jsx @@ -1,31 +1,33 @@ import { memo } from 'preact/compat'; +import mem from '../utils/mem'; + +import CustomEmoji from './custom-emoji'; + +const shortcodesRegexp = mem((shortcodes) => { + return new RegExp(`:(${shortcodes.join('|')}):`, 'g'); +}); + function EmojiText({ text, emojis }) { if (!text) return ''; if (!emojis?.length) return text; if (text.indexOf(':') === -1) return text; - const regex = new RegExp( - `:(${emojis.map((e) => e.shortcode).join('|')}):`, - 'g', - ); - const elements = text.split(regex).map((word) => { + // const regex = new RegExp( + // `:(${emojis.map((e) => e.shortcode).join('|')}):`, + // 'g', + // ); + const regex = shortcodesRegexp(emojis.map((e) => e.shortcode)); + const elements = text.split(regex).map((word, i) => { const emoji = emojis.find((e) => e.shortcode === word); if (emoji) { const { url, staticUrl } = emoji; return ( - <picture> - <source srcset={staticUrl} media="(prefers-reduced-motion: reduce)" /> - <img - key={word} - src={url} - alt={word} - class="shortcode-emoji emoji" - width="16" - height="16" - loading="lazy" - decoding="async" - /> - </picture> + <CustomEmoji + staticUrl={staticUrl} + alt={word} + url={url} + key={word + '-' + i} // Handle >= 2 same shortcodes + /> ); } return word; @@ -33,9 +35,11 @@ function EmojiText({ text, emojis }) { return elements; } -export default memo( - EmojiText, - (oldProps, newProps) => - oldProps.text === newProps.text && - oldProps.emojis?.length === newProps.emojis?.length, -); +export default mem(EmojiText); + +// export default memo( +// EmojiText, +// (oldProps, newProps) => +// oldProps.text === newProps.text && +// oldProps.emojis?.length === newProps.emojis?.length, +// ); diff --git a/src/components/follow-request-buttons.jsx b/src/components/follow-request-buttons.jsx index 12068001..d62e3c6d 100644 --- a/src/components/follow-request-buttons.jsx +++ b/src/components/follow-request-buttons.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { useState } from 'preact/hooks'; import { api } from '../utils/api'; @@ -38,7 +39,7 @@ function FollowRequestButtons({ accountID, onChange }) { })(); }} > - Accept + <Trans>Accept</Trans> </button>{' '} <button type="button" @@ -64,14 +65,18 @@ function FollowRequestButtons({ accountID, onChange }) { })(); }} > - Reject + <Trans>Reject</Trans> </button> <span class="follow-request-states"> {hasRelationship && requestState ? ( requestState === 'accept' ? ( - <Icon icon="check-circle" alt="Accepted" class="follow-accepted" /> + <Icon + icon="check-circle" + alt={t`Accepted`} + class="follow-accepted" + /> ) : ( - <Icon icon="x-circle" alt="Rejected" class="follow-rejected" /> + <Icon icon="x-circle" alt={t`Rejected`} class="follow-rejected" /> ) ) : ( <Loader hidden={uiState !== 'loading'} /> diff --git a/src/components/generic-accounts.css b/src/components/generic-accounts.css index ad33900a..d328ae40 100644 --- a/src/components/generic-accounts.css +++ b/src/components/generic-accounts.css @@ -1,4 +1,39 @@ #generic-accounts-container { + .post-preview { + --max-height: 120px; + max-height: var(--max-height); + overflow: hidden; + margin-block: 8px; + border: 1px solid var(--outline-color); + border-radius: 8px; + pointer-events: none; + + .status { + font-size: calc(var(--text-size) * 0.9); + mask-image: linear-gradient( + to bottom, + black calc(var(--max-height) / 2), + transparent calc(var(--max-height) - 8px) + ); + filter: saturate(0.5); + } + + &:is(a) { + pointer-events: auto; + display: block; + text-decoration: none; + color: inherit; + + &:hover { + border-color: var(--outline-hover-color); + } + + > * { + pointer-events: none; + } + } + } + .accounts-list { --list-gap: 16px; list-style: none; @@ -27,13 +62,13 @@ border-top: var(--hairline-width) solid var(--divider-color); position: absolute; bottom: calc(-1 * var(--list-gap) / 2); - left: 40px; - right: 0; + inset-inline-start: 40px; + inset-inline-end: 0; } &:has(.reactions-block):before { /* avatar + reactions + gap */ - left: calc(40px + 16px + 8px); + inset-inline-start: calc(40px + 16px + 8px); } } diff --git a/src/components/generic-accounts.jsx b/src/components/generic-accounts.jsx index 0fdd557e..498dc12f 100644 --- a/src/components/generic-accounts.jsx +++ b/src/components/generic-accounts.jsx @@ -1,5 +1,6 @@ import './generic-accounts.css'; +import { t, Trans } from '@lingui/macro'; import { useEffect, useRef, useState } from 'preact/hooks'; import { InView } from 'react-intersection-observer'; import { useSnapshot } from 'valtio'; @@ -11,12 +12,16 @@ import useLocationChange from '../utils/useLocationChange'; import AccountBlock from './account-block'; import Icon from './icon'; +import Link from './link'; import Loader from './loader'; +import Status from './status'; export default function GenericAccounts({ instance, excludeRelationshipAttrs = [], + postID, onClose = () => {}, + blankCopy = t`Nothing to show`, }) { const { masto, instance: currentInstance } = api(); const isCurrentInstance = instance ? instance === currentInstance : true; @@ -129,15 +134,25 @@ export default function GenericAccounts({ } }, [snapStates.reloadGenericAccounts.counter]); + const post = states.statuses[postID]; + return ( <div id="generic-accounts-container" class="sheet" tabindex="-1"> <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> <header> - <h2>{heading || 'Accounts'}</h2> + <h2>{heading || t`Accounts`}</h2> </header> <main> + {post && ( + <Link + to={`/${instance || currentInstance}/s/${post.id}`} + class="post-preview" + > + <Status status={post} size="s" readOnly /> + </Link> + )} {accounts.length > 0 ? ( <> <ul class="accounts-list"> @@ -187,11 +202,13 @@ export default function GenericAccounts({ class="plain block" onClick={() => loadAccounts()} > - Show more… + <Trans>Show more…</Trans> </button> </InView> ) : ( - <p class="ui-state insignificant">The end.</p> + <p class="ui-state insignificant"> + <Trans>The end.</Trans> + </p> ) ) : ( uiState === 'loading' && ( @@ -206,9 +223,11 @@ export default function GenericAccounts({ <Loader abrupt /> </p> ) : uiState === 'error' ? ( - <p class="ui-state">Error loading accounts</p> + <p class="ui-state"> + <Trans>Error loading accounts</Trans> + </p> ) : ( - <p class="ui-state insignificant">Nothing to show</p> + <p class="ui-state insignificant">{blankCopy}</p> )} </main> </div> diff --git a/src/components/icon.jsx b/src/components/icon.jsx index 16fb7c22..b7633437 100644 --- a/src/components/icon.jsx +++ b/src/components/icon.jsx @@ -53,9 +53,14 @@ function Icon({ return null; } - let rotate, flip; + let rotate, + flip, + rtl = false; if (Array.isArray(iconBlock)) { [iconBlock, rotate, flip] = iconBlock; + } else if (typeof iconBlock === 'object') { + ({ rotate, flip, rtl } = iconBlock); + iconBlock = iconBlock.module; } const [iconData, setIconData] = useState(ICONDATA[icon]); @@ -72,13 +77,14 @@ function Icon({ return ( <span - class={`icon ${className}`} + class={`icon ${className} ${rtl ? 'rtl-flip' : ''}`} title={title || alt} style={{ width: `${iconSize}px`, height: `${iconSize}px`, ...style, }} + data-icon={icon} > {iconData && ( // <svg diff --git a/src/components/intersection-view.jsx b/src/components/intersection-view.jsx new file mode 100644 index 00000000..0763e6b9 --- /dev/null +++ b/src/components/intersection-view.jsx @@ -0,0 +1,29 @@ +import { useLayoutEffect, useRef, useState } from 'preact/hooks'; + +const IntersectionView = ({ children, root = null, fallback = null }) => { + const ref = useRef(); + const [show, setShow] = useState(false); + useLayoutEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + const entry = entries[0]; + if (entry.isIntersecting) { + setShow(true); + observer.unobserve(ref.current); + } + }, + { + root, + rootMargin: `${screen.height}px`, + }, + ); + if (ref.current) observer.observe(ref.current); + return () => { + if (ref.current) observer.unobserve(ref.current); + }; + }, []); + + return show ? children : <div ref={ref}>{fallback}</div>; +}; + +export default IntersectionView; diff --git a/src/components/intl-segmenter-suspense.jsx b/src/components/intl-segmenter-suspense.jsx new file mode 100644 index 00000000..e015401e --- /dev/null +++ b/src/components/intl-segmenter-suspense.jsx @@ -0,0 +1,36 @@ +import { shouldPolyfill } from '@formatjs/intl-segmenter/should-polyfill'; +import { Suspense } from 'preact/compat'; +import { useEffect, useState } from 'preact/hooks'; + +import Loader from './loader'; + +const supportsIntlSegmenter = !shouldPolyfill(); + +// Preload IntlSegmenter +setTimeout(() => { + queueMicrotask(() => { + if (!supportsIntlSegmenter) { + import('@formatjs/intl-segmenter/polyfill-force').catch(() => {}); + } + }); +}, 1000); + +export default function IntlSegmenterSuspense({ children }) { + if (supportsIntlSegmenter) { + return <Suspense fallback={<Loader />}>{children}</Suspense>; + } + + const [polyfillLoaded, setPolyfillLoaded] = useState(false); + useEffect(() => { + (async () => { + await import('@formatjs/intl-segmenter/polyfill-force'); + setPolyfillLoaded(true); + })(); + }, []); + + return polyfillLoaded ? ( + <Suspense fallback={<Loader />}>{children}</Suspense> + ) : ( + <Loader /> + ); +} diff --git a/src/components/keyboard-shortcuts-help.jsx b/src/components/keyboard-shortcuts-help.jsx index a3925f20..523093e3 100644 --- a/src/components/keyboard-shortcuts-help.jsx +++ b/src/components/keyboard-shortcuts-help.jsx @@ -1,5 +1,6 @@ import './keyboard-shortcuts-help.css'; +import { t, Trans } from '@lingui/macro'; import { memo } from 'preact/compat'; import { useHotkeys } from 'react-hotkeys-hook'; import { useSnapshot } from 'valtio'; @@ -35,153 +36,165 @@ export default memo(function KeyboardShortcutsHelp() { <Modal onClose={onClose}> <div id="keyboard-shortcuts-help-container" class="sheet" tabindex="-1"> <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> <header> - <h2>Keyboard shortcuts</h2> + <h2> + <Trans>Keyboard shortcuts</Trans> + </h2> </header> <main> <table> - {[ - { - action: 'Keyboard shortcuts help', - keys: <kbd>?</kbd>, - }, - { - action: 'Next post', - keys: <kbd>j</kbd>, - }, - { - action: 'Previous post', - keys: <kbd>k</kbd>, - }, - { - action: 'Skip carousel to next post', - keys: ( - <> - <kbd>Shift</kbd> + <kbd>j</kbd> - </> - ), - }, - { - action: 'Skip carousel to previous post', - keys: ( - <> - <kbd>Shift</kbd> + <kbd>k</kbd> - </> - ), - }, - { - action: 'Load new posts', - keys: <kbd>.</kbd>, - }, - { - action: 'Open post details', - keys: ( - <> - <kbd>Enter</kbd> or <kbd>o</kbd> - </> - ), - }, - { - action: ( - <> - Expand content warning or - <br /> - toggle expanded/collapsed thread - </> - ), - keys: <kbd>x</kbd>, - }, - { - action: 'Close post or dialogs', - keys: ( - <> - <kbd>Esc</kbd> or <kbd>Backspace</kbd> - </> - ), - }, - { - action: 'Focus column in multi-column mode', - keys: ( - <> - <kbd>1</kbd> to <kbd>9</kbd> - </> - ), - }, - { - action: 'Compose new post', - keys: <kbd>c</kbd>, - }, - { - action: 'Compose new post (new window)', - className: 'insignificant', - keys: ( - <> - <kbd>Shift</kbd> + <kbd>c</kbd> - </> - ), - }, - { - action: 'Send post', - keys: ( - <> - <kbd>Ctrl</kbd> + <kbd>Enter</kbd> or <kbd>⌘</kbd> +{' '} - <kbd>Enter</kbd> - </> - ), - }, - { - action: 'Search', - keys: <kbd>/</kbd>, - }, - { - action: 'Reply', - keys: <kbd>r</kbd>, - }, - { - action: 'Reply (new window)', - className: 'insignificant', - keys: ( - <> - <kbd>Shift</kbd> + <kbd>r</kbd> - </> - ), - }, - { - action: 'Like (favourite)', - keys: ( - <> - <kbd>l</kbd> or <kbd>f</kbd> - </> - ), - }, - { - action: 'Boost', - keys: ( - <> - <kbd>Shift</kbd> + <kbd>b</kbd> - </> - ), - }, - { - action: 'Bookmark', - keys: <kbd>d</kbd>, - }, - { - action: 'Toggle Cloak mode', - keys: ( - <> - <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>k</kbd> - </> - ), - }, - ].map(({ action, className, keys }) => ( - <tr key={action}> - <th class={className}>{action}</th> - <td>{keys}</td> - </tr> - ))} + <tbody> + {[ + { + action: t`Keyboard shortcuts help`, + keys: <kbd>?</kbd>, + }, + { + action: t`Next post`, + keys: <kbd>j</kbd>, + }, + { + action: t`Previous post`, + keys: <kbd>k</kbd>, + }, + { + action: t`Skip carousel to next post`, + keys: ( + <Trans> + <kbd>Shift</kbd> + <kbd>j</kbd> + </Trans> + ), + }, + { + action: t`Skip carousel to previous post`, + keys: ( + <Trans> + <kbd>Shift</kbd> + <kbd>k</kbd> + </Trans> + ), + }, + { + action: t`Load new posts`, + keys: <kbd>.</kbd>, + }, + { + action: t`Open post details`, + keys: ( + <Trans> + <kbd>Enter</kbd> or <kbd>o</kbd> + </Trans> + ), + }, + { + action: ( + <Trans> + Expand content warning or + <br /> + toggle expanded/collapsed thread + </Trans> + ), + keys: <kbd>x</kbd>, + }, + { + action: t`Close post or dialogs`, + keys: ( + <Trans> + <kbd>Esc</kbd> or <kbd>Backspace</kbd> + </Trans> + ), + }, + { + action: t`Focus column in multi-column mode`, + keys: ( + <Trans> + <kbd>1</kbd> to <kbd>9</kbd> + </Trans> + ), + }, + { + action: t`Focus next column in multi-column mode`, + keys: <kbd>]</kbd>, + }, + { + action: t`Focus previous column in multi-column mode`, + keys: <kbd>[</kbd>, + }, + { + action: t`Compose new post`, + keys: <kbd>c</kbd>, + }, + { + action: t`Compose new post (new window)`, + className: 'insignificant', + keys: ( + <Trans> + <kbd>Shift</kbd> + <kbd>c</kbd> + </Trans> + ), + }, + { + action: t`Send post`, + keys: ( + <Trans> + <kbd>Ctrl</kbd> + <kbd>Enter</kbd> or <kbd>⌘</kbd> +{' '} + <kbd>Enter</kbd> + </Trans> + ), + }, + { + action: t`Search`, + keys: <kbd>/</kbd>, + }, + { + action: t`Reply`, + keys: <kbd>r</kbd>, + }, + { + action: t`Reply (new window)`, + className: 'insignificant', + keys: ( + <Trans> + <kbd>Shift</kbd> + <kbd>r</kbd> + </Trans> + ), + }, + { + action: t`Like (favourite)`, + keys: ( + <Trans> + <kbd>l</kbd> or <kbd>f</kbd> + </Trans> + ), + }, + { + action: t`Boost`, + keys: ( + <Trans> + <kbd>Shift</kbd> + <kbd>b</kbd> + </Trans> + ), + }, + { + action: t`Bookmark`, + keys: <kbd>d</kbd>, + }, + { + action: t`Toggle Cloak mode`, + keys: ( + <Trans> + <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>k</kbd> + </Trans> + ), + }, + ].map(({ action, className, keys }) => ( + <tr key={action}> + <th class={className}>{action}</th> + <td>{keys}</td> + </tr> + ))} + </tbody> </table> </main> </div> diff --git a/src/components/lang-selector.jsx b/src/components/lang-selector.jsx new file mode 100644 index 00000000..a072bd11 --- /dev/null +++ b/src/components/lang-selector.jsx @@ -0,0 +1,115 @@ +import { useLingui } from '@lingui/react'; +import { useMemo } from 'preact/hooks'; + +import { CATALOGS, DEFAULT_LANG, DEV_LOCALES, LOCALES } from '../locales'; +import { activateLang } from '../utils/lang'; +import localeCode2Text from '../utils/localeCode2Text'; +import store from '../utils/store'; + +const regionMaps = { + 'zh-CN': 'zh-Hans', + 'zh-TW': 'zh-Hant', + 'pt-BR': 'pt-BR', +}; + +export default function LangSelector() { + const { i18n } = useLingui(); + + // Sorted on render, so the order won't suddenly change based on current locale + const populatedLocales = useMemo(() => { + return LOCALES.map((lang) => { + // Don't need regions for now, it makes text too noisy + // Wait till there's too many languages and there are regional clashes + const regionlessCode = regionMaps[lang] || lang.replace(/-[a-z]+$/i, ''); + + const native = localeCode2Text({ + code: regionlessCode, + locale: lang, + fallback: CATALOGS.find((c) => c.code === lang)?.nativeName, + }); + + // Not used when rendering because it'll change based on current locale + // Only used for sorting on render + const _common = localeCode2Text({ + code: regionlessCode, + locale: i18n.locale, + fallback: CATALOGS.find((c) => c.code === lang)?.name, + }); + + return { + code: lang, + regionlessCode, + _common, + native, + }; + }).sort((a, b) => { + // Sort by common name + const order = a._common.localeCompare(b._common, i18n.locale); + if (order !== 0) return order; + // Sort by code (fallback) + if (a.code < b.code) return -1; + if (a.code > b.code) return 1; + return 0; + }); + }, []); + + return ( + <label class="lang-selector"> + 🌐{' '} + <select + class="small" + value={i18n.locale || DEFAULT_LANG} + onChange={(e) => { + store.local.set('lang', e.target.value); + activateLang(e.target.value); + }} + > + {populatedLocales.map(({ code, regionlessCode, native }) => { + // Common name changes based on current locale + const common = localeCode2Text({ + code: regionlessCode, + locale: i18n.locale, + fallback: CATALOGS.find((c) => c.code === code)?.name, + }); + const showCommon = !!common && common !== native; + return ( + <option + value={code} + data-regionless-code={regionlessCode} + key={code} + > + {showCommon ? `${native} - ${common}` : native} + </option> + ); + })} + {(import.meta.env.DEV || import.meta.env.PHANPY_SHOW_DEV_LOCALES) && ( + <optgroup label="🚧 Development (<50% translated)"> + {DEV_LOCALES.map((code) => { + if (code === 'pseudo-LOCALE') { + return ( + <> + <hr /> + <option value={code} key={code}> + Pseudolocalization (test) + </option> + </> + ); + } + const nativeName = CATALOGS.find( + (c) => c.code === code, + )?.nativeName; + const completion = CATALOGS.find( + (c) => c.code === code, + )?.completion; + return ( + <option value={code} key={code}> + {nativeName || code} ‎[{completion}%] + </option> + ); + })} + </optgroup> + )} + </select> + </label> + ); +} diff --git a/src/components/lazy-shazam.jsx b/src/components/lazy-shazam.jsx new file mode 100644 index 00000000..4e441be0 --- /dev/null +++ b/src/components/lazy-shazam.jsx @@ -0,0 +1,59 @@ +/* + Rendered but hidden. Only show when visible +*/ +import { useEffect, useRef, useState } from 'preact/hooks'; +import { useInView } from 'react-intersection-observer'; + +// The sticky header, usually at the top +const TOP = 48; + +const shazamIDs = {}; + +export default function LazyShazam({ id, children }) { + const containerRef = useRef(); + const hasID = !!shazamIDs[id]; + const [visible, setVisible] = useState(false); + const [visibleStart, setVisibleStart] = useState(hasID || false); + + const { ref } = useInView({ + root: null, + rootMargin: `-${TOP}px 0px 0px 0px`, + trackVisibility: true, + delay: 1000, + onChange: (inView) => { + if (inView) { + setVisible(true); + if (id) shazamIDs[id] = true; + } + }, + triggerOnce: true, + skip: visibleStart || visible, + }); + + useEffect(() => { + if (!containerRef.current) return; + const rect = containerRef.current.getBoundingClientRect(); + if (rect.bottom > TOP) { + if (rect.top < window.innerHeight) { + setVisible(true); + } else { + setVisibleStart(true); + } + if (id) shazamIDs[id] = true; + } + }, []); + + if (visibleStart) return children; + + return ( + <div + ref={containerRef} + class="shazam-container no-animation" + hidden={!visible} + > + <div ref={ref} class="shazam-container-inner"> + {children} + </div> + </div> + ); +} diff --git a/src/components/link.jsx b/src/components/link.jsx index 34fe8f7e..1af3790e 100644 --- a/src/components/link.jsx +++ b/src/components/link.jsx @@ -22,15 +22,13 @@ const Link = forwardRef((props, ref) => { // Handle encodeURIComponent of searchParams values if (!!hash && hash !== '/' && hash.includes('?')) { - try { - const parsedHash = new URL(hash, location.origin); // Fake base URL - if (parsedHash.searchParams.size) { - const searchParamsStr = Array.from(parsedHash.searchParams.entries()) - .map(([key, value]) => `${key}=${encodeURIComponent(value)}`) - .join('&'); - hash = parsedHash.pathname + '?' + searchParamsStr; - } - } catch (e) {} + const parsedHash = URL.parse(hash, location.origin); // Fake base URL + if (parsedHash?.searchParams?.size) { + const searchParamsStr = Array.from(parsedHash.searchParams.entries()) + .map(([key, value]) => `${key}=${encodeURIComponent(value)}`) + .join('&'); + hash = parsedHash.pathname + '?' + searchParamsStr; + } } const isActive = hash === to || decodeURIComponent(hash) === to; diff --git a/src/components/links-bar.css b/src/components/links-bar.css index f9668c89..c1f40758 100644 --- a/src/components/links-bar.css +++ b/src/components/links-bar.css @@ -6,7 +6,7 @@ overflow-x: auto; background-color: var(--bg-faded-color); mask-image: linear-gradient( - to right, + var(--to-forward), transparent, black 16px, black calc(100% - 16px), @@ -20,6 +20,9 @@ width: 95vw; max-width: calc(320px * 3.3); transform: translateX(calc(-50% + var(--main-width) / 2)); + &:dir(rtl) { + transform: translateX(calc(50% - var(--main-width) / 2)); + } } } @@ -38,12 +41,16 @@ color: var(--text-insignificant-color); position: absolute; top: 8px; - left: 0; + inset-inline-start: 0; transform-origin: top left; transform: rotate(-90deg) translateX(-100%); + &:dir(rtl) { + transform-origin: top right; + transform: rotate(90deg) translateX(100%); + } user-select: none; background-image: linear-gradient( - to left, + var(--to-backward), var(--text-color), var(--link-color) ); @@ -53,10 +60,10 @@ } } - a { - min-width: 240px; - flex-grow: 1; - max-width: 320px; + a.link-block { + width: 240px; + flex-shrink: 0; + /* max-width: 320px; */ text-decoration: none; color: inherit; border-radius: 16px; @@ -74,7 +81,7 @@ background-clip: border-box; background-origin: border-box; min-height: 160px; - height: 320px; + height: 340px; max-height: 50vh; &:not(:active):is(:hover, :focus-visible) { @@ -95,6 +102,35 @@ filter: brightness(0.8); } + figure { + transition: 1s ease-out; + transition-property: opacity, mix-blend-mode; + } + + &.inactive:not(:active, :hover) { + figure { + transition-duration: 0.3s; + opacity: 0.5; + mix-blend-mode: luminosity; + } + + .byline { + transition-duration: 0.3s; + opacity: 0.75; + mix-blend-mode: luminosity; + } + } + + &.active { + border-color: var(--accent-color, var(--link-light-color)); + height: 100%; + max-height: 100%; + + + button[disabled] { + display: none; + } + } + article { width: 100%; display: flex; @@ -187,10 +223,29 @@ -webkit-box-orient: vertical; overflow: hidden; font-size: 90%; + + &.more-lines { + -webkit-line-clamp: 3; + } } hr { margin: 4px 0; } + + .byline { + white-space: nowrap; + mask-image: linear-gradient(var(--to-backward), transparent, black 32px); + + a { + color: inherit; + } + + .avatar { + width: 16px !important; + height: 16px !important; + opacity: 0.8; + } + } } } diff --git a/src/components/list-add-edit.jsx b/src/components/list-add-edit.jsx index 3bf6ff03..17279b7b 100644 --- a/src/components/list-add-edit.jsx +++ b/src/components/list-add-edit.jsx @@ -1,6 +1,8 @@ +import { t, Trans } from '@lingui/macro'; import { useEffect, useRef, useState } from 'preact/hooks'; import { api } from '../utils/api'; +import { addListStore, deleteListStore, updateListStore } from '../utils/lists'; import supports from '../utils/supports'; import Icon from './icon'; @@ -22,17 +24,19 @@ function ListAddEdit({ list, onClose }) { } } }, [editMode]); - const supportsExclusive = supports('@mastodon/list-exclusive'); + const supportsExclusive = + supports('@mastodon/list-exclusive') || + supports('@gotosocial/list-exclusive'); return ( <div class="sheet"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )}{' '} <header> - <h2>{editMode ? 'Edit list' : 'New list'}</h2> + <h2>{editMode ? t`Edit list` : t`New list`}</h2> </header> <main> <form @@ -75,11 +79,21 @@ function ListAddEdit({ list, onClose }) { state: 'success', list: listResult, }); + + setTimeout(() => { + if (editMode) { + updateListStore(listResult); + } else { + addListStore(listResult); + } + }, 1); } catch (e) { console.error(e); setUIState('error'); alert( - editMode ? 'Unable to edit list.' : 'Unable to create list.', + editMode + ? t`Unable to edit list.` + : t`Unable to create list.`, ); } })(); @@ -87,7 +101,7 @@ function ListAddEdit({ list, onClose }) { > <div class="list-form-row"> <label for="list-title"> - Name{' '} + <Trans>Name</Trans>{' '} <input ref={nameFieldRef} type="text" @@ -106,9 +120,15 @@ function ListAddEdit({ list, onClose }) { required disabled={uiState === 'loading'} > - <option value="list">Show replies to list members</option> - <option value="followed">Show replies to people I follow</option> - <option value="none">Don't show replies</option> + <option value="list"> + <Trans>Show replies to list members</Trans> + </option> + <option value="followed"> + <Trans>Show replies to people I follow</Trans> + </option> + <option value="none"> + <Trans>Don't show replies</Trans> + </option> </select> </div> {supportsExclusive && ( @@ -120,20 +140,20 @@ function ListAddEdit({ list, onClose }) { name="exclusive" disabled={uiState === 'loading'} />{' '} - Hide posts on this list from Home/Following + <Trans>Hide posts on this list from Home/Following</Trans> </label> </div> )} <div class="list-form-footer"> <button type="submit" disabled={uiState === 'loading'}> - {editMode ? 'Save' : 'Create'} + {editMode ? t`Save` : t`Create`} </button> {editMode && ( <MenuConfirm disabled={uiState === 'loading'} align="end" menuItemClassName="danger" - confirmLabel="Delete this list?" + confirmLabel={t`Delete this list?`} onClick={() => { // const yes = confirm('Delete this list?'); // if (!yes) return; @@ -146,10 +166,13 @@ function ListAddEdit({ list, onClose }) { onClose?.({ state: 'deleted', }); + setTimeout(() => { + deleteListStore(list.id); + }, 1); } catch (e) { console.error(e); setUIState('error'); - alert('Unable to delete list.'); + alert(t`Unable to delete list.`); } })(); }} @@ -159,7 +182,7 @@ function ListAddEdit({ list, onClose }) { class="light danger" disabled={uiState === 'loading'} > - Delete… + <Trans>Delete…</Trans> </button> </MenuConfirm> )} diff --git a/src/components/media-alt-modal.jsx b/src/components/media-alt-modal.jsx index 4b313343..9f4cfeba 100644 --- a/src/components/media-alt-modal.jsx +++ b/src/components/media-alt-modal.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { Menu, MenuItem } from '@szhsin/react-menu'; import { useState } from 'preact/hooks'; import { useSnapshot } from 'valtio'; @@ -29,17 +30,19 @@ export default function MediaAltModal({ alt, lang, onClose }) { <div class="sheet" tabindex="-1"> {!!onClose && ( <button type="button" class="sheet-close outer" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header class="header-grid"> - <h2>Media description</h2> + <h2> + <Trans>Media description</Trans> + </h2> <div class="header-side"> <Menu2 align="end" menuButton={ <button type="button" class="plain4"> - <Icon icon="more" alt="More" size="xl" /> + <Icon icon="more" alt={t`More`} size="xl" /> </button> } > @@ -50,7 +53,9 @@ export default function MediaAltModal({ alt, lang, onClose }) { }} > <Icon icon="translate" /> - <span>Translate</span> + <span> + <Trans>Translate</Trans> + </span> </MenuItem> {supportsTTS && ( <MenuItem @@ -59,7 +64,9 @@ export default function MediaAltModal({ alt, lang, onClose }) { }} > <Icon icon="speak" /> - <span>Speak</span> + <span> + <Trans>Speak</Trans> + </span> </MenuItem> )} </Menu2> diff --git a/src/components/media-modal.jsx b/src/components/media-modal.jsx index 968988bf..89309e1b 100644 --- a/src/components/media-modal.jsx +++ b/src/components/media-modal.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { MenuDivider, MenuItem } from '@szhsin/react-menu'; import { getBlurHashAverageColor } from 'fast-blurhash'; import { @@ -9,15 +10,17 @@ import { } from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; -import { oklab2rgb, rgb2oklab } from '../utils/color-utils'; +import { oklch2rgb, rgb2oklch } from '../utils/color-utils'; +import isRTL from '../utils/is-rtl'; import showToast from '../utils/show-toast'; import states from '../utils/states'; +import store from '../utils/store'; import Icon from './icon'; import Link from './link'; import Media from './media'; -import Menu2 from './menu2'; import MenuLink from './menu-link'; +import Menu2 from './menu2'; const { PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL } = import.meta.env; @@ -53,11 +56,11 @@ function MediaModal({ const scrollLeft = index * carouselRef.current.clientWidth; const differentStatusID = prevStatusID.current !== statusID; if (differentStatusID) prevStatusID.current = statusID; + carouselRef.current.focus(); carouselRef.current.scrollTo({ - left: scrollLeft, + left: scrollLeft * (isRTL() ? -1 : 1), behavior: differentStatusID ? 'auto' : 'smooth', }); - carouselRef.current.focus(); }, [index, statusID]); const [showControls, setShowControls] = useState(true); @@ -91,7 +94,7 @@ function MediaModal({ useEffect(() => { let handleScroll = () => { const { clientWidth, scrollLeft } = carouselRef.current; - const index = Math.round(scrollLeft / clientWidth); + const index = Math.round(Math.abs(scrollLeft) / clientWidth); setCurrentIndex(index); }; if (carouselRef.current) { @@ -113,39 +116,64 @@ function MediaModal({ return () => clearTimeout(timer); }, []); - const mediaAccentColors = useMemo(() => { + const mediaOkColors = useMemo(() => { return mediaAttachments?.map((media) => { const { blurhash } = media; if (blurhash) { const averageColor = getBlurHashAverageColor(blurhash); - const labAverageColor = rgb2oklab(averageColor); - return oklab2rgb([0.6, labAverageColor[1], labAverageColor[2]]); + return rgb2oklch(averageColor); } return null; }); }, [mediaAttachments]); - const mediaAccentGradient = useMemo(() => { + const mediaAccentColors = useMemo(() => { + return mediaOkColors?.map((okColor) => { + if (okColor) { + return { + light: oklch2rgb([0.95, 0.01, okColor[2]]), + dark: oklch2rgb([0.35, 0.01, okColor[2]]), + default: oklch2rgb([0.6, okColor[1], okColor[2]]), + }; + } + return null; + }); + }); + const mediaAccentGradients = useMemo(() => { const gap = 5; const range = 100 / mediaAccentColors.length; - return ( - mediaAccentColors - ?.map((color, i) => { - const start = i * range + gap; - const end = (i + 1) * range - gap; - if (color) { - return ` - rgba(${color?.join(',')}, 0.4) ${start}%, - rgba(${color?.join(',')}, 0.4) ${end}% - `; - } + const colors = mediaAccentColors.map((color, i) => { + const start = i * range + gap; + const end = (i + 1) * range - gap; + if (color?.light && color?.dark) { + return { + light: ` + rgb(${color.light?.join(',')}) ${start}%, + rgb(${color.light?.join(',')}) ${end}% + `, + dark: ` + rgb(${color.dark?.join(',')}) ${start}%, + rgb(${color.dark?.join(',')}) ${end}% + `, + }; + } - return ` - transparent ${start}%, - transparent ${end}% - `; - }) - ?.join(', ') || 'transparent' - ); + return { + light: ` + transparent ${start}%, + transparent ${end}% + `, + dark: ` + transparent ${start}%, + transparent ${end}% + `, + }; + }); + const lightGradient = colors.map((color) => color.light).join(', '); + const darkGradient = colors.map((color) => color.dark).join(', '); + return { + light: lightGradient, + dark: darkGradient, + }; }, [mediaAccentColors]); let toastRef = useRef(null); @@ -155,6 +183,46 @@ function MediaModal({ }; }, []); + useLayoutEffect(() => { + const currentColor = mediaAccentColors[currentIndex]; + let $meta; + let metaColor; + if (currentColor) { + const theme = store.local.get('theme'); + if (theme) { + const mediaColor = `rgb(${currentColor[theme].join(',')})`; + console.log({ mediaColor }); + $meta = document.querySelector( + `meta[name="theme-color"][data-theme-setting="manual"]`, + ); + if ($meta) { + metaColor = $meta.content; + $meta.content = mediaColor; + } + } else { + const colorScheme = window.matchMedia('(prefers-color-scheme: dark)') + .matches + ? 'dark' + : 'light'; + const mediaColor = `rgb(${currentColor[colorScheme].join(',')})`; + console.log({ mediaColor }); + $meta = document.querySelector( + `meta[name="theme-color"][media*="${colorScheme}"]`, + ); + if ($meta) { + metaColor = $meta.content; + $meta.content = mediaColor; + } + } + } + return () => { + // Reset meta color + if ($meta && metaColor) { + $meta.content = metaColor; + } + }; + }, [currentIndex, mediaAccentColors]); + return ( <div class={`media-modal-container media-modal-count-${mediaAttachments?.length}`} @@ -177,8 +245,10 @@ function MediaModal({ mediaAttachments.length > 1 ? { backgroundAttachment: 'local', - backgroundImage: `linear-gradient( - to right, ${mediaAccentGradient})`, + '--accent-gradient-light': mediaAccentGradients?.light, + '--accent-gradient-dark': mediaAccentGradients?.dark, + // backgroundImage: `linear-gradient( + // to ${isRTL() ? 'left' : 'right'}, ${mediaAccentGradient})`, } : {} } @@ -192,8 +262,14 @@ function MediaModal({ style={ accentColor ? { - '--accent-color': `rgb(${accentColor?.join(',')})`, - '--accent-alpha-color': `rgba(${accentColor?.join( + '--accent-color': `rgb(${accentColor.default.join(',')})`, + '--accent-light-color': `rgb(${accentColor.light?.join( + ',', + )})`, + '--accent-dark-color': `rgb(${accentColor.dark?.join( + ',', + )})`, + '--accent-alpha-color': `rgba(${accentColor.default.join( ',', )}, 0.4)`, } @@ -242,7 +318,7 @@ function MediaModal({ class="carousel-button" onClick={() => onClose()} > - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> </span> {mediaAttachments?.length > 1 ? ( @@ -256,14 +332,13 @@ function MediaModal({ onClick={(e) => { e.preventDefault(); e.stopPropagation(); - carouselRef.current.scrollTo({ - left: carouselRef.current.clientWidth * i, - behavior: 'smooth', - }); + const left = + carouselRef.current.clientWidth * i * (isRTL() ? -1 : 1); carouselRef.current.focus(); + carouselRef.current.scrollTo({ left, behavior: 'smooth' }); }} > - <Icon icon="round" size="s" /> + <Icon icon="round" size="s" alt="⸱" /> </button> ))} </span> @@ -279,7 +354,7 @@ function MediaModal({ menuClassName="glass-menu" menuButton={ <button type="button" class="carousel-button"> - <Icon icon="more" alt="More" /> + <Icon icon="more" alt={t`More`} /> </button> } > @@ -290,10 +365,12 @@ function MediaModal({ } class="carousel-button" target="_blank" - title="Open original media in new window" + title={t`Open original media in new window`} > <Icon icon="popout" /> - <span>Open original media</span> + <span> + <Trans>Open original media</Trans> + </span> </MenuLink> {import.meta.env.DEV && // Only dev for now !!states.settings.mediaAltGenerator && @@ -308,7 +385,7 @@ function MediaModal({ onClick={() => { setUIState('loading'); toastRef.current = showToast({ - text: 'Attempting to describe image. Please wait...', + text: t`Attempting to describe image. Please wait…`, duration: -1, }); (async function () { @@ -323,7 +400,7 @@ function MediaModal({ }; } catch (e) { console.error(e); - showToast('Failed to describe image'); + showToast(t`Failed to describe image`); } finally { setUIState('default'); toastRef.current?.hideToast?.(); @@ -332,7 +409,9 @@ function MediaModal({ }} > <Icon icon="sparkles2" /> - <span>Describe image…</span> + <span> + <Trans>Describe image…</Trans> + </span> </MenuItem> </> )} @@ -353,7 +432,10 @@ function MediaModal({ // } // }} > - <span class="button-label">View post </span>» + <span class="button-label"> + <Trans>View post</Trans>{' '} + </span> + » </Link> </span> </div> @@ -368,12 +450,15 @@ function MediaModal({ e.stopPropagation(); carouselRef.current.focus(); carouselRef.current.scrollTo({ - left: carouselRef.current.clientWidth * (currentIndex - 1), + left: + carouselRef.current.clientWidth * + (currentIndex - 1) * + (isRTL() ? -1 : 1), behavior: 'smooth', }); }} > - <Icon icon="arrow-left" /> + <Icon icon="arrow-left" alt={t`Previous`} /> </button> <button type="button" @@ -384,12 +469,15 @@ function MediaModal({ e.stopPropagation(); carouselRef.current.focus(); carouselRef.current.scrollTo({ - left: carouselRef.current.clientWidth * (currentIndex + 1), + left: + carouselRef.current.clientWidth * + (currentIndex + 1) * + (isRTL() ? -1 : 1), behavior: 'smooth', }); }} > - <Icon icon="arrow-right" /> + <Icon icon="arrow-right" alt={t`Next`} /> </button> </div> )} diff --git a/src/components/media-post.css b/src/components/media-post.css index 2a52a11a..306e5a27 100644 --- a/src/components/media-post.css +++ b/src/components/media-post.css @@ -23,7 +23,7 @@ pointer-events: none; position: absolute; top: 0; - left: 0; + inset-inline-start: 0; z-index: 1; background-color: var(--bg-blur-color); margin: 8px; diff --git a/src/components/media-post.jsx b/src/components/media-post.jsx index d5d09f5f..58c3495b 100644 --- a/src/components/media-post.jsx +++ b/src/components/media-post.jsx @@ -1,5 +1,6 @@ import './media-post.css'; +import { t, Trans } from '@lingui/macro'; import { memo } from 'preact/compat'; import { useContext, useMemo } from 'preact/hooks'; import { useSnapshot } from 'valtio'; @@ -8,6 +9,7 @@ import FilterContext from '../utils/filter-context'; import { isFiltered } from '../utils/filters'; import states, { statusKey } from '../utils/states'; import store from '../utils/store'; +import { getCurrentAccountID } from '../utils/store-utils'; import Media from './media'; @@ -88,7 +90,7 @@ function MediaPost({ }; const currentAccount = useMemo(() => { - return store.session.get('currentAccount'); + return getCurrentAccountID(); }, []); const isSelf = useMemo(() => { return currentAccount && currentAccount === accountId; @@ -107,7 +109,7 @@ function MediaPost({ const readingExpandMedia = useMemo(() => { // default | show_all | hide_all const prefs = store.account.get('preferences') || {}; - return prefs['reading:expand:media'] || 'default'; + return prefs['reading:expand:media']?.toLowerCase() || 'default'; }, []); const showSpoilerMedia = readingExpandMedia === 'show_all'; @@ -122,11 +124,13 @@ function MediaPost({ onMouseEnter={debugHover} key={mediaKey} data-spoiler-text={ - spoilerText || (sensitive ? 'Sensitive media' : undefined) + spoilerText || (sensitive ? t`Sensitive media` : undefined) } data-filtered-text={ filterInfo - ? `Filtered${filterTitleStr ? `: ${filterTitleStr}` : ''}` + ? filterTitleStr + ? t`Filtered: ${filterTitleStr}` + : t`Filtered` : undefined } class={` diff --git a/src/components/media.jsx b/src/components/media.jsx index abb343cb..fc92df69 100644 --- a/src/components/media.jsx +++ b/src/components/media.jsx @@ -1,5 +1,7 @@ +import { t, Trans } from '@lingui/macro'; import { getBlurHashAverageColor } from 'fast-blurhash'; import { Fragment } from 'preact'; +import { memo } from 'preact/compat'; import { useCallback, useLayoutEffect, @@ -9,12 +11,12 @@ import { } from 'preact/hooks'; import QuickPinchZoom, { make3dTransformValue } from 'react-quick-pinch-zoom'; +import formatDuration from '../utils/format-duration'; import mem from '../utils/mem'; import states from '../utils/states'; import Icon from './icon'; import Link from './link'; -import { formatDuration } from './status'; const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755 @@ -45,7 +47,7 @@ const AltBadge = (props) => { lang, }; }} - title="Media description" + title={t`Media description`} > {dataAltLabel} {!!index && <sup>{index}</sup>} @@ -72,9 +74,10 @@ function Media({ showCaption, allowLongerCaption, altIndex, + checkAspectRatio = true, onClick = () => {}, }) { - const { + let { blurhash, description, meta, @@ -84,15 +87,27 @@ function Media({ url, type, } = media; + if (/no\-preview\./i.test(previewUrl)) { + previewUrl = null; + } const { original = {}, small, focus } = meta || {}; - const width = showOriginal ? original?.width : small?.width; - const height = showOriginal ? original?.height : small?.height; + const width = showOriginal + ? original?.width + : small?.width || original?.width; + const height = showOriginal + ? original?.height + : small?.height || original?.height; const mediaURL = showOriginal ? url : previewUrl || url; const remoteMediaURL = showOriginal ? remoteUrl : previewRemoteUrl || remoteUrl; - const orientation = width >= height ? 'landscape' : 'portrait'; + const hasDimensions = width && height; + const orientation = hasDimensions + ? width > height + ? 'landscape' + : 'portrait' + : null; const rgbAverageColor = blurhash ? getBlurHashAverageColor(blurhash) : null; @@ -133,7 +148,8 @@ function Media({ enabled: pinchZoomEnabled, draggableUnZoomed: false, inertiaFriction: 0.9, - doubleTapZoomOutOnMaxScale: true, + tapZoomFactor: 2, + doubleTapToggleZoom: true, containerProps: { className: 'media-zoom', style: { @@ -153,7 +169,7 @@ function Media({ [to], ); - const remoteMediaURLObj = remoteMediaURL ? new URL(remoteMediaURL) : null; + const remoteMediaURLObj = remoteMediaURL ? getURLObj(remoteMediaURL) : null; const isVideoMaybe = type === 'unknown' && remoteMediaURLObj && @@ -235,6 +251,8 @@ function Media({ ); }; + const [hasNaturalAspectRatio, setHasNaturalAspectRatio] = useState(undefined); + if (isImage) { // Note: type: unknown might not have width/height quickPinchZoomProps.containerProps.style.display = 'inherit'; @@ -259,7 +277,8 @@ function Media({ class={`media media-image ${className}`} onClick={onClick} data-orientation={orientation} - data-has-alt={!showInlineDesc} + data-has-alt={!showInlineDesc || undefined} + data-has-natural-aspect-ratio={hasNaturalAspectRatio || undefined} style={ showOriginal ? { @@ -290,7 +309,11 @@ function Media({ }} onError={(e) => { const { src } = e.target; - if (src === mediaURL && mediaURL !== remoteMediaURL) { + if ( + src === mediaURL && + remoteMediaURL && + mediaURL !== remoteMediaURL + ) { e.target.src = remoteMediaURL; } }} @@ -321,6 +344,48 @@ function Media({ onLoad={(e) => { // e.target.closest('.media-image').style.backgroundImage = ''; e.target.dataset.loaded = true; + const $media = e.target.closest('.media'); + if (!hasDimensions && $media) { + const { naturalWidth, naturalHeight } = e.target; + $media.dataset.orientation = + naturalWidth > naturalHeight ? 'landscape' : 'portrait'; + $media.style.setProperty('--width', `${naturalWidth}px`); + $media.style.setProperty('--height', `${naturalHeight}px`); + $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`; + } + + // Check natural aspect ratio vs display aspect ratio + if (checkAspectRatio && $media) { + const { + clientWidth, + clientHeight, + naturalWidth, + naturalHeight, + } = e.target; + if ( + clientWidth && + clientHeight && + naturalWidth && + naturalHeight + ) { + const minDimension = 88; + if ( + naturalWidth < minDimension || + naturalHeight < minDimension + ) { + $media.dataset.hasSmallDimension = true; + } else { + const displayNaturalHeight = + (naturalHeight * clientWidth) / naturalWidth; + const almostSimilarHeight = + Math.abs(displayNaturalHeight - clientHeight) < 5; + + if (almostSimilarHeight) { + setHasNaturalAspectRatio(true); + } + } + } + } }} onError={(e) => { const { src } = e.target; @@ -338,6 +403,7 @@ function Media({ </Figure> ); } else if (type === 'gifv' || type === 'video' || isVideoMaybe) { + const hasDuration = original.duration > 0; const shortDuration = original.duration < 31; const isGIF = type === 'gifv' && shortDuration; // If GIF is too long, treat it as a video @@ -347,28 +413,43 @@ function Media({ const autoGIFAnimate = !showOriginal && autoAnimate && isGIF; const showProgress = original.duration > 5; - const videoHTML = ` - <video - src="${url}" - poster="${previewUrl}" - width="${width}" - height="${height}" - data-orientation="${orientation}" - preload="auto" - autoplay - muted="${isGIF}" - ${isGIF ? '' : 'controls'} - playsinline - loop="${loopable}" - ${isGIF ? 'ondblclick="this.paused ? this.play() : this.pause()"' : ''} - ${ - isGIF && showProgress - ? "ontimeupdate=\"this.closest('.media-gif') && this.closest('.media-gif').style.setProperty('--progress', `${~~((this.currentTime / this.duration) * 100)}%`)\"" - : '' - } - ></video> + // This string is only for autoplay + muted to work on Mobile Safari + const gifHTML = ` + <video + src="${url}" + poster="${previewUrl}" + width="${width}" + height="${height}" + data-orientation="${orientation}" + preload="auto" + autoplay + muted + playsinline + ${loopable ? 'loop' : ''} + ondblclick="this.paused ? this.play() : this.pause()" + ${ + showProgress + ? "ontimeupdate=\"this.closest('.media-gif') && this.closest('.media-gif').style.setProperty('--progress', `${~~((this.currentTime / this.duration) * 100)}%`)\"" + : '' + } + ></video> `; + const videoHTML = ` + <video + src="${url}" + poster="${previewUrl}" + width="${width}" + height="${height}" + data-orientation="${orientation}" + preload="auto" + autoplay + playsinline + ${loopable ? 'loop' : ''} + controls + ></video> + `; + return ( <Figure> <Parent @@ -379,8 +460,10 @@ function Media({ data-formatted-duration={ !showOriginal ? formattedDuration : undefined } - data-label={isGIF && !showOriginal && !autoGIFAnimate ? 'GIF' : ''} - data-has-alt={!showInlineDesc} + data-label={ + isGIF && !showOriginal && !autoGIFAnimate ? 'GIF' : undefined + } + data-has-alt={!showInlineDesc || undefined} // style={{ // backgroundColor: // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`, @@ -429,17 +512,22 @@ function Media({ <div ref={mediaRef} dangerouslySetInnerHTML={{ - __html: videoHTML, + __html: gifHTML, }} /> </QuickPinchZoom> - ) : ( + ) : isGIF ? ( <div class="video-container" dangerouslySetInnerHTML={{ - __html: videoHTML, + __html: gifHTML, }} /> + ) : ( + <div + class="video-container" + dangerouslySetInnerHTML={{ __html: videoHTML }} + /> ) ) : isGIF ? ( <video @@ -473,16 +561,63 @@ function Media({ /> ) : ( <> - <img - src={previewUrl} - alt={showInlineDesc ? '' : description} - width={width} - height={height} - data-orientation={orientation} - loading="lazy" - /> + {previewUrl ? ( + <img + src={previewUrl} + alt={showInlineDesc ? '' : description} + width={width} + height={height} + data-orientation={orientation} + loading="lazy" + decoding="async" + onLoad={(e) => { + if (!hasDimensions) { + const $media = e.target.closest('.media'); + if ($media) { + const { naturalHeight, naturalWidth } = e.target; + $media.dataset.orientation = + naturalWidth > naturalHeight + ? 'landscape' + : 'portrait'; + $media.style.setProperty( + '--width', + `${naturalWidth}px`, + ); + $media.style.setProperty( + '--height', + `${naturalHeight}px`, + ); + $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`; + } + } + }} + /> + ) : ( + <video + src={url + '#t=0.1'} // Make Safari show 1st-frame preview + width={width} + height={height} + data-orientation={orientation} + preload="metadata" + muted + disablePictureInPicture + onLoadedMetadata={(e) => { + if (!hasDuration) { + const { duration } = e.target; + if (duration) { + const formattedDuration = formatDuration(duration); + const container = e.target.closest('.media-video'); + if (container) { + container.dataset.formattedDuration = + formattedDuration; + } + } + } + }} + /> + )} <div class="media-play"> - <Icon icon="play" size="xl" /> + <Icon icon="play" size="xl" alt="▶" /> </div> </> )} @@ -501,12 +636,12 @@ function Media({ data-formatted-duration={ !showOriginal ? formattedDuration : undefined } - data-has-alt={!showInlineDesc} + data-has-alt={!showInlineDesc || undefined} onClick={onClick} style={!showOriginal && mediaStyles} > {showOriginal ? ( - <audio src={remoteUrl || url} preload="none" controls autoplay /> + <audio src={remoteUrl || url} preload="none" controls autoPlay /> ) : previewUrl ? ( <img src={previewUrl} @@ -526,7 +661,7 @@ function Media({ {!showOriginal && ( <> <div class="media-play"> - <Icon icon="play" size="xl" /> + <Icon icon="play" size="xl" alt="▶" /> </div> {!showInlineDesc && ( <AltBadge alt={description} lang={lang} index={altIndex} /> @@ -539,4 +674,19 @@ function Media({ } } -export default Media; +function getURLObj(url) { + // Fake base URL if url doesn't have https:// prefix + return URL.parse(url, location.origin); +} + +export default memo(Media, (oldProps, newProps) => { + const oldMedia = oldProps.media || {}; + const newMedia = newProps.media || {}; + + return ( + oldMedia?.id === newMedia?.id && + oldMedia.url === newMedia.url && + oldProps.to === newProps.to && + oldProps.class === newProps.class + ); +}); diff --git a/src/components/menu-confirm.jsx b/src/components/menu-confirm.jsx index b2bb18d5..f1df396f 100644 --- a/src/components/menu-confirm.jsx +++ b/src/components/menu-confirm.jsx @@ -1,8 +1,8 @@ -import { MenuItem, SubMenu } from '@szhsin/react-menu'; +import { MenuItem } from '@szhsin/react-menu'; import { cloneElement } from 'preact'; -import { useRef } from 'preact/hooks'; import Menu2 from './menu2'; +import SubMenu2 from './submenu2'; function MenuConfirm({ subMenu = false, @@ -23,11 +23,9 @@ function MenuConfirm({ } return children; } - const Parent = subMenu ? SubMenu : Menu2; - const menuRef = useRef(); + const Parent = subMenu ? SubMenu2 : Menu2; return ( <Parent - instanceRef={menuRef} openTrigger="clickOnly" direction="bottom" overflow="auto" @@ -37,19 +35,6 @@ function MenuConfirm({ {...restProps} menuButton={subMenu ? undefined : children} label={subMenu ? children : undefined} - // Test fix for bug; submenus not opening on Android - itemProps={{ - onPointerMove: (e) => { - if (e.pointerType === 'touch') { - menuRef.current?.openMenu?.(); - } - }, - onPointerLeave: (e) => { - if (e.pointerType === 'touch') { - menuRef.current?.openMenu?.(); - } - }, - }} > <MenuItem className={menuItemClassName} onClick={onClick}> {confirmLabel} diff --git a/src/components/menu2.jsx b/src/components/menu2.jsx index 6ca68320..0dbf2a51 100644 --- a/src/components/menu2.jsx +++ b/src/components/menu2.jsx @@ -1,21 +1,33 @@ import { Menu } from '@szhsin/react-menu'; -import { useWindowSize } from '@uidotdev/usehooks'; import { useRef } from 'preact/hooks'; +import isRTL from '../utils/is-rtl'; import safeBoundingBoxPadding from '../utils/safe-bounding-box-padding'; +import useWindowSize from '../utils/useWindowSize'; // It's like Menu but with sensible defaults, bug fixes and improvements. function Menu2(props) { - const { containerProps, instanceRef: _instanceRef } = props; + const { containerProps, instanceRef: _instanceRef, align } = props; const size = useWindowSize(); const instanceRef = _instanceRef?.current ? _instanceRef : useRef(); + // Values: start, end, center + // Note: don't mess with 'center' + const rtlAlign = isRTL() + ? align === 'end' + ? 'start' + : align === 'start' + ? 'end' + : align + : align; + return ( <Menu boundingBoxPadding={safeBoundingBoxPadding()} repositionFlag={`${size.width}x${size.height}`} unmountOnClose {...props} + align={rtlAlign} instanceRef={instanceRef} containerProps={{ onClick: (e) => { diff --git a/src/components/modal.css b/src/components/modal.css index 713ed308..80b9ccad 100644 --- a/src/components/modal.css +++ b/src/components/modal.css @@ -1,7 +1,7 @@ #modal-container > div { position: fixed; top: 0; - right: 0; + inset-inline-end: 0; height: 100%; width: 100%; z-index: 1000; @@ -10,17 +10,65 @@ align-items: center; background-color: var(--backdrop-color); animation: appear 0.5s var(--timing-function) both; + transition: all 0.5s var(--timing-function); &.solid { background-color: var(--backdrop-solid-color); } + --compose-button-dimension: 56px; + --compose-button-dimension-half: calc(var(--compose-button-dimension) / 2); + --compose-button-dimension-margin: 16px; + + &.min { + /* Minimized */ + pointer-events: none; + user-select: none; + overflow: hidden; + transform: scale(0); + --end: max( + var(--compose-button-dimension-margin), + env(safe-area-inset-right) + ); + :dir(rtl) & { + --end: max( + var(--compose-button-dimension-margin), + env(safe-area-inset-left) + ); + } + --bottom: max( + var(--compose-button-dimension-margin), + env(safe-area-inset-bottom) + ); + --origin-end: calc( + 100% - var(--compose-button-dimension-half) - var(--end) + ); + :dir(rtl) & { + --origin-end: calc(var(--compose-button-dimension-half) + var(--end)); + } + --origin-bottom: calc( + 100% - var(--compose-button-dimension-half) - var(--bottom) + ); + transform-origin: var(--origin-end) var(--origin-bottom); + } + .sheet { transition: transform 0.3s var(--timing-function); - transform-origin: center bottom; + transform-origin: 80% 80%; } &:has(~ div) .sheet { transform: scale(0.975); } } + +@media (max-width: calc(40em - 1px)) { + #app[data-shortcuts-view-mode='tab-menu-bar'] ~ #modal-container > div.min { + border: 2px solid red; + + --bottom: calc( + var(--compose-button-dimension-margin) + env(safe-area-inset-bottom) + + 52px + ); + } +} diff --git a/src/components/modal.jsx b/src/components/modal.jsx index f1aaaf0e..b0d2d2de 100644 --- a/src/components/modal.jsx +++ b/src/components/modal.jsx @@ -1,14 +1,21 @@ import './modal.css'; import { createPortal } from 'preact/compat'; -import { useEffect, useRef } from 'preact/hooks'; +import { useEffect, useLayoutEffect, useRef } from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; +import store from '../utils/store'; import useCloseWatcher from '../utils/useCloseWatcher'; const $modalContainer = document.getElementById('modal-container'); -function Modal({ children, onClose, onClick, class: className }) { +function getBackdropThemeColor() { + return getComputedStyle(document.documentElement).getPropertyValue( + '--backdrop-theme-color', + ); +} + +function Modal({ children, onClose, onClick, class: className, minimized }) { if (!children) return null; const modalRef = useRef(); @@ -41,11 +48,82 @@ function Modal({ children, onClose, onClick, class: className }) { ); useCloseWatcher(onClose, [onClose]); + useEffect(() => { + const $deckContainers = document.querySelectorAll('.deck-container'); + if (minimized) { + // Similar to focusDeck in focus-deck.jsx + // Focus last deck + const page = $deckContainers[$deckContainers.length - 1]; // last one + if (page && page.tabIndex === -1) { + page.focus(); + } + } else { + if (children) { + $deckContainers.forEach(($deckContainer) => { + $deckContainer.setAttribute('inert', ''); + }); + } else { + $deckContainers.forEach(($deckContainer) => { + $deckContainer.removeAttribute('inert'); + }); + } + } + return () => { + $deckContainers.forEach(($deckContainer) => { + $deckContainer.removeAttribute('inert'); + }); + }; + }, [children, minimized]); + + const $meta = useRef(); + const metaColor = useRef(); + useLayoutEffect(() => { + if (children && !minimized) { + const theme = store.local.get('theme'); + if (theme) { + const backdropColor = getBackdropThemeColor(); + console.log({ backdropColor }); + $meta.current = document.querySelector( + `meta[name="theme-color"][data-theme-setting="manual"]`, + ); + if ($meta.current) { + metaColor.current = $meta.current.content; + $meta.current.content = backdropColor; + } + } else { + const colorScheme = window.matchMedia('(prefers-color-scheme: dark)') + .matches + ? 'dark' + : 'light'; + const backdropColor = getBackdropThemeColor(); + console.log({ backdropColor }); + $meta.current = document.querySelector( + `meta[name="theme-color"][media*="${colorScheme}"]`, + ); + if ($meta.current) { + metaColor.current = $meta.current.content; + $meta.current.content = backdropColor; + } + } + } else { + // Reset meta color + if ($meta.current && metaColor.current) { + $meta.current.content = metaColor.current; + } + } + return () => { + // Reset meta color + if ($meta.current && metaColor.current) { + $meta.current.content = metaColor.current; + } + }; + }, [children, minimized]); + const Modal = ( <div ref={(node) => { modalRef.current = node; - escRef.current = node?.querySelector?.('[tabindex="-1"]') || node; + escRef(node?.querySelector?.('[tabindex="-1"]') || node); }} className={className} onClick={(e) => { @@ -54,7 +132,8 @@ function Modal({ children, onClose, onClick, class: className }) { onClose?.(e); } }} - tabIndex="-1" + tabIndex={minimized ? 0 : '-1'} + inert={minimized} onFocus={(e) => { try { if (e.target === e.currentTarget) { diff --git a/src/components/modals.jsx b/src/components/modals.jsx index 49437959..e961f585 100644 --- a/src/components/modals.jsx +++ b/src/components/modals.jsx @@ -1,3 +1,5 @@ +import { t, Trans } from '@lingui/macro'; +import { useEffect } from 'preact/hooks'; import { useLocation, useNavigate } from 'react-router-dom'; import { subscribe, useSnapshot } from 'valtio'; @@ -8,7 +10,7 @@ import showToast from '../utils/show-toast'; import states from '../utils/states'; import AccountSheet from './account-sheet'; -import Compose from './compose'; +import ComposeSuspense, { preload } from './compose-suspense'; import Drafts from './drafts'; import EmbedModal from './embed-modal'; import GenericAccounts from './generic-accounts'; @@ -32,11 +34,18 @@ export default function Modals() { const navigate = useNavigate(); const location = useLocation(); + useEffect(() => { + setTimeout(preload, 1000); + }, []); + return ( <> {!!snapStates.showCompose && ( - <Modal class="solid"> - <Compose + <Modal + class={`solid ${snapStates.composerState.minimized ? 'min' : ''}`} + minimized={!!snapStates.composerState.minimized} + > + <ComposeSuspense replyToStatus={ typeof snapStates.showCompose !== 'boolean' ? snapStates.showCompose.replyToStatus @@ -60,9 +69,9 @@ export default function Modals() { states.reloadStatusPage++; showToast({ text: { - post: 'Post published. Check it out.', - reply: 'Reply posted. Check it out.', - edit: 'Post updated. Check it out.', + post: t`Post published. Check it out.`, + reply: t`Reply posted. Check it out.`, + edit: t`Post updated. Check it out.`, }[type || 'post'], delay: 1000, duration: 10_000, // 10 seconds @@ -179,7 +188,9 @@ export default function Modals() { excludeRelationshipAttrs={ snapStates.showGenericAccounts.excludeRelationshipAttrs } + postID={snapStates.showGenericAccounts.postID} onClose={() => (states.showGenericAccounts = false)} + blankCopy={snapStates.showGenericAccounts.blankCopy} /> </Modal> )} diff --git a/src/components/name-text.css b/src/components/name-text.css index 374184d4..aec88aed 100644 --- a/src/components/name-text.css +++ b/src/components/name-text.css @@ -5,9 +5,14 @@ unicode-bidi: isolate; b { - font-weight: 500; + font-weight: 600; unicode-bidi: isolate; } + + i { + font-variant-numeric: slashed-zero; + font-feature-settings: 'ss01'; + } } .name-text.show-acct { display: inline-block; diff --git a/src/components/name-text.jsx b/src/components/name-text.jsx index f807d631..82fa8c07 100644 --- a/src/components/name-text.jsx +++ b/src/components/name-text.jsx @@ -1,16 +1,31 @@ import './name-text.css'; +import { useLingui } from '@lingui/react'; import { memo } from 'preact/compat'; +import { api } from '../utils/api'; +import mem from '../utils/mem'; import states from '../utils/states'; import Avatar from './avatar'; import EmojiText from './emoji-text'; -const nameCollator = new Intl.Collator('en', { - sensitivity: 'base', +const nameCollator = mem((locale) => { + const options = { + sensitivity: 'base', + }; + try { + return new Intl.Collator(locale || undefined, options); + } catch (e) { + return new Intl.Collator(undefined, options); + } }); +const ACCT_REGEX = /([^@]+)(@.+)/i; +const SHORTCODES_REGEX = /(\:(\w|\+|\-)+\:)(?=|[\!\.\?]|$)/g; +const SPACES_REGEX = /\s+/g; +const NON_ALPHA_NUMERIC_REGEX = /[^a-z0-9@\.]/gi; + function NameText({ account, instance, @@ -20,42 +35,64 @@ function NameText({ external, onClick, }) { - const { acct, avatar, avatarStatic, id, url, displayName, emojis, bot } = - account; - let { username } = account; - const [_, acct1, acct2] = acct.match(/([^@]+)(@.+)/i) || [, acct]; + const { i18n } = useLingui(); + const { + acct, + avatar, + avatarStatic, + id, + url, + displayName, + emojis, + bot, + username, + } = account; + const [_, acct1, acct2] = acct.match(ACCT_REGEX) || [, acct]; + + if (!instance) instance = api().instance; const trimmedUsername = username.toLowerCase().trim(); const trimmedDisplayName = (displayName || '').toLowerCase().trim(); const shortenedDisplayName = trimmedDisplayName - .replace(/(\:(\w|\+|\-)+\:)(?=|[\!\.\?]|$)/g, '') // Remove shortcodes, regex from https://regex101.com/r/iE9uV0/1 - .replace(/\s+/g, ''); // E.g. "My name" === "myname" + .replace(SHORTCODES_REGEX, '') // Remove shortcodes, regex from https://regex101.com/r/iE9uV0/1 + .replace(SPACES_REGEX, ''); // E.g. "My name" === "myname" const shortenedAlphaNumericDisplayName = shortenedDisplayName.replace( - /[^a-z0-9]/gi, + NON_ALPHA_NUMERIC_REGEX, '', ); // Remove non-alphanumeric characters - if ( - !short && - (trimmedUsername === trimmedDisplayName || - trimmedUsername === shortenedDisplayName || - trimmedUsername === shortenedAlphaNumericDisplayName || - nameCollator.compare(trimmedUsername, shortenedDisplayName) === 0) - ) { - username = null; - } + const hideUsername = + (!short && + (trimmedUsername === trimmedDisplayName || + trimmedUsername === shortenedDisplayName || + trimmedUsername === shortenedAlphaNumericDisplayName || + nameCollator(i18n.locale).compare( + trimmedUsername, + shortenedDisplayName, + ) === 0)) || + shortenedAlphaNumericDisplayName === acct.toLowerCase(); return ( <a class={`name-text ${showAcct ? 'show-acct' : ''} ${short ? 'short' : ''}`} href={url} target={external ? '_blank' : null} - title={`${displayName ? `${displayName} ` : ''}@${acct}`} + title={ + displayName + ? `${displayName} (${acct2 ? '' : '@'}${acct})` + : `${acct2 ? '' : '@'}${acct}` + } onClick={(e) => { if (external) return; + if (e.shiftKey) return; // Save link? 🤷‍♂️ e.preventDefault(); e.stopPropagation(); if (onClick) return onClick(e); + if (e.metaKey || e.ctrlKey || e.shiftKey || e.which === 2) { + const internalURL = `#/${instance}/a/${id}`; + window.open(internalURL, '_blank'); + return; + } states.showAccount = { account, instance, @@ -69,13 +106,13 @@ function NameText({ )} {displayName && !short ? ( <> - <b> + <b dir="auto"> <EmojiText text={displayName} emojis={emojis} /> </b> - {!showAcct && username && ( + {!showAcct && !hideUsername && ( <> {' '} - <i>@{username}</i> + <i class="bidi-isolate">@{username}</i> </> )} </> @@ -87,9 +124,10 @@ function NameText({ {showAcct && ( <> <br /> - <i> - @{acct1} - <span class="ib">{acct2}</span> + <i class="bidi-isolate"> + {acct2 ? '' : '@'} + {acct1} + {!!acct2 && <span class="ib">{acct2}</span>} </i> </> )} @@ -97,9 +135,11 @@ function NameText({ ); } -export default memo(NameText, (oldProps, newProps) => { - // Only care about account.id, the other props usually don't change - const { account } = oldProps; - const { account: newAccount } = newProps; - return account?.acct === newAccount?.acct; -}); +export default mem(NameText); + +// export default memo(NameText, (oldProps, newProps) => { +// // Only care about account.id, the other props usually don't change +// const { account } = oldProps; +// const { account: newAccount } = newProps; +// return account?.acct === newAccount?.acct; +// }); diff --git a/src/components/nav-menu.css b/src/components/nav-menu.css index 0e8e302f..5a69c777 100644 --- a/src/components/nav-menu.css +++ b/src/components/nav-menu.css @@ -1,28 +1,39 @@ -.nav-menu section:last-child { - background-color: var(--bg-faded-color); - margin-bottom: -8px; - padding-bottom: 8px; +.nav-menu { + overflow: hidden; + + section:last-child { + background-color: var(--bg-faded-color); + margin-bottom: -4px; + padding-bottom: 4px; + + .szh-menu__item:before { + z-index: 0; + } + .szh-menu__item > * { + z-index: 1; + } + } } @media (min-width: 23em) { .nav-menu { display: grid; - grid-template-columns: 1fr 1fr; + grid-template-columns: 50% 50%; grid-template-rows: auto 1fr; grid-template-areas: 'top top' 'left right'; padding: 0; - width: 22em; + /* min-width: 22em; */ max-width: calc(100vw - 16px); } .nav-menu .top-menu { grid-area: top; - padding-top: 8px; - margin-bottom: -8px; + padding-top: 4px; + margin-bottom: -4px; } .nav-menu section { - padding: 8px 0; + padding: 4px 0; /* width: 50%; */ } @keyframes phanpying { @@ -35,11 +46,15 @@ } .nav-menu section:last-child { background-image: linear-gradient( - to right, + var(--to-forward), var(--divider-color) 1px, transparent 1px ), - linear-gradient(to bottom left, var(--bg-blur-color), transparent), + linear-gradient( + to bottom var(--backward), + var(--bg-blur-color), + transparent + ), url(../assets/phanpy-bg.svg); background-repeat: no-repeat; /* background-size: auto, auto, 200%; */ @@ -49,8 +64,8 @@ position: sticky; top: 0; animation: phanpying 0.2s ease-in-out both; - border-top-right-radius: inherit; - border-bottom-right-radius: inherit; + border-start-end-radius: inherit; + border-end-end-radius: inherit; margin-bottom: 0; display: flex; flex-direction: column; @@ -88,3 +103,7 @@ .sparkle-icon { animation: sparkle-icon 0.3s ease-in-out infinite alternate; } + +.nav-submenu { + max-width: 14em; +} diff --git a/src/components/nav-menu.jsx b/src/components/nav-menu.jsx index aa6aa690..6e46072c 100644 --- a/src/components/nav-menu.jsx +++ b/src/components/nav-menu.jsx @@ -1,39 +1,35 @@ import './nav-menu.css'; -import { - ControlledMenu, - MenuDivider, - MenuItem, - SubMenu, -} from '@szhsin/react-menu'; +import { t, Trans } from '@lingui/macro'; +import { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu'; import { memo } from 'preact/compat'; -import { useEffect, useRef, useState } from 'preact/hooks'; +import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; import { useLongPress } from 'use-long-press'; import { useSnapshot } from 'valtio'; import { api } from '../utils/api'; +import { getLists } from '../utils/lists'; import safeBoundingBoxPadding from '../utils/safe-bounding-box-padding'; import states from '../utils/states'; import store from '../utils/store'; +import { getCurrentAccountID } from '../utils/store-utils'; +import supports from '../utils/supports'; import Avatar from './avatar'; import Icon from './icon'; import MenuLink from './menu-link'; +import SubMenu2 from './submenu2'; function NavMenu(props) { const snapStates = useSnapshot(states); const { masto, instance, authenticated } = api(); - const [currentAccount, setCurrentAccount] = useState(); - const [moreThanOneAccount, setMoreThanOneAccount] = useState(false); - - useEffect(() => { + const [currentAccount, moreThanOneAccount] = useMemo(() => { const accounts = store.local.getJSON('accounts') || []; - const acc = accounts.find( - (account) => account.info.id === store.session.get('currentAccount'), - ); - if (acc) setCurrentAccount(acc); - setMoreThanOneAccount(accounts.length > 1); + const acc = + accounts.find((account) => account.info.id === getCurrentAccountID()) || + accounts[0]; + return [acc, accounts.length > 1]; }, []); // Home = Following @@ -97,7 +93,7 @@ function NavMenu(props) { type="button" class={`button plain nav-menu-button ${ moreThanOneAccount ? 'with-avatar' : '' - } ${open ? 'active' : ''}`} + } ${menuState === 'open' ? 'active' : ''}`} style={{ position: 'relative' }} onClick={() => { buttonClickTS.current = Date.now(); @@ -118,7 +114,7 @@ function NavMenu(props) { squircle={currentAccount?.info?.bot} /> )} - <Icon icon="menu" size={moreThanOneAccount ? 's' : 'l'} /> + <Icon icon="menu" size={moreThanOneAccount ? 's' : 'l'} alt={t`Menu`} /> </button> <ControlledMenu menuClassName="nav-menu" @@ -154,7 +150,7 @@ function NavMenu(props) { <div class="top-menu"> <MenuItem onClick={() => { - const yes = confirm('Reload page now to update?'); + const yes = confirm(t`Reload page now to update?`); if (yes) { (async () => { try { @@ -165,33 +161,51 @@ function NavMenu(props) { }} > <Icon icon="sparkles" class="sparkle-icon" size="l" />{' '} - <span>New update available…</span> + <span> + <Trans>New update available…</Trans> + </span> </MenuItem> <MenuDivider /> </div> )} <section> <MenuLink to="/"> - <Icon icon="home" size="l" /> <span>Home</span> + <Icon icon="home" size="l" />{' '} + <span> + <Trans>Home</Trans> + </span> </MenuLink> {authenticated ? ( <> {showFollowing && ( <MenuLink to="/following"> - <Icon icon="following" size="l" /> <span>Following</span> + <Icon icon="following" size="l" />{' '} + <span> + <Trans id="following.title">Following</Trans> + </span> </MenuLink> )} <MenuLink to="/catchup"> <Icon icon="history2" size="l" /> - <span>Catch-up</span> - </MenuLink> - <MenuLink to="/mentions"> - <Icon icon="at" size="l" /> <span>Mentions</span> + <span> + <Trans>Catch-up</Trans> + </span> </MenuLink> + {supports('@mastodon/mentions') && ( + <MenuLink to="/mentions"> + <Icon icon="at" size="l" />{' '} + <span> + <Trans>Mentions</Trans> + </span> + </MenuLink> + )} <MenuLink to="/notifications"> - <Icon icon="notification" size="l" /> <span>Notifications</span> + <Icon icon="notification" size="l" />{' '} + <span> + <Trans>Notifications</Trans> + </span> {snapStates.notificationsShowNew && ( - <sup title="New" style={{ opacity: 0.5 }}> + <sup title={t`New`} style={{ opacity: 0.5 }}> {' '} • </sup> @@ -200,74 +214,105 @@ function NavMenu(props) { <MenuDivider /> {currentAccount?.info?.id && ( <MenuLink to={`/${instance}/a/${currentAccount.info.id}`}> - <Icon icon="user" size="l" /> <span>Profile</span> + <Icon icon="user" size="l" />{' '} + <span> + <Trans>Profile</Trans> + </span> </MenuLink> )} - <MenuLink to="/l"> - <Icon icon="list" size="l" /> <span>Lists</span> - </MenuLink> + <ListMenu menuState={menuState} /> <MenuLink to="/b"> - <Icon icon="bookmark" size="l" /> <span>Bookmarks</span> + <Icon icon="bookmark" size="l" />{' '} + <span> + <Trans>Bookmarks</Trans> + </span> </MenuLink> - <SubMenu + <SubMenu2 + menuClassName="nav-submenu" overflow="auto" gap={-8} label={ <> <Icon icon="more" size="l" /> - <span class="menu-grow">More…</span> + <span class="menu-grow"> + <Trans>More…</Trans> + </span> <Icon icon="chevron-right" /> </> } > <MenuLink to="/f"> - <Icon icon="heart" size="l" /> <span>Likes</span> + <Icon icon="heart" size="l" />{' '} + <span> + <Trans>Likes</Trans> + </span> </MenuLink> - <MenuLink to="/ft"> + <MenuLink to="/fh"> <Icon icon="hashtag" size="l" />{' '} - <span>Followed Hashtags</span> + <span> + <Trans>Followed Hashtags</Trans> + </span> </MenuLink> <MenuDivider /> + {supports('@mastodon/filters') && ( + <MenuLink to="/ft"> + <Icon icon="filters" size="l" />{' '} + <span> + <Trans>Filters</Trans> + </span> + </MenuLink> + )} <MenuItem onClick={() => { states.showGenericAccounts = { id: 'mute', - heading: 'Muted users', + heading: t`Muted users`, fetchAccounts: fetchMutes, excludeRelationshipAttrs: ['muting'], }; }} > - <Icon icon="mute" size="l" /> Muted users… + <Icon icon="mute" size="l" />{' '} + <span> + <Trans>Muted users…</Trans> + </span> </MenuItem> <MenuItem onClick={() => { states.showGenericAccounts = { id: 'block', - heading: 'Blocked users', + heading: t`Blocked users`, fetchAccounts: fetchBlocks, excludeRelationshipAttrs: ['blocking'], }; }} > - <Icon icon="block" size="l" /> - Blocked users… + <Icon icon="block" size="l" />{' '} + <span> + <Trans>Blocked users…</Trans> + </span> </MenuItem>{' '} - </SubMenu> + </SubMenu2> <MenuDivider /> <MenuItem onClick={() => { states.showAccounts = true; }} > - <Icon icon="group" size="l" /> <span>Accounts…</span> + <Icon icon="group" size="l" />{' '} + <span> + <Trans>Accounts…</Trans> + </span> </MenuItem> </> ) : ( <> <MenuDivider /> <MenuLink to="/login"> - <Icon icon="user" size="l" /> <span>Log in</span> + <Icon icon="user" size="l" />{' '} + <span> + <Trans>Log in</Trans> + </span> </MenuLink> </> )} @@ -275,16 +320,28 @@ function NavMenu(props) { <section> <MenuDivider /> <MenuLink to={`/search`}> - <Icon icon="search" size="l" /> <span>Search</span> + <Icon icon="search" size="l" />{' '} + <span> + <Trans>Search</Trans> + </span> </MenuLink> <MenuLink to={`/${instance}/trending`}> - <Icon icon="chart" size="l" /> <span>Trending</span> + <Icon icon="chart" size="l" />{' '} + <span> + <Trans>Trending</Trans> + </span> </MenuLink> <MenuLink to={`/${instance}/p/l`}> - <Icon icon="building" size="l" /> <span>Local</span> + <Icon icon="building" size="l" />{' '} + <span> + <Trans>Local</Trans> + </span> </MenuLink> <MenuLink to={`/${instance}/p`}> - <Icon icon="earth" size="l" /> <span>Federated</span> + <Icon icon="earth" size="l" />{' '} + <span> + <Trans>Federated</Trans> + </span> </MenuLink> {authenticated ? ( <> @@ -295,7 +352,9 @@ function NavMenu(props) { }} > <Icon icon="keyboard" size="l" />{' '} - <span>Keyboard shortcuts</span> + <span> + <Trans>Keyboard shortcuts</Trans> + </span> </MenuItem> <MenuItem onClick={() => { @@ -303,14 +362,19 @@ function NavMenu(props) { }} > <Icon icon="shortcut" size="l" />{' '} - <span>Shortcuts / Columns…</span> + <span> + <Trans>Shortcuts / Columns…</Trans> + </span> </MenuItem> <MenuItem onClick={() => { states.showSettings = true; }} > - <Icon icon="gear" size="l" /> <span>Settings…</span> + <Icon icon="gear" size="l" />{' '} + <span> + <Trans>Settings…</Trans> + </span> </MenuItem> </> ) : ( @@ -321,7 +385,10 @@ function NavMenu(props) { states.showSettings = true; }} > - <Icon icon="gear" size="l" /> <span>Settings…</span> + <Icon icon="gear" size="l" />{' '} + <span> + <Trans>Settings…</Trans> + </span> </MenuItem> </> )} @@ -331,4 +398,57 @@ function NavMenu(props) { ); } +function ListMenu({ menuState }) { + const supportsLists = supports('@mastodon/lists'); + const [lists, setLists] = useState([]); + useEffect(() => { + if (!supportsLists) return; + if (menuState === 'open') { + getLists().then(setLists); + } + }, [menuState, supportsLists]); + + return lists.length > 0 ? ( + <SubMenu2 + menuClassName="nav-submenu" + overflow="auto" + gap={-8} + label={ + <> + <Icon icon="list" size="l" /> + <span class="menu-grow"> + <Trans>Lists</Trans> + </span> + <Icon icon="chevron-right" /> + </> + } + > + <MenuLink to="/l"> + <span> + <Trans>All Lists</Trans> + </span> + </MenuLink> + {lists?.length > 0 && ( + <> + <MenuDivider /> + {lists.map((list) => ( + <MenuLink key={list.id} to={`/l/${list.id}`}> + <span>{list.title}</span> + </MenuLink> + ))} + </> + )} + </SubMenu2> + ) : ( + supportsLists && ( + <MenuLink to="/l"> + <Icon icon="list" size="l" /> + <span> + <Trans>Lists</Trans> + </span> + </MenuLink> + ) + ); +} + export default memo(NavMenu); diff --git a/src/components/notification-service.jsx b/src/components/notification-service.jsx index e52ea3cb..a46574d5 100644 --- a/src/components/notification-service.jsx +++ b/src/components/notification-service.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { memo } from 'preact/compat'; import { useLayoutEffect, useState } from 'preact/hooks'; import { useSnapshot } from 'valtio'; @@ -152,14 +153,18 @@ export default memo(function NotificationService() { > <div class="sheet" tabIndex="-1"> <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> <header> - <b>Notification</b> + <b> + <Trans>Notification</Trans> + </b> </header> <main> {!sameInstance && ( - <p>This notification is from your other account.</p> + <p> + <Trans>This notification is from your other account.</Trans> + </p> )} <div class="notification-peek" @@ -186,7 +191,10 @@ export default memo(function NotificationService() { }} > <Link to="/notifications" class="button light" onClick={onClose}> - <span>View all notifications</span> <Icon icon="arrow-right" /> + <span> + <Trans>View all notifications</Trans> + </span>{' '} + <Icon icon="arrow-right" /> </Link> </div> </main> diff --git a/src/components/notification.jsx b/src/components/notification.jsx index aeeb1065..25760d28 100644 --- a/src/components/notification.jsx +++ b/src/components/notification.jsx @@ -1,17 +1,21 @@ +import { msg, Plural, Select, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { Fragment } from 'preact'; import { memo } from 'preact/compat'; +import { api } from '../utils/api'; +import { isFiltered } from '../utils/filters'; import shortenNumber from '../utils/shorten-number'; -import states from '../utils/states'; -import store from '../utils/store'; +import states, { statusKey } from '../utils/states'; +import { getCurrentAccountID } from '../utils/store-utils'; import useTruncated from '../utils/useTruncated'; import Avatar from './avatar'; +import CustomEmoji from './custom-emoji'; import FollowRequestButtons from './follow-request-buttons'; import Icon from './icon'; import Link from './link'; import NameText from './name-text'; -import RelativeTime from './relative-time'; import Status from './status'; const NOTIFICATION_ICONS = { @@ -25,6 +29,10 @@ const NOTIFICATION_ICONS = { update: 'pencil', 'admin.signup': 'account-edit', 'admin.report': 'account-warning', + severed_relationships: 'heart-break', + moderation_warning: 'alert', + emoji_reaction: 'emoji2', + 'pleroma:emoji_reaction': 'emoji2', }; /* @@ -40,32 +48,255 @@ poll = A poll you have voted in or created has ended update = A status you interacted with has been edited admin.sign_up = Someone signed up (optionally sent to admins) admin.report = A new report has been filed +severed_relationships = Severed relationships +moderation_warning = Moderation warning */ +function emojiText({ account, emoji, emoji_url }) { + let url; + let staticUrl; + if (typeof emoji_url === 'string') { + url = emoji_url; + } else { + url = emoji_url?.url; + staticUrl = emoji_url?.staticUrl; + } + const emojiObject = url ? ( + <CustomEmoji url={url} staticUrl={staticUrl} alt={emoji} /> + ) : ( + emoji + ); + return ( + <Trans> + {account} reacted to your post with {emojiObject} + </Trans> + ); +} + const contentText = { - mention: 'mentioned you in their post.', - status: 'published a post.', - reblog: 'boosted your post.', - 'reblog+account': (count) => `boosted ${count} of your posts.`, - reblog_reply: 'boosted your reply.', - follow: 'followed you.', - follow_request: 'requested to follow you.', - favourite: 'liked your post.', - 'favourite+account': (count) => `liked ${count} of your posts.`, - favourite_reply: 'liked your reply.', - poll: 'A poll you have voted in or created has ended.', - 'poll-self': 'A poll you have created has ended.', - 'poll-voted': 'A poll you have voted in has ended.', - update: 'A post you interacted with has been edited.', - 'favourite+reblog': 'boosted & liked your post.', - 'favourite+reblog+account': (count) => - `boosted & liked ${count} of your posts.`, - 'favourite+reblog_reply': 'boosted & liked your reply.', - 'admin.sign_up': 'signed up.', - 'admin.report': (targetAccount) => <>reported {targetAccount}</>, + status: ({ account }) => <Trans>{account} published a post.</Trans>, + reblog: ({ + count, + account, + postsCount, + postType, + components: { Subject }, + }) => ( + <Plural + value={count} + _1={ + <Plural + value={postsCount} + _1={ + <Select + value={postType} + _reply={<Trans>{account} boosted your reply.</Trans>} + other={<Trans>{account} boosted your post.</Trans>} + /> + } + other={ + <Trans> + {account} boosted {postsCount} of your posts. + </Trans> + } + /> + } + other={ + <Select + value={postType} + _reply={ + <Trans> + <Subject clickable={count > 1}> + <span title={count}>{shortenNumber(count)}</span> people + </Subject>{' '} + boosted your reply. + </Trans> + } + other={ + <Trans> + <Subject clickable={count > 1}> + <span title={count}>{shortenNumber(count)}</span> people + </Subject>{' '} + boosted your post. + </Trans> + } + /> + } + /> + ), + follow: ({ account, count, components: { Subject } }) => ( + <Plural + value={count} + _1={<Trans>{account} followed you.</Trans>} + other={ + <Trans> + <Subject clickable={count > 1}> + <span title={count}>{shortenNumber(count)}</span> people + </Subject>{' '} + followed you. + </Trans> + } + /> + ), + follow_request: ({ account }) => ( + <Trans>{account} requested to follow you.</Trans> + ), + favourite: ({ + account, + count, + postsCount, + postType, + components: { Subject }, + }) => ( + <Plural + value={count} + _1={ + <Plural + value={postsCount} + _1={ + <Select + value={postType} + _reply={<Trans>{account} liked your reply.</Trans>} + other={<Trans>{account} liked your post.</Trans>} + /> + } + other={ + <Trans> + {account} liked {postsCount} of your posts. + </Trans> + } + /> + } + other={ + <Select + value={postType} + _reply={ + <Trans> + <Subject clickable={count > 1}> + <span title={count}>{shortenNumber(count)}</span> people + </Subject>{' '} + liked your reply. + </Trans> + } + other={ + <Trans> + <Subject clickable={count > 1}> + <span title={count}>{shortenNumber(count)}</span> people + </Subject>{' '} + liked your post. + </Trans> + } + /> + } + /> + ), + poll: () => t`A poll you have voted in or created has ended.`, + 'poll-self': () => t`A poll you have created has ended.`, + 'poll-voted': () => t`A poll you have voted in has ended.`, + update: () => t`A post you interacted with has been edited.`, + 'favourite+reblog': ({ + count, + account, + postsCount, + postType, + components: { Subject }, + }) => ( + <Plural + value={count} + _1={ + <Plural + value={postsCount} + _1={ + <Select + value={postType} + _reply={<Trans>{account} boosted & liked your reply.</Trans>} + other={<Trans>{account} boosted & liked your post.</Trans>} + /> + } + other={ + <Trans> + {account} boosted & liked {postsCount} of your posts. + </Trans> + } + /> + } + other={ + <Select + value={postType} + _reply={ + <Trans> + <Subject clickable={count > 1}> + <span title={count}>{shortenNumber(count)}</span> people + </Subject>{' '} + boosted & liked your reply. + </Trans> + } + other={ + <Trans> + <Subject clickable={count > 1}> + <span title={count}>{shortenNumber(count)}</span> people + </Subject>{' '} + boosted & liked your post. + </Trans> + } + /> + } + /> + ), + 'admin.sign_up': ({ account }) => <Trans>{account} signed up.</Trans>, + 'admin.report': ({ account, targetAccount }) => ( + <Trans> + {account} reported {targetAccount} + </Trans> + ), + severed_relationships: ({ name }) => ( + <Trans> + Lost connections with <i>{name}</i>. + </Trans> + ), + moderation_warning: () => ( + <b> + <Trans>Moderation warning</Trans> + </b> + ), + emoji_reaction: emojiText, + 'pleroma:emoji_reaction': emojiText, + annual_report: ({ year }) => <Trans>Your {year} #Wrapstodon is here!</Trans>, }; -const AVATARS_LIMIT = 50; +// account_suspension, domain_block, user_domain_block +const SEVERED_RELATIONSHIPS_TEXT = { + account_suspension: ({ from, targetName }) => ( + <Trans> + An admin from <i>{from}</i> has suspended <i>{targetName}</i>, which means + you can no longer receive updates from them or interact with them. + </Trans> + ), + domain_block: ({ from, targetName, followersCount, followingCount }) => ( + <Trans> + An admin from <i>{from}</i> has blocked <i>{targetName}</i>. Affected + followers: {followersCount}, followings: {followingCount}. + </Trans> + ), + user_domain_block: ({ targetName, followersCount, followingCount }) => ( + <Trans> + You have blocked <i>{targetName}</i>. Removed followers: {followersCount}, + followings: {followingCount}. + </Trans> + ), +}; + +const MODERATION_WARNING_TEXT = { + none: msg`Your account has received a moderation warning.`, + disable: msg`Your account has been disabled.`, + mark_statuses_as_sensitive: msg`Some of your posts have been marked as sensitive.`, + delete_statuses: msg`Some of your posts have been deleted.`, + sensitive: msg`Your posts will be marked as sensitive from now on.`, + silence: msg`Your account has been limited.`, + suspend: msg`Your account has been suspended.`, +}; + +const AVATARS_LIMIT = 30; function Notification({ notification, @@ -73,14 +304,38 @@ function Notification({ isStatic, disableContextMenu, }) { - const { id, status, account, report, _accounts, _statuses } = notification; + const { _ } = useLingui(); + const { masto } = api(); + const { + id, + status, + account, + report, + event, + moderation_warning, + annualReport, + // Client-side grouped notification + _ids, + _accounts, + _statuses, + _groupKeys, + // Server-side grouped notification + sampleAccounts, + notificationsCount, + groupKey, + } = notification; let { type } = notification; + if (type === 'mention' && !status) { + // Could be deleted + return null; + } + // status = Attached when type of the notification is favourite, reblog, status, mention, poll, or update const actualStatus = status?.reblog || status; const actualStatusID = actualStatus?.id; - const currentAccount = store.session.get('currentAccount'); + const currentAccount = getCurrentAccountID(); const isSelf = currentAccount === account?.id; const isVoted = status?.poll?.voted; const isReplyToOthers = @@ -91,12 +346,14 @@ function Notification({ let favsCount = 0; let reblogsCount = 0; if (type === 'favourite+reblog') { - for (const account of _accounts) { - if (account._types?.includes('favourite')) { - favsCount++; - } - if (account._types?.includes('reblog')) { - reblogsCount++; + if (_accounts) { + for (const account of _accounts) { + if (account._types?.includes('favourite')) { + favsCount++; + } + if (account._types?.includes('reblog')) { + reblogsCount++; + } } } if (!reblogsCount && favsCount) type = 'favourite'; @@ -106,68 +363,116 @@ function Notification({ let text; if (type === 'poll') { text = contentText[isSelf ? 'poll-self' : isVoted ? 'poll-voted' : 'poll']; - } else if ( - type === 'reblog' || - type === 'favourite' || - type === 'favourite+reblog' - ) { - if (_statuses?.length > 1) { - text = contentText[`${type}+account`]; - } else if (isReplyToOthers) { - text = contentText[`${type}_reply`]; - } else { - text = contentText[type]; - } } else if (contentText[type]) { text = contentText[type]; } else { // Anticipate unhandled notification types, possibly from Mastodon forks or non-Mastodon instances // This surfaces the error to the user, hoping that users will report it - text = `[Unknown notification type: ${type}]`; + text = t`[Unknown notification type: ${type}]`; } + const Subject = ({ clickable, ...props }) => + clickable ? ( + <b tabIndex="0" onClick={handleOpenGenericAccounts} {...props} /> + ) : ( + <b {...props} /> + ); + if (typeof text === 'function') { - const count = _statuses?.length || _accounts?.length; - if (count) { - text = text(count); - } else if (type === 'admin.report') { + const count = + _accounts?.length || sampleAccounts?.length || (account ? 1 : 0); + const postsCount = _statuses?.length || (status ? 1 : 0); + if (type === 'admin.report') { const targetAccount = report?.targetAccount; if (targetAccount) { - text = text(<NameText account={targetAccount} showAvatar />); + text = text({ + account: <NameText account={account} showAvatar />, + targetAccount: <NameText account={targetAccount} showAvatar />, + }); } + } else if (type === 'severed_relationships') { + const targetName = event?.targetName; + if (targetName) { + text = text({ name: targetName }); + } + } else if ( + (type === 'emoji_reaction' || type === 'pleroma:emoji_reaction') && + notification.emoji + ) { + const emojiURL = + notification.emoji_url || // This is string + status?.emojis?.find?.( + (emoji) => + emoji?.shortcode === + notification.emoji.replace(/^:/, '').replace(/:$/, ''), + ); // Emoji object instead of string + text = text({ + account: <NameText account={account} showAvatar />, + emoji: notification.emoji, + emojiURL, + }); + } else if (type === 'annual_report') { + text = text({ + ...notification.annualReport, + }); + } else { + text = text({ + account: account ? ( + <NameText account={account} showAvatar /> + ) : ( + sampleAccounts?.[0] && ( + <NameText account={sampleAccounts[0]} showAvatar /> + ) + ), + count, + postsCount, + postType: isReplyToOthers ? 'reply' : 'post', + components: { Subject }, + }); } } - if (type === 'mention' && !status) { - // Could be deleted - return null; - } - const formattedCreatedAt = notification.createdAt && new Date(notification.createdAt).toLocaleString(); const genericAccountsHeading = { - 'favourite+reblog': 'Boosted/Liked by…', - favourite: 'Liked by…', - reblog: 'Boosted by…', - follow: 'Followed by…', - }[type] || 'Accounts'; + 'favourite+reblog': t`Boosted/Liked by…`, + favourite: t`Liked by…`, + reblog: t`Boosted by…`, + follow: t`Followed by…`, + }[type] || t`Accounts`; const handleOpenGenericAccounts = () => { states.showGenericAccounts = { heading: genericAccountsHeading, accounts: _accounts, showReactions: type === 'favourite+reblog', excludeRelationshipAttrs: type === 'follow' ? ['followedBy'] : [], + postID: statusKey(actualStatusID, instance), }; }; console.debug('RENDER Notification', notification.id); + const diffCount = + notificationsCount > 0 && notificationsCount > sampleAccounts?.length; + const expandAccounts = diffCount ? 'remote' : 'local'; + + // If there's a status and filter action is 'hide', then the notification is hidden + // TODO: Handle 'warn' action one day + if (!!status?.filtered) { + const isOwnPost = status?.account?.id === currentAccount; + const filterInfo = isFiltered(status.filtered, 'notifications'); + if (!isSelf && !isOwnPost && filterInfo?.action === 'hide') { + return null; + } + } + return ( <div class={`notification notification-${type}`} - data-notification-id={id} + data-notification-id={_ids || id} + data-group-key={_groupKeys?.join(' ') || groupKey} tabIndex="0" > <div @@ -190,40 +495,51 @@ function Notification({ <div class="notification-content"> {type !== 'mention' && ( <> - <p> - {!/poll|update/i.test(type) && ( - <> - {_accounts?.length > 1 ? ( - <> - <b tabIndex="0" onClick={handleOpenGenericAccounts}> - <span title={_accounts.length}> - {shortenNumber(_accounts.length)} - </span>{' '} - people - </b>{' '} - </> - ) : ( - <> - <NameText account={account} showAvatar />{' '} - </> - )} - </> - )} - {text} - {type === 'mention' && ( - <span class="insignificant"> - {' '} - •{' '} - <RelativeTime - datetime={notification.createdAt} - format="micro" - /> - </span> - )} - </p> + <p>{text}</p> {type === 'follow_request' && ( <FollowRequestButtons accountID={account.id} /> )} + {type === 'severed_relationships' && ( + <div> + {SEVERED_RELATIONSHIPS_TEXT[event.type]({ + from: instance, + ...event, + })} + <br /> + <a + href={`https://${instance}/severed_relationships`} + target="_blank" + rel="noopener noreferrer" + > + <Trans> + Learn more <Icon icon="external" size="s" /> + </Trans> + </a> + . + </div> + )} + {type === 'moderation_warning' && !!moderation_warning && ( + <div> + {_(MODERATION_WARNING_TEXT[moderation_warning.action]())} + <br /> + <a + href={`/disputes/strikes/${moderation_warning.id}`} + target="_blank" + rel="noopener noreferrer" + > + <Trans> + Learn more <Icon icon="external" size="s" /> + </Trans> + </a> + </div> + )} + {type === 'annual_report' && ( + <div> + <Link to={`/annual_report/${annualReport?.year}`}> + <Trans>View #Wrapstodon</Trans> + </Link> + </div> + )} </> )} {_accounts?.length > 1 && ( @@ -246,12 +562,8 @@ function Notification({ _accounts.length <= 10 ? 'xxl' : _accounts.length < 20 - ? 'xl' - : _accounts.length < 30 - ? 'l' - : _accounts.length < 40 - ? 'm' - : 's' // My god, this person is popular! + ? 'xl' + : 'l' } key={account.id} alt={`${account.displayName} @${account.acct}`} @@ -271,15 +583,115 @@ function Notification({ </a>{' '} </Fragment> ))} - <button - type="button" - class="small plain" - onClick={handleOpenGenericAccounts} - > - {_accounts.length > AVATARS_LIMIT && - `+${_accounts.length - AVATARS_LIMIT}`} - <Icon icon="chevron-down" /> - </button> + {type === 'favourite+reblog' && expandAccounts === 'remote' ? ( + <button + type="button" + class="small plain" + data-group-keys={_groupKeys?.join(' ')} + onClick={() => { + states.showGenericAccounts = { + heading: genericAccountsHeading, + fetchAccounts: async () => { + const keyAccounts = await Promise.allSettled( + _groupKeys.map(async (gKey) => { + const iterator = masto.v2.notifications + .$select(gKey) + .accounts.list(); + return [gKey, (await iterator.next()).value]; + }), + ); + const accounts = []; + for (const keyAccount of keyAccounts) { + const [key, _accounts] = keyAccount.value; + const type = /^favourite/.test(key) + ? 'favourite' + : /^reblog/.test(key) + ? 'reblog' + : null; + if (!type) continue; + for (const account of _accounts) { + const theAccount = accounts.find( + (a) => a.id === account.id, + ); + if (theAccount) { + theAccount._types.push(type); + } else { + account._types = [type]; + accounts.push(account); + } + } + } + return { + done: true, + value: accounts, + }; + }, + showReactions: true, + postID: statusKey(actualStatusID, instance), + }; + }} + > + <Icon icon="chevron-down" /> + </button> + ) : ( + <button + type="button" + class="small plain" + onClick={handleOpenGenericAccounts} + > + {_accounts.length > AVATARS_LIMIT && + `+${_accounts.length - AVATARS_LIMIT}`} + <Icon icon="chevron-down" /> + </button> + )} + </p> + )} + {!_accounts?.length && sampleAccounts?.length > 1 && ( + <p class="avatars-stack"> + {sampleAccounts.map((account) => ( + <Fragment key={account.id}> + <a + key={account.id} + href={account.url} + rel="noopener noreferrer" + class="account-avatar-stack" + onClick={(e) => { + e.preventDefault(); + states.showAccount = account; + }} + > + <Avatar + url={account.avatarStatic} + size="xxl" + key={account.id} + alt={`${account.displayName} @${account.acct}`} + squircle={account?.bot} + /> + {/* {type === 'favourite+reblog' && ( + <div class="account-sub-icons"> + {account._types.map((type) => ( + <Icon + icon={NOTIFICATION_ICONS[type]} + size="s" + class={`${type}-icon`} + /> + ))} + </div> + )} */} + </a>{' '} + </Fragment> + ))} + {notificationsCount > sampleAccounts.length && ( + <Link + to={ + instance ? `/${instance}/s/${status.id}` : `/s/${status.id}` + } + class="button small plain centered" + > + +{notificationsCount - sampleAccounts.length} + <Icon icon="chevron-right" /> + </Link> + )} </p> )} {_statuses?.length > 1 && ( @@ -354,7 +766,7 @@ function Notification({ function TruncatedLink(props) { const ref = useTruncated(); - return <Link {...props} data-read-more="Read more →" ref={ref} />; + return <Link {...props} data-read-more={t`Read more →`} ref={ref} />; } export default memo(Notification, (oldProps, newProps) => { diff --git a/src/components/poll.jsx b/src/components/poll.jsx index 1095a5dc..92b57a1d 100644 --- a/src/components/poll.jsx +++ b/src/components/poll.jsx @@ -1,3 +1,4 @@ +import { Plural, plural, t, Trans } from '@lingui/macro'; import { useState } from 'preact/hooks'; import shortenNumber from '../utils/shorten-number'; @@ -48,7 +49,7 @@ export default function Poll({ // }; // }, [expired, expiresAtDate]); - const pollVotesCount = votersCount || votesCount; + const pollVotesCount = multiple ? votersCount : votesCount; let roundPrecision = 0; if (pollVotesCount <= 1000) { @@ -75,11 +76,15 @@ export default function Poll({ <div class="poll-options"> {options.map((option, i) => { const { title, votesCount: optionVotesCount } = option; - const percentage = pollVotesCount - ? ((optionVotesCount / pollVotesCount) * 100).toFixed( - roundPrecision, - ) - : 0; // check if current poll choice is the leading one + const ratio = pollVotesCount + ? optionVotesCount / pollVotesCount + : 0; + const percentage = ratio + ? ratio.toLocaleString(i18n.locale || undefined, { + style: 'percent', + maximumFractionDigits: roundPrecision, + }) + : '0%'; const isLeading = optionVotesCount > 0 && @@ -92,7 +97,7 @@ export default function Poll({ isLeading ? 'poll-option-leading' : '' }`} style={{ - '--percentage': `${percentage}%`, + '--percentage': `${ratio * 100}%`, }} > <div class="poll-option-title"> @@ -102,17 +107,18 @@ export default function Poll({ {voted && ownVotes.includes(i) && ( <> {' '} - <Icon icon="check-circle" /> + <Icon icon="check-circle" alt={t`Voted`} /> </> )} </div> <div class="poll-option-votes" - title={`${optionVotesCount} vote${ - optionVotesCount === 1 ? '' : 's' - }`} + title={plural(optionVotesCount, { + one: `# vote`, + other: `# votes`, + })} > - {percentage}% + {percentage} </div> </div> ); @@ -127,7 +133,7 @@ export default function Poll({ setShowResults(false); }} > - <Icon icon="arrow-left" size="s" /> Hide results + <Icon icon="arrow-left" size="s" /> <Trans>Hide results</Trans> </button> )} </> @@ -176,7 +182,7 @@ export default function Poll({ type="submit" disabled={uiState === 'loading'} > - Vote + <Trans>Vote</Trans> </button> )} </form> @@ -187,9 +193,6 @@ export default function Poll({ type="button" class="plain small" disabled={uiState === 'loading'} - style={{ - marginLeft: -8, - }} onClick={(e) => { e.preventDefault(); setUIState('loading'); @@ -199,9 +202,9 @@ export default function Poll({ setUIState('default'); })(); }} - title="Refresh" + title={t`Refresh`} > - <Icon icon="refresh" alt="Refresh" /> + <Icon icon="refresh" alt={t`Refresh`} /> </button> )} {!voted && !expired && !readOnly && optionsHaveVoteCounts && ( @@ -213,30 +216,66 @@ export default function Poll({ e.preventDefault(); setShowResults(!showResults); }} - title={showResults ? 'Hide results' : 'Show results'} + title={showResults ? t`Hide results` : t`Show results`} > <Icon icon={showResults ? 'eye-open' : 'eye-close'} - alt={showResults ? 'Hide results' : 'Show results'} + alt={showResults ? t`Hide results` : t`Show results`} />{' '} </button> )} {!expired && !readOnly && ' '} - <span title={votesCount}>{shortenNumber(votesCount)}</span> vote - {votesCount === 1 ? '' : 's'} + <Plural + value={votesCount} + one={ + <Trans> + <span title={votesCount}>{shortenNumber(votesCount)}</span> vote + </Trans> + } + other={ + <Trans> + <span title={votesCount}>{shortenNumber(votesCount)}</span> votes + </Trans> + } + /> {!!votersCount && votersCount !== votesCount && ( <> {' '} - • <span title={votersCount}> - {shortenNumber(votersCount)} - </span>{' '} - voter - {votersCount === 1 ? '' : 's'} + •{' '} + <Plural + value={votersCount} + one={ + <Trans> + <span title={votersCount}>{shortenNumber(votersCount)}</span>{' '} + voter + </Trans> + } + other={ + <Trans> + <span title={votersCount}>{shortenNumber(votersCount)}</span>{' '} + voters + </Trans> + } + /> </> )}{' '} - • {expired ? 'Ended' : 'Ending'}{' '} - {!!expiresAtDate && <RelativeTime datetime={expiresAtDate} />} - </p>{' '} + •{' '} + {expired ? ( + !!expiresAtDate ? ( + <Trans> + Ended <RelativeTime datetime={expiresAtDate} /> + </Trans> + ) : ( + t`Ended` + ) + ) : !!expiresAtDate ? ( + <Trans> + Ending <RelativeTime datetime={expiresAtDate} /> + </Trans> + ) : ( + t`Ending` + )} + </p> </div> ); } diff --git a/src/components/relative-time.jsx b/src/components/relative-time.jsx index ce402cb4..8ab9f646 100644 --- a/src/components/relative-time.jsx +++ b/src/components/relative-time.jsx @@ -1,39 +1,135 @@ -// Twitter-style relative time component -// Seconds = 1s -// Minutes = 1m -// Hours = 1h -// Days = 1d -// After 7 days, use DD/MM/YYYY or MM/DD/YYYY -import dayjs from 'dayjs'; -import dayjsTwitter from 'dayjs-twitter'; -import localizedFormat from 'dayjs/plugin/localizedFormat'; -import relativeTime from 'dayjs/plugin/relativeTime'; -import { useMemo } from 'preact/hooks'; +import { i18n } from '@lingui/core'; +import { t, Trans } from '@lingui/macro'; +import { useEffect, useMemo, useReducer } from 'preact/hooks'; -dayjs.extend(dayjsTwitter); -dayjs.extend(localizedFormat); -dayjs.extend(relativeTime); +import localeMatch from '../utils/locale-match'; +import mem from '../utils/mem'; -const dtf = new Intl.DateTimeFormat(); +function isValidDate(value) { + if (value instanceof Date) { + return !isNaN(value.getTime()); + } else { + const date = new Date(value); + return !isNaN(date.getTime()); + } +} + +const resolvedLocale = mem( + () => new Intl.DateTimeFormat().resolvedOptions().locale, +); +const DTF = mem((locale, opts = {}) => { + const regionlessLocale = locale.replace(/-[a-z]+$/i, ''); + const lang = localeMatch([regionlessLocale], [resolvedLocale()], locale); + try { + return new Intl.DateTimeFormat(lang, opts); + } catch (e) {} + try { + return new Intl.DateTimeFormat(locale, opts); + } catch (e) {} + return new Intl.DateTimeFormat(undefined, opts); +}); +const RTF = mem((locale) => new Intl.RelativeTimeFormat(locale || undefined)); + +const minute = 60; +const hour = 60 * minute; +const day = 24 * hour; + +const rtfFromNow = (date) => { + // date = Date object + const rtf = RTF(i18n.locale); + const seconds = (date.getTime() - Date.now()) / 1000; + const absSeconds = Math.abs(seconds); + if (absSeconds < minute) { + return rtf.format(seconds, 'second'); + } else if (absSeconds < hour) { + return rtf.format(Math.floor(seconds / minute), 'minute'); + } else if (absSeconds < day) { + return rtf.format(Math.floor(seconds / hour), 'hour'); + } else { + return rtf.format(Math.floor(seconds / day), 'day'); + } +}; + +const twitterFromNow = (date) => { + // date = Date object + const seconds = (Date.now() - date.getTime()) / 1000; + if (seconds < minute) { + return t({ + comment: 'Relative time in seconds, as short as possible', + message: `${seconds < 1 ? 1 : Math.floor(seconds)}s`, + }); + } else if (seconds < hour) { + return t({ + comment: 'Relative time in minutes, as short as possible', + message: `${Math.floor(seconds / minute)}m`, + }); + } else { + return t({ + comment: 'Relative time in hours, as short as possible', + message: `${Math.floor(seconds / hour)}h`, + }); + } +}; export default function RelativeTime({ datetime, format }) { if (!datetime) return null; - const date = useMemo(() => dayjs(datetime), [datetime]); - const dateStr = useMemo(() => { + const [renderCount, rerender] = useReducer((x) => x + 1, 0); + const date = useMemo(() => new Date(datetime), [datetime]); + const [dateStr, dt, title] = useMemo(() => { + if (!isValidDate(date)) return ['' + datetime, '', '']; + let str; if (format === 'micro') { // If date <= 1 day ago or day is within this year - const now = dayjs(); - const dayDiff = now.diff(date, 'day'); - if (dayDiff <= 1 || now.year() === date.year()) { - return date.twitter(); + const now = new Date(); + const dayDiff = (now.getTime() - date.getTime()) / 1000 / day; + if (dayDiff <= 1) { + str = twitterFromNow(date); } else { - return dtf.format(date.toDate()); + const sameYear = now.getFullYear() === date.getFullYear(); + if (sameYear) { + str = DTF(i18n.locale, { + year: undefined, + month: 'short', + day: 'numeric', + }).format(date); + } else { + str = DTF(i18n.locale, { + dateStyle: 'short', + }).format(date); + } } } - return date.fromNow(); - }, [date, format]); - const dt = useMemo(() => date.toISOString(), [date]); - const title = useMemo(() => date.format('LLLL'), [date]); + if (!str) str = rtfFromNow(date); + return [str, date.toISOString(), date.toLocaleString()]; + }, [date, format, renderCount]); + + useEffect(() => { + if (!isValidDate(date)) return; + let timeout; + let raf; + function rafRerender() { + raf = requestAnimationFrame(() => { + rerender(); + scheduleRerender(); + }); + } + function scheduleRerender() { + // If less than 1 minute, rerender every 10s + // If less than 1 hour rerender every 1m + // Else, don't need to rerender + const seconds = (Date.now() - date.getTime()) / 1000; + if (seconds < minute) { + timeout = setTimeout(rafRerender, 10_000); + } else if (seconds < hour) { + timeout = setTimeout(rafRerender, 60_000); + } + } + scheduleRerender(); + return () => { + clearTimeout(timeout); + cancelAnimationFrame(raf); + }; + }, []); return ( <time datetime={dt} title={title}> diff --git a/src/components/report-modal.css b/src/components/report-modal.css index 8306de99..b99db159 100644 --- a/src/components/report-modal.css +++ b/src/components/report-modal.css @@ -26,6 +26,8 @@ background-color: var(--bg-blur-color); backdrop-filter: blur(16px); padding: 16px; + padding: calc(var(--sai-top, 0) + 16px) calc(var(--sai-right, 0) + 16px) + 16px calc(var(--sai-left, 0) + 16px); display: flex; gap: 8px; justify-content: space-between; @@ -41,6 +43,8 @@ main { padding: 0 16px 16px; + padding: 0 calc(var(--sai-right, 0) + 16px) + calc(var(--sai-bottom, 0) + 16px) calc(var(--sai-left, 0) + 16px); /* display: flex; flex-direction: column; gap: 16px; */ @@ -88,7 +92,7 @@ pointer-events: none; user-select: none; position: absolute; - right: 32px; + inset-inline-end: 32px; margin-top: -48px; animation: rubber-stamp 0.3s ease-in both; position: absolute; @@ -144,7 +148,7 @@ } .report-rules { - margin-left: 1.75em; + margin-inline-start: 1.75em; } } diff --git a/src/components/report-modal.jsx b/src/components/report-modal.jsx index 90b1b2d2..ee1c889a 100644 --- a/src/components/report-modal.jsx +++ b/src/components/report-modal.jsx @@ -1,5 +1,7 @@ import './report-modal.css'; +import { msg, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { Fragment } from 'preact'; import { useMemo, useRef, useState } from 'preact/hooks'; @@ -24,26 +26,27 @@ const CATEGORIES_INFO = { // description: 'Not something you want to see', // }, spam: { - label: 'Spam', - description: 'Malicious links, fake engagement, or repetitive replies', + label: msg`Spam`, + description: msg`Malicious links, fake engagement, or repetitive replies`, }, legal: { - label: 'Illegal', - description: "Violates the law of your or the server's country", + label: msg`Illegal`, + description: msg`Violates the law of your or the server's country`, }, violation: { - label: 'Server rule violation', - description: 'Breaks specific server rules', - stampLabel: 'Violation', + label: msg`Server rule violation`, + description: msg`Breaks specific server rules`, + stampLabel: msg`Violation`, }, other: { - label: 'Other', - description: "Issue doesn't fit other categories", + label: msg`Other`, + description: msg`Issue doesn't fit other categories`, excludeStamp: true, }, }; function ReportModal({ account, post, onClose }) { + const { _ } = useLingui(); const { masto } = api(); const [uiState, setUIState] = useState('default'); const [username, domain] = account.acct.split('@'); @@ -62,14 +65,14 @@ function ReportModal({ account, post, onClose }) { return ( <div class="report-modal-container"> <div class="top-controls"> - <h1>{post ? 'Report Post' : `Report @${username}`}</h1> + <h1>{post ? t`Report Post` : t`Report @${username}`}</h1> <button type="button" class="plain4 small" disabled={uiState === 'loading'} onClick={() => onClose()} > - <Icon icon="x" size="xl" /> + <Icon icon="x" size="xl" alt={t`Close`} /> </button> </div> <main> @@ -93,9 +96,13 @@ function ReportModal({ account, post, onClose }) { key={selectedCategory} aria-hidden="true" > - {CATEGORIES_INFO[selectedCategory].stampLabel || - CATEGORIES_INFO[selectedCategory].label} - <small>Pending review</small> + {_( + CATEGORIES_INFO[selectedCategory].stampLabel || + _(CATEGORIES_INFO[selectedCategory].label), + )} + <small> + <Trans>Pending review</Trans> + </small> </span> )} <form @@ -136,7 +143,7 @@ function ReportModal({ account, post, onClose }) { forward, }); setUIState('success'); - showToast(post ? 'Post reported' : 'Profile reported'); + showToast(post ? t`Post reported` : t`Profile reported`); onClose(); } catch (error) { console.error(error); @@ -144,8 +151,8 @@ function ReportModal({ account, post, onClose }) { showToast( error?.message || (post - ? 'Unable to report post' - : 'Unable to report profile'), + ? t`Unable to report post` + : t`Unable to report profile`), ); } })(); @@ -153,8 +160,8 @@ function ReportModal({ account, post, onClose }) { > <p> {post - ? `What's the issue with this post?` - : `What's the issue with this profile?`} + ? t`What's the issue with this post?` + : t`What's the issue with this profile?`} </p> <section class="report-categories"> {CATEGORIES.map((category) => @@ -173,9 +180,9 @@ function ReportModal({ account, post, onClose }) { }} /> <span> - {CATEGORIES_INFO[category].label}   + {_(CATEGORIES_INFO[category].label)}   <small class="ib insignificant"> - {CATEGORIES_INFO[category].description} + {_(CATEGORIES_INFO[category].description)} </small> </span> </label> @@ -222,7 +229,9 @@ function ReportModal({ account, post, onClose }) { </section> <section class="report-comment"> <p> - <label for="report-comment">Additional info</label> + <label for="report-comment"> + <Trans>Additional info</Trans> + </label> </p> <textarea maxlength="1000" @@ -230,6 +239,7 @@ function ReportModal({ account, post, onClose }) { name="comment" id="report-comment" disabled={uiState === 'loading'} + required={!post} // Required if not reporting a post /> </section> {!!domain && domain !== currentDomain && ( @@ -243,7 +253,9 @@ function ReportModal({ account, post, onClose }) { disabled={uiState === 'loading'} />{' '} <span> - Forward to <i>{domain}</i> + <Trans> + Forward to <i>{domain}</i> + </Trans> </span> </label> </p> @@ -251,7 +263,7 @@ function ReportModal({ account, post, onClose }) { )} <footer> <button type="submit" disabled={uiState === 'loading'}> - Send Report + <Trans>Send Report</Trans> </button>{' '} <button type="submit" @@ -260,15 +272,17 @@ function ReportModal({ account, post, onClose }) { onClick={async () => { try { await masto.v1.accounts.$select(account.id).mute(); // Infinite duration - showToast(`Muted ${username}`); + showToast(t`Muted ${username}`); } catch (e) { console.error(e); - showToast(`Unable to mute ${username}`); + showToast(t`Unable to mute ${username}`); } // onSubmit will still run }} > - Send Report <small class="ib">+ Mute profile</small> + <Trans> + Send Report <small class="ib">+ Mute profile</small> + </Trans> </button>{' '} <button type="submit" @@ -277,15 +291,17 @@ function ReportModal({ account, post, onClose }) { onClick={async () => { try { await masto.v1.accounts.$select(account.id).block(); - showToast(`Blocked ${username}`); + showToast(t`Blocked ${username}`); } catch (e) { console.error(e); - showToast(`Unable to block ${username}`); + showToast(t`Unable to block ${username}`); } // onSubmit will still run }} > - Send Report <small class="ib">+ Block profile</small> + <Trans> + Send Report <small class="ib">+ Block profile</small> + </Trans> </button> <Loader hidden={uiState !== 'loading'} /> </footer> diff --git a/src/components/search-form.jsx b/src/components/search-form.jsx index 2df8d0ae..6f231c61 100644 --- a/src/components/search-form.jsx +++ b/src/components/search-form.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { forwardRef } from 'preact/compat'; import { useImperativeHandle, useRef, useState } from 'preact/hooks'; import { useSearchParams } from 'react-router-dom'; @@ -68,7 +69,7 @@ const SearchForm = forwardRef((props, ref) => { name="q" type="search" // autofocus - placeholder="Search" + placeholder={t`Search`} dir="auto" autocomplete="off" autocorrect="off" @@ -198,12 +199,12 @@ const SearchForm = forwardRef((props, ref) => { [ { label: ( - <> + <Trans> {query}{' '} <small class="insignificant"> ‒ accounts, hashtags & posts </small> - </> + </Trans> ), to: `/search?q=${encodeURIComponent(query)}`, top: !type && !/\s/.test(query), @@ -211,9 +212,9 @@ const SearchForm = forwardRef((props, ref) => { }, { label: ( - <> + <Trans> Posts with <q>{query}</q> - </> + </Trans> ), to: `/search?q=${encodeURIComponent(query)}&type=statuses`, hidden: /^https?:/.test(query), @@ -223,9 +224,9 @@ const SearchForm = forwardRef((props, ref) => { }, { label: ( - <> + <Trans> Posts tagged with <mark>#{query.replace(/^#/, '')}</mark> - </> + </Trans> ), to: `/${instance}/t/${query.replace(/^#/, '')}`, hidden: @@ -237,9 +238,9 @@ const SearchForm = forwardRef((props, ref) => { }, { label: ( - <> + <Trans> Look up <mark>{query}</mark> - </> + </Trans> ), to: `/${query}`, hidden: !/^https?:/.test(query), @@ -248,9 +249,9 @@ const SearchForm = forwardRef((props, ref) => { }, { label: ( - <> + <Trans> Accounts with <q>{query}</q> - </> + </Trans> ), to: `/search?q=${encodeURIComponent(query)}&type=accounts`, icon: 'group', @@ -273,6 +274,7 @@ const SearchForm = forwardRef((props, ref) => { class={`search-popover-item ${i === 0 ? 'focus' : ''}`} // hidden={hidden} onClick={(e) => { + console.log('onClick', e); props?.onSubmit?.(e); }} > diff --git a/src/components/shortcuts-settings.css b/src/components/shortcuts-settings.css index 86cc6f70..11c30912 100644 --- a/src/components/shortcuts-settings.css +++ b/src/components/shortcuts-settings.css @@ -18,8 +18,8 @@ counter-increment: index; display: inline-block; width: 1.2em; - text-align: right; - margin-right: 8px; + text-align: end; + margin-inline-end: 8px; color: var(--text-insignificant-color); font-size: 90%; flex-shrink: 0; @@ -55,15 +55,19 @@ justify-content: center; } #shortcuts-settings-container .shortcuts-view-mode label:first-child { - border-top-left-radius: 16px; - border-bottom-left-radius: 16px; + border-start-start-radius: 16px; + border-end-start-radius: 16px; } #shortcuts-settings-container .shortcuts-view-mode label:last-child { - border-top-right-radius: 16px; - border-bottom-right-radius: 16px; + border-start-end-radius: 16px; + border-end-end-radius: 16px; } #shortcuts-settings-container .shortcuts-view-mode label img { max-height: 64px; + + &:dir(rtl) { + transform: scaleX(-1); + } } @media (prefers-color-scheme: dark) { #shortcuts-settings-container .shortcuts-view-mode label img { @@ -82,9 +86,7 @@ } #shortcuts-settings-container .shortcuts-view-mode label input ~ * { opacity: 0.5; - transform-origin: bottom; - transform: scale(0.975); - transition: all 0.2s ease-out; + transition: opacity 0.2s ease-out; } #shortcuts-settings-container .shortcuts-view-mode label.checked { box-shadow: inset 0 0 0 3px var(--link-color), @@ -95,7 +97,6 @@ label input:is(:hover, :active, :checked) ~ * { - transform: scale(1); opacity: 1; } @@ -114,7 +115,7 @@ } #shortcut-settings-form label > span:first-child { flex-basis: 5em; - text-align: right; + text-align: end; } #shortcut-settings-form :is(input[type='text'], select) { flex-grow: 1; @@ -185,8 +186,8 @@ counter-increment: index; display: inline-block; width: 1.2em; - text-align: right; - margin-right: 8px; + text-align: end; + margin-inline-end: 8px; color: var(--text-insignificant-color); font-size: 90%; flex-shrink: 0; diff --git a/src/components/shortcuts-settings.jsx b/src/components/shortcuts-settings.jsx index 94162dff..f92e2761 100644 --- a/src/components/shortcuts-settings.jsx +++ b/src/components/shortcuts-settings.jsx @@ -1,6 +1,8 @@ import './shortcuts-settings.css'; import { useAutoAnimate } from '@formkit/auto-animate/preact'; +import { msg, Plural, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { compressToEncodedURIComponent, decompressFromEncodedURIComponent, @@ -14,10 +16,12 @@ import tabMenuBarUrl from '../assets/tab-menu-bar.svg'; import { api } from '../utils/api'; import { fetchFollowedTags } from '../utils/followed-tags'; +import { getLists, getListTitle } from '../utils/lists'; import pmem from '../utils/pmem'; import showToast from '../utils/show-toast'; import states from '../utils/states'; import store from '../utils/store'; +import { getCurrentAccountID } from '../utils/store-utils'; import AsyncText from './AsyncText'; import Icon from './icon'; @@ -41,54 +45,55 @@ const TYPES = [ // 'account-statuses', // Need @acct search first ]; const TYPE_TEXT = { - following: 'Home / Following', - notifications: 'Notifications', - list: 'List', - public: 'Public (Local / Federated)', - search: 'Search', - 'account-statuses': 'Account', - bookmarks: 'Bookmarks', - favourites: 'Likes', - hashtag: 'Hashtag', - trending: 'Trending', - mentions: 'Mentions', + following: msg`Home / Following`, + notifications: msg`Notifications`, + list: msg`Lists`, + public: msg`Public (Local / Federated)`, + search: msg`Search`, + 'account-statuses': msg`Account`, + bookmarks: msg`Bookmarks`, + favourites: msg`Likes`, + hashtag: msg`Hashtag`, + trending: msg`Trending`, + mentions: msg`Mentions`, }; const TYPE_PARAMS = { list: [ { - text: 'List ID', + text: msg`List ID`, name: 'id', + notRequired: true, }, ], public: [ { - text: 'Local only', + text: msg`Local only`, name: 'local', type: 'checkbox', }, { - text: 'Instance', + text: msg`Instance`, name: 'instance', type: 'text', - placeholder: 'Optional, e.g. mastodon.social', + placeholder: msg`Optional, e.g. mastodon.social`, notRequired: true, }, ], trending: [ { - text: 'Instance', + text: msg`Instance`, name: 'instance', type: 'text', - placeholder: 'Optional, e.g. mastodon.social', + placeholder: msg`Optional, e.g. mastodon.social`, notRequired: true, }, ], search: [ { - text: 'Search term', + text: msg`Search term`, name: 'query', type: 'text', - placeholder: 'Optional, unless for multi-column mode', + placeholder: msg`Optional, unless for multi-column mode`, notRequired: true, }, ], @@ -105,27 +110,23 @@ const TYPE_PARAMS = { text: '#', name: 'hashtag', type: 'text', - placeholder: 'e.g. PixelArt (Max 5, space-separated)', + placeholder: msg`e.g. PixelArt (Max 5, space-separated)`, pattern: '[^#]+', }, { - text: 'Media only', + text: msg`Media only`, name: 'media', type: 'checkbox', }, { - text: 'Instance', + text: msg`Instance`, name: 'instance', type: 'text', - placeholder: 'Optional, e.g. mastodon.social', + placeholder: msg`Optional, e.g. mastodon.social`, notRequired: true, }, ], }; -const fetchListTitle = pmem(async ({ id }) => { - const list = await api().masto.v1.lists.$select(id).fetch(); - return list.title; -}); const fetchAccountTitle = pmem(async ({ id }) => { const account = await api().masto.v1.accounts.$select(id).fetch(); return account.username || account.acct || account.displayName; @@ -133,45 +134,49 @@ const fetchAccountTitle = pmem(async ({ id }) => { export const SHORTCUTS_META = { following: { id: 'home', - title: (_, index) => (index === 0 ? 'Home' : 'Following'), + title: (_, index) => + index === 0 + ? t`Home` + : t({ id: 'following.title', message: 'Following' }), path: '/', icon: 'home', }, mentions: { id: 'mentions', - title: 'Mentions', + title: msg`Mentions`, path: '/mentions', icon: 'at', }, notifications: { id: 'notifications', - title: 'Notifications', + title: msg`Notifications`, path: '/notifications', icon: 'notification', }, list: { - id: 'list', - title: fetchListTitle, - path: ({ id }) => `/l/${id}`, + id: ({ id }) => (id ? 'list' : 'lists'), + title: ({ id }) => (id ? getListTitle(id) : t`Lists`), + path: ({ id }) => (id ? `/l/${id}` : '/l'), icon: 'list', + excludeViewMode: ({ id }) => (!id ? ['multi-column'] : []), }, public: { id: 'public', - title: ({ local }) => (local ? 'Local' : 'Federated'), + title: ({ local }) => (local ? t`Local` : t`Federated`), subtitle: ({ instance }) => instance || api().instance, path: ({ local, instance }) => `/${instance}/p${local ? '/l' : ''}`, icon: ({ local }) => (local ? 'building' : 'earth'), }, trending: { id: 'trending', - title: 'Trending', + title: msg`Trending`, subtitle: ({ instance }) => instance || api().instance, path: ({ instance }) => `/${instance}/trending`, icon: 'chart', }, search: { id: 'search', - title: ({ query }) => (query ? `“${query}”` : 'Search'), + title: ({ query }) => (query ? `“${query}”` : t`Search`), path: ({ query }) => query ? `/search?q=${encodeURIComponent(query)}&type=statuses` @@ -187,13 +192,13 @@ export const SHORTCUTS_META = { }, bookmarks: { id: 'bookmarks', - title: 'Bookmarks', + title: msg`Bookmarks`, path: '/b', icon: 'bookmark', }, favourites: { id: 'favourites', - title: 'Likes', + title: msg`Likes`, path: '/f', icon: 'heart', }, @@ -210,6 +215,7 @@ export const SHORTCUTS_META = { }; function ShortcutsSettings({ onClose }) { + const { _ } = useLingui(); const snapStates = useSnapshot(states); const { shortcuts } = snapStates; const [showForm, setShowForm] = useState(false); @@ -221,12 +227,12 @@ function ShortcutsSettings({ onClose }) { <div id="shortcuts-settings-container" class="sheet" tabindex="-1"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> <h2> - <Icon icon="shortcut" /> Shortcuts{' '} + <Icon icon="shortcut" /> <Trans>Shortcuts</Trans>{' '} <sup style={{ fontSize: 12, @@ -234,27 +240,29 @@ function ShortcutsSettings({ onClose }) { textTransform: 'uppercase', }} > - beta + <Trans>beta</Trans> </sup> </h2> </header> <main> - <p>Specify a list of shortcuts that'll appear as:</p> + <p> + <Trans>Specify a list of shortcuts that'll appear as:</Trans> + </p> <div class="shortcuts-view-mode"> {[ { value: 'float-button', - label: 'Floating button', + label: t`Floating button`, imgURL: floatingButtonUrl, }, { value: 'tab-menu-bar', - label: 'Tab/Menu bar', + label: t`Tab/Menu bar`, imgURL: tabMenuBarUrl, }, { value: 'multi-column', - label: 'Multi-column', + label: t`Multi-column`, imgURL: multiColumnUrl, }, ].map(({ value, label, imgURL }) => { @@ -291,9 +299,13 @@ function ShortcutsSettings({ onClose }) { SHORTCUTS_META[type]; if (typeof title === 'function') { title = title(shortcut, i); + } else { + title = _(title); } if (typeof subtitle === 'function') { subtitle = subtitle(shortcut, i); + } else { + subtitle = _(subtitle); } if (typeof icon === 'function') { icon = icon(shortcut, i); @@ -317,7 +329,7 @@ function ShortcutsSettings({ onClose }) { )} {excludedViewMode && ( <span class="tag"> - Not available in current view mode + <Trans>Not available in current view mode</Trans> </span> )} </span> @@ -336,7 +348,7 @@ function ShortcutsSettings({ onClose }) { } }} > - <Icon icon="arrow-up" alt="Move up" /> + <Icon icon="arrow-up" alt={t`Move up`} /> </button> <button type="button" @@ -352,7 +364,7 @@ function ShortcutsSettings({ onClose }) { } }} > - <Icon icon="arrow-down" alt="Move down" /> + <Icon icon="arrow-down" alt={t`Move down`} /> </button> <button type="button" @@ -364,7 +376,7 @@ function ShortcutsSettings({ onClose }) { }); }} > - <Icon icon="pencil" alt="Edit" /> + <Icon icon="pencil" alt={t`Edit`} /> </button> {/* <button type="button" @@ -385,7 +397,9 @@ function ShortcutsSettings({ onClose }) { <div class="ui-state insignificant"> <Icon icon="info" />{' '} <small> - Add more than one shortcut/column to make this work. + <Trans> + Add more than one shortcut/column to make this work. + </Trans> </small> </div> )} @@ -394,38 +408,40 @@ function ShortcutsSettings({ onClose }) { <div class="ui-state insignificant"> <p> {snapStates.settings.shortcutsViewMode === 'multi-column' - ? 'No columns yet. Tap on the Add column button.' - : 'No shortcuts yet. Tap on the Add shortcut button.'} + ? t`No columns yet. Tap on the Add column button.` + : t`No shortcuts yet. Tap on the Add shortcut button.`} </p> <p> - Not sure what to add? - <br /> - Try adding{' '} - <a - href="#" - onClick={(e) => { - e.preventDefault(); - states.shortcuts = [ - { - type: 'following', - }, - { - type: 'notifications', - }, - ]; - }} - > - Home / Following and Notifications - </a>{' '} - first. + <Trans> + Not sure what to add? + <br /> + Try adding{' '} + <a + href="#" + onClick={(e) => { + e.preventDefault(); + states.shortcuts = [ + { + type: 'following', + }, + { + type: 'notifications', + }, + ]; + }} + > + Home / Following and Notifications + </a>{' '} + first. + </Trans> </p> </div> )} <p class="insignificant"> {shortcuts.length >= SHORTCUTS_LIMIT && (snapStates.settings.shortcutsViewMode === 'multi-column' - ? `Max ${SHORTCUTS_LIMIT} columns` - : `Max ${SHORTCUTS_LIMIT} shortcuts`)} + ? t`Max ${SHORTCUTS_LIMIT} columns` + : t`Max ${SHORTCUTS_LIMIT} shortcuts`)} </p> <p style={{ @@ -439,7 +455,7 @@ function ShortcutsSettings({ onClose }) { class="light" onClick={() => setShowImportExport(true)} > - Import/export + <Trans>Import/export</Trans> </button> <button type="button" @@ -449,8 +465,8 @@ function ShortcutsSettings({ onClose }) { <Icon icon="plus" />{' '} <span> {snapStates.settings.shortcutsViewMode === 'multi-column' - ? 'Add column…' - : 'Add shortcut…'} + ? t`Add column…` + : t`Add shortcut…`} </span> </button> </p> @@ -496,20 +512,10 @@ function ShortcutsSettings({ onClose }) { ); } -const FETCH_MAX_AGE = 1000 * 60; // 1 minute -const fetchLists = pmem( - () => { - const { masto } = api(); - return masto.v1.lists.list(); - }, - { - maxAge: FETCH_MAX_AGE, - }, -); - const FORM_NOTES = { - search: `For multi-column mode, search term is required, else the column will not be shown.`, - hashtag: 'Multiple hashtags are supported. Space-separated.', + list: msg`Specific list is optional. For multi-column mode, list is required, else the column will not be shown.`, + search: msg`For multi-column mode, search term is required, else the column will not be shown.`, + hashtag: msg`Multiple hashtags are supported. Space-separated.`, }; function ShortcutForm({ @@ -519,10 +525,10 @@ function ShortcutForm({ shortcutIndex, onClose, }) { + const { _ } = useLingui(); console.log('shortcut', shortcut); const editMode = !!shortcut; const [currentType, setCurrentType] = useState(shortcut?.type || null); - const { masto } = api(); const [uiState, setUIState] = useState('default'); const [lists, setLists] = useState([]); @@ -532,8 +538,7 @@ function ShortcutForm({ if (currentType !== 'list') return; try { setUIState('loading'); - const lists = await fetchLists(); - lists.sort((a, b) => a.title.localeCompare(b.title)); + const lists = await getLists(); setLists(lists); setUIState('default'); } catch (e) { @@ -575,11 +580,11 @@ function ShortcutForm({ <div id="shortcut-settings-form" class="sheet"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <h2>{editMode ? 'Edit' : 'Add'} shortcut</h2> + <h2>{editMode ? t`Edit shortcut` : t`Add shortcut`}</h2> </header> <main tabindex="-1"> <form @@ -614,7 +619,9 @@ function ShortcutForm({ > <p> <label> - <span>Timeline</span> + <span> + <Trans>Timeline</Trans> + </span> <select required disabled={disabled} @@ -623,10 +630,11 @@ function ShortcutForm({ }} defaultValue={editMode ? shortcut.type : undefined} name="type" + dir="auto" > <option></option> {TYPES.map((type) => ( - <option value={type}>{TYPE_TEXT[type]}</option> + <option value={type}>{_(TYPE_TEXT[type])}</option> ))} </select> </label> @@ -637,13 +645,17 @@ function ShortcutForm({ return ( <p> <label> - <span>List</span> + <span> + <Trans>List</Trans> + </span> <select name="id" required={!notRequired} disabled={disabled || uiState === 'loading'} defaultValue={editMode ? shortcut.id : undefined} + dir="auto" > + <option value=""></option> {lists.map((list) => ( <option value={list.id}>{list.title}</option> ))} @@ -656,12 +668,12 @@ function ShortcutForm({ return ( <p> <label> - <span>{text}</span>{' '} + <span>{_(text)}</span>{' '} <input type={type} switch={type === 'checkbox' || undefined} name={name} - placeholder={placeholder} + placeholder={_(placeholder)} required={type === 'text' && !notRequired} disabled={disabled} list={ @@ -673,6 +685,7 @@ function ShortcutForm({ autocapitalize="off" spellCheck={false} pattern={pattern} + dir="auto" /> {currentType === 'hashtag' && followedHashtags.length > 0 && ( @@ -690,7 +703,7 @@ function ShortcutForm({ {!!FORM_NOTES[currentType] && ( <p class="form-note insignificant"> <Icon icon="info" /> - {FORM_NOTES[currentType]} + {_(FORM_NOTES[currentType])} </p> )} <footer> @@ -699,7 +712,7 @@ function ShortcutForm({ class="block" disabled={disabled || uiState === 'loading'} > - {editMode ? 'Save' : 'Add'} + {editMode ? t`Save` : t`Add`} </button> {editMode && ( <button @@ -710,7 +723,7 @@ function ShortcutForm({ onClose?.(); }} > - Remove + <Trans>Remove</Trans> </button> )} </footer> @@ -721,6 +734,7 @@ function ShortcutForm({ } function ImportExport({ shortcuts, onClose }) { + const { _ } = useLingui(); const { masto } = api(); const shortcutsStr = useMemo(() => { if (!shortcuts) return ''; @@ -766,30 +780,35 @@ function ImportExport({ shortcuts, onClose }) { <div id="import-export-container" class="sheet"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> <h2> - Import/Export <small class="ib insignificant">Shortcuts</small> + <Trans> + Import/Export <small class="ib insignificant">Shortcuts</small> + </Trans> </h2> </header> <main tabindex="-1"> <section> <h3> <Icon icon="arrow-down-circle" size="l" class="insignificant" />{' '} - <span>Import</span> + <span> + <Trans>Import</Trans> + </span> </h3> <p class="field-button"> <input ref={shortcutsImportFieldRef} type="text" name="import" - placeholder="Paste shortcuts here" + placeholder={t`Paste shortcuts here`} class="block" onInput={(e) => { setImportShortcutStr(e.target.value); }} + dir="auto" /> {states.settings.shortcutSettingsCloudImportExport && ( <button @@ -798,9 +817,9 @@ function ImportExport({ shortcuts, onClose }) { disabled={importUIState === 'cloud-downloading'} onClick={async () => { setImportUIState('cloud-downloading'); - const currentAccount = store.session.get('currentAccount'); + const currentAccount = getCurrentAccountID(); showToast( - 'Downloading saved shortcuts from instance server…', + t`Downloading saved shortcuts from instance server…`, ); try { const relationships = @@ -829,10 +848,10 @@ function ImportExport({ shortcuts, onClose }) { } catch (e) { console.error(e); setImportUIState('error'); - showToast('Unable to download shortcuts'); + showToast(t`Unable to download shortcuts`); } }} - title="Download shortcuts from instance server" + title={t`Download shortcuts from instance server`} > <Icon icon="cloud" /> <Icon icon="arrow-down" /> @@ -867,7 +886,7 @@ function ImportExport({ shortcuts, onClose }) { * </span> <span> - {TYPE_TEXT[shortcut.type]} + {_(TYPE_TEXT[shortcut.type])} {shortcut.type === 'list' && ' ⚠️'}{' '} {TYPE_PARAMS[shortcut.type]?.map?.( ({ text, name, type }) => @@ -889,28 +908,37 @@ function ImportExport({ shortcuts, onClose }) { ))} </ol> <p> - <small>* Exists in current shortcuts</small> + <small> + <Trans>* Exists in current shortcuts</Trans> + </small> <br /> <small> - ⚠️ List may not work if it's from a different account. + ⚠️{' '} + <Trans> + List may not work if it's from a different account. + </Trans> </small> </p> </> )} {importUIState === 'error' && ( <p class="error"> - <small>⚠️ Invalid settings format</small> + <small> + ⚠️ <Trans>Invalid settings format</Trans> + </small> </p> )} <p> {hasCurrentSettings && ( <> <MenuConfirm - confirmLabel="Append to current shortcuts?" + confirmLabel={t`Append to current shortcuts?`} menuFooter={ <div class="footer"> - Only shortcuts that don’t exist in current shortcuts will - be appended. + <Trans> + Only shortcuts that don’t exist in current shortcuts + will be appended. + </Trans> </div> } onClick={() => { @@ -929,7 +957,7 @@ function ImportExport({ shortcuts, onClose }) { ), ); if (!nonUniqueShortcuts.length) { - showToast('No new shortcuts to import'); + showToast(t`No new shortcuts to import`); return; } let newShortcuts = [ @@ -944,8 +972,8 @@ function ImportExport({ shortcuts, onClose }) { states.shortcuts = newShortcuts; showToast( exceededLimit - ? `Shortcuts imported. Exceeded max ${SHORTCUTS_LIMIT}, so the rest are not imported.` - : 'Shortcuts imported', + ? t`Shortcuts imported. Exceeded max ${SHORTCUTS_LIMIT}, so the rest are not imported.` + : t`Shortcuts imported`, ); onClose?.(); }} @@ -955,7 +983,7 @@ function ImportExport({ shortcuts, onClose }) { class="plain2" disabled={!parsedImportShortcutStr} > - Import & append… + <Trans>Import & append…</Trans> </button> </MenuConfirm>{' '} </> @@ -963,13 +991,13 @@ function ImportExport({ shortcuts, onClose }) { <MenuConfirm confirmLabel={ hasCurrentSettings - ? 'Override current shortcuts?' - : 'Import shortcuts?' + ? t`Override current shortcuts?` + : t`Import shortcuts?` } menuItemClassName={hasCurrentSettings ? 'danger' : undefined} onClick={() => { states.shortcuts = parsedImportShortcutStr; - showToast('Shortcuts imported'); + showToast(t`Shortcuts imported`); onClose?.(); }} > @@ -978,7 +1006,7 @@ function ImportExport({ shortcuts, onClose }) { class="plain2" disabled={!parsedImportShortcutStr} > - {hasCurrentSettings ? 'or override…' : 'Import…'} + {hasCurrentSettings ? t`or override…` : t`Import…`} </button> </MenuConfirm> </p> @@ -986,7 +1014,9 @@ function ImportExport({ shortcuts, onClose }) { <section> <h3> <Icon icon="arrow-up-circle" size="l" class="insignificant" />{' '} - <span>Export</span> + <span> + <Trans>Export</Trans> + </span> </h3> <p> <input @@ -1000,12 +1030,13 @@ function ImportExport({ shortcuts, onClose }) { // Copy url to clipboard try { navigator.clipboard.writeText(e.target.value); - showToast('Shortcuts copied'); + showToast(t`Shortcuts copied`); } catch (e) { console.error(e); - showToast('Unable to copy shortcuts'); + showToast(t`Unable to copy shortcuts`); } }} + dir="auto" /> </p> <p> @@ -1016,14 +1047,17 @@ function ImportExport({ shortcuts, onClose }) { onClick={() => { try { navigator.clipboard.writeText(shortcutsStr); - showToast('Shortcut settings copied'); + showToast(t`Shortcut settings copied`); } catch (e) { console.error(e); - showToast('Unable to copy shortcut settings'); + showToast(t`Unable to copy shortcut settings`); } }} > - <Icon icon="clipboard" /> <span>Copy</span> + <Icon icon="clipboard" />{' '} + <span> + <Trans>Copy</Trans> + </span> </button>{' '} {navigator?.share && navigator?.canShare?.({ @@ -1040,11 +1074,14 @@ function ImportExport({ shortcuts, onClose }) { }); } catch (e) { console.error(e); - alert("Sharing doesn't seem to work."); + alert(t`Sharing doesn't seem to work.`); } }} > - <Icon icon="share" /> <span>Share</span> + <Icon icon="share" />{' '} + <span> + <Trans>Share</Trans> + </span> </button> )}{' '} {states.settings.shortcutSettingsCloudImportExport && ( @@ -1054,7 +1091,7 @@ function ImportExport({ shortcuts, onClose }) { disabled={importUIState === 'cloud-uploading'} onClick={async () => { setImportUIState('cloud-uploading'); - const currentAccount = store.session.get('currentAccount'); + const currentAccount = getCurrentAccountID(); try { const relationships = await masto.v1.accounts.relationships.fetch({ @@ -1065,16 +1102,16 @@ function ImportExport({ shortcuts, onClose }) { const { note = '' } = relationship; // const newNote = `${note}\n\n\n$<phanpy-shortcuts-settings>{shortcutsStr}</phanpy-shortcuts-settings>`; let newNote = ''; + const settingsJSON = JSON.stringify({ + v: '1', // version + dt: Date.now(), // datetime stamp + data: shortcutsStr, // shortcuts settings string + }); if ( /<phanpy-shortcuts-settings>(.*)<\/phanpy-shortcuts-settings>/.test( note, ) ) { - const settingsJSON = JSON.stringify({ - v: '1', // version - dt: Date.now(), // datetime stamp - data: shortcutsStr, // shortcuts settings string - }); newNote = note.replace( /<phanpy-shortcuts-settings>(.*)<\/phanpy-shortcuts-settings>/, `<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`, @@ -1082,22 +1119,22 @@ function ImportExport({ shortcuts, onClose }) { } else { newNote = `${note}\n\n\n<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`; } - showToast('Saving shortcuts to instance server…'); + showToast(t`Saving shortcuts to instance server…`); await masto.v1.accounts .$select(currentAccount) .note.create({ comment: newNote, }); setImportUIState('default'); - showToast('Shortcuts saved'); + showToast(t`Shortcuts saved`); } } catch (e) { console.error(e); setImportUIState('error'); - showToast('Unable to save shortcuts'); + showToast(t`Unable to save shortcuts`); } }} - title="Sync to instance server" + title={t`Sync to instance server`} > <Icon icon="cloud" /> <Icon icon="arrow-up" /> @@ -1105,14 +1142,20 @@ function ImportExport({ shortcuts, onClose }) { )}{' '} {shortcutsStr.length > 0 && ( <small class="insignificant ib"> - {shortcutsStr.length} characters + <Plural + value={shortcutsStr.length} + one="# character" + other="# characters" + /> </small> )} </p> {!!shortcutsStr && ( <details> <summary class="insignificant"> - <small>Raw Shortcuts JSON</small> + <small> + <Trans>Raw Shortcuts JSON</Trans> + </small> </summary> <textarea style={{ width: '100%' }} rows={10} readOnly> {JSON.stringify(shortcuts.filter(Boolean), null, 2)} @@ -1123,8 +1166,11 @@ function ImportExport({ shortcuts, onClose }) { {states.settings.shortcutSettingsCloudImportExport && ( <footer> <p> - <Icon icon="cloud" /> Import/export settings from/to instance - server (Very experimental) + <Icon icon="cloud" />{' '} + <Trans> + Import/export settings from/to instance server (Very + experimental) + </Trans> </p> </footer> )} diff --git a/src/components/shortcuts.css b/src/components/shortcuts.css index 69e680be..d701fd37 100644 --- a/src/components/shortcuts.css +++ b/src/components/shortcuts.css @@ -2,8 +2,8 @@ position: fixed; bottom: 16px; bottom: max(16px, env(safe-area-inset-bottom)); - left: 16px; - left: max(16px, env(safe-area-inset-left)); + inset-inline-start: 16px; + inset-inline-start: max(16px, env(safe-area-inset-left)); padding: 16px; background-color: var(--bg-faded-blur-color); z-index: 101; @@ -34,9 +34,9 @@ @media (min-width: calc(40em + 56px + 8px)) { #shortcuts-button { - right: 16px; - right: max(16px, env(safe-area-inset-right)); - left: auto; + inset-inline-end: 16px; + inset-inline-end: max(16px, env(safe-area-inset-right)); + inset-inline-start: auto; top: 16px; top: max(16px, env(safe-area-inset-top)); bottom: auto; @@ -121,13 +121,31 @@ text-overflow: ellipsis; overflow: hidden; } +#shortcuts .tab-bar li a { + position: relative; + &:before { + content: ''; + position: absolute; + inset: 4px 0; + border-radius: 8px; + background-color: var(--bg-color); + z-index: -1; + transform: scale(0.5); + opacity: 0; + transition: all 0.1s ease-in-out; + } +} #shortcuts .tab-bar li a.is-active { color: var(--link-color); - background-image: radial-gradient( + /* background-image: radial-gradient( closest-side at 50% 50%, var(--bg-color), transparent - ); + ); */ + &:before { + transform: scale(1); + opacity: 1; + } } #app:has(#home-page):not(:has(#home-page ~ .deck-container)):has(header[hidden]) #shortcuts diff --git a/src/components/shortcuts.jsx b/src/components/shortcuts.jsx index fbb3520d..0fea57d7 100644 --- a/src/components/shortcuts.jsx +++ b/src/components/shortcuts.jsx @@ -1,23 +1,28 @@ import './shortcuts.css'; -import { Menu, MenuItem } from '@szhsin/react-menu'; +import { t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; +import { MenuDivider } from '@szhsin/react-menu'; import { memo } from 'preact/compat'; -import { useMemo, useRef } from 'preact/hooks'; +import { useRef, useState } from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; import { useNavigate } from 'react-router-dom'; import { useSnapshot } from 'valtio'; import { SHORTCUTS_META } from '../components/shortcuts-settings'; import { api } from '../utils/api'; +import { getLists } from '../utils/lists'; import states from '../utils/states'; import AsyncText from './AsyncText'; import Icon from './icon'; import Link from './link'; -import Menu2 from './menu2'; import MenuLink from './menu-link'; +import Menu2 from './menu2'; +import SubMenu2 from './submenu2'; function Shortcuts() { + const { _ } = useLingui(); const { instance } = api(); const snapStates = useSnapshot(states); const { shortcuts, settings } = snapStates; @@ -25,68 +30,81 @@ function Shortcuts() { if (!shortcuts.length) { return null; } - if ( + const isMultiColumnMode = settings.shortcutsViewMode === 'multi-column' || - (!settings.shortcutsViewMode && settings.shortcutsColumnsMode) - ) { + (!settings.shortcutsViewMode && settings.shortcutsColumnsMode); + if (isMultiColumnMode) { return null; } const menuRef = useRef(); - const formattedShortcuts = useMemo( - () => - shortcuts - .map((pin, i) => { - const { type, ...data } = pin; - if (!SHORTCUTS_META[type]) return null; - let { id, path, title, subtitle, icon } = SHORTCUTS_META[type]; + const hasLists = useRef(false); + const formattedShortcuts = shortcuts + .map((pin, i) => { + const { type, ...data } = pin; + if (!SHORTCUTS_META[type]) return null; + let { id, path, title, subtitle, icon } = SHORTCUTS_META[type]; - if (typeof id === 'function') { - id = id(data, i); - } - if (typeof path === 'function') { - path = path( - { - ...data, - instance: data.instance || instance, - }, - i, - ); - } - if (typeof title === 'function') { - title = title(data, i); - } - if (typeof subtitle === 'function') { - subtitle = subtitle(data, i); - } - if (typeof icon === 'function') { - icon = icon(data, i); - } + if (typeof id === 'function') { + id = id(data, i); + } + if (typeof path === 'function') { + path = path( + { + ...data, + instance: data.instance || instance, + }, + i, + ); + } + if (typeof title === 'function') { + title = title(data, i); + } else { + title = _(title); + } + if (typeof subtitle === 'function') { + subtitle = subtitle(data, i); + } else { + subtitle = _(subtitle); + } + if (typeof icon === 'function') { + icon = icon(data, i); + } - return { - id, - path, - title, - subtitle, - icon, - }; - }) - .filter(Boolean), - [shortcuts], - ); + if (id === 'lists') { + hasLists.current = true; + } + + return { + id, + path, + title, + subtitle, + icon, + }; + }) + .filter(Boolean); const navigate = useNavigate(); - useHotkeys(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => { - const index = parseInt(handler.keys[0], 10) - 1; - if (index < formattedShortcuts.length) { - const { path } = formattedShortcuts[index]; - if (path) { - navigate(path); - menuRef.current?.closeMenu?.(); + useHotkeys( + ['1', '2', '3', '4', '5', '6', '7', '8', '9'], + (e, handler) => { + const index = parseInt(handler.keys[0], 10) - 1; + if (index < formattedShortcuts.length) { + const { path } = formattedShortcuts[index]; + if (path) { + navigate(path); + menuRef.current?.closeMenu?.(); + } } - } - }); + }, + { + enabled: !isMultiColumnMode, + }, + ); + + const [lists, setLists] = useState([]); return ( <div id="shortcuts"> @@ -147,6 +165,11 @@ function Shortcuts() { menuClassName="glass-menu shortcuts-menu" gap={8} position="anchor" + onMenuChange={(e) => { + if (e.open && hasLists.current) { + getLists().then(setLists); + } + }} menuButton={ <button type="button" @@ -166,11 +189,42 @@ function Shortcuts() { } catch (e) {} }} > - <Icon icon="shortcut" size="xl" alt="Shortcuts" /> + <Icon icon="shortcut" size="xl" alt={t`Shortcuts`} /> </button> } > {formattedShortcuts.map(({ id, path, title, subtitle, icon }, i) => { + if (id === 'lists') { + return ( + <SubMenu2 + menuClassName="glass-menu" + overflow="auto" + gap={-8} + label={ + <> + <Icon icon={icon} size="l" /> + <span class="menu-grow"> + <AsyncText>{title}</AsyncText> + </span> + <Icon icon="chevron-right" /> + </> + } + > + <MenuLink to="/l"> + <span> + <Trans>All Lists</Trans> + </span> + </MenuLink> + <MenuDivider /> + {lists?.map((list) => ( + <MenuLink key={list.id} to={`/l/${list.id}`}> + <span>{list.title}</span> + </MenuLink> + ))} + </SubMenu2> + ); + } + return ( <MenuLink to={path} diff --git a/src/components/status.css b/src/components/status.css index 93386fda..fafb9c9c 100644 --- a/src/components/status.css +++ b/src/components/status.css @@ -1,22 +1,31 @@ /* REBLOG + REPLY-TO */ +:root { + --post-gradient-angle: 160deg; + --post-gradient-chip-angle: -20deg; + &:dir(rtl) { + --post-gradient-angle: -160deg; + --post-gradient-chip-angle: 20deg; + } +} + .status-reblog { background: linear-gradient( - 160deg, + var(--post-gradient-angle), var(--reblog-faded-color), transparent min(160px, 50%) ); } .status-group { background: linear-gradient( - 160deg, + var(--post-gradient-angle), var(--group-faded-color), transparent min(160px, 50%) ); } .status-followed-tags { background: linear-gradient( - 160deg, + var(--post-gradient-angle), var(--hashtag-faded-color), transparent min(160px, 50%) ); @@ -33,21 +42,21 @@ } .status-reply-to { background: linear-gradient( - 160deg, + var(--post-gradient-angle), var(--reply-to-faded-color), transparent min(160px, 50%) ); } :is(.status-reblog, .status-group, .status-followed-tags) .status-reply-to { background: linear-gradient( - -20deg, + var(--post-gradient-chip-angle), var(--reply-to-faded-color), transparent min(160px, 50%) ); } .visibility-direct { --yellow-stripes: repeating-linear-gradient( - -45deg, + 135deg, var(--reply-to-faded-color), var(--reply-to-faded-color) 10px, var(--reply-to-faded-color) 10px, @@ -72,12 +81,12 @@ } .status-reblog .status-pre-meta .icon { color: var(--reblog-color); - margin-right: 4px; + margin-inline-end: 4px; vertical-align: text-bottom; } .status-group .status-pre-meta .icon { color: var(--group-color); - margin-right: 4px; + margin-inline-end: 4px; vertical-align: text-bottom; } .status-followed-tags { @@ -91,7 +100,7 @@ .icon { color: var(--hashtag-color); - margin-right: 4px; + margin-inline-end: 4px; vertical-align: text-bottom; } a { @@ -105,7 +114,7 @@ padding: 2px; vertical-align: top; text-transform: uppercase; - text-shadow: 0 1px var(--bg-color); + /* text-shadow: 0 1px var(--bg-color); */ &:hover { color: var(--text-color); @@ -160,7 +169,7 @@ display: block; position: relative; - &:after { + &[data-read-more]:after { content: attr(data-read-more); line-height: 1; display: inline-block; @@ -208,14 +217,14 @@ /* filter: drop-shadow(0 2px 4px var(--bg-faded-color)); */ } .status-card:has(.status-badge:not(:empty)) { - border-top-right-radius: 8px; + border-start-end-radius: 8px; } .status-card > * { pointer-events: none; } .status-card:not(.status-carousel .status) :is(.content, .poll, .media-container) { - max-height: 160px !important; + max-height: max(160px, 33vh) !important; overflow: hidden; } .status.small:not(.status-carousel .status, .status.large .status) @@ -238,8 +247,11 @@ :is(.content.truncated, .poll, .media-container.truncated) { mask-image: linear-gradient(to bottom, #000 40px, transparent); } -.status-card .card { - display: none; +.status-card { + .card, + .card-byline { + display: none; + } } .timeline-deck .status-card .content.truncated:after { /* Don't show "Read more" in status cards */ @@ -276,7 +288,8 @@ align-items: center; .status-carousel & { - padding: 16px 16px 16px 24px; + padding: 16px; + padding-inline-start: 24px; } } .status.filtered .status-filtered-info { @@ -286,7 +299,7 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - mask-image: linear-gradient(to right, black 90%, transparent); + mask-image: linear-gradient(var(--to-forward), black 90%, transparent); position: relative; } .status.filtered .avatar { @@ -312,7 +325,7 @@ opacity: 0; transform: translateX(8px); position: absolute; - left: 0; + inset-inline-start: 0; } .status.filtered:is(:hover, :focus, :active) .status-filtered-info-2 { opacity: 0.75; @@ -353,7 +366,7 @@ padding-bottom: 0; margin-bottom: calc(-1 * var(--top-padding) / 2); background-image: linear-gradient( - 160deg, + var(--post-gradient-angle), transparent 2.5%, var(--reply-to-faded-color) 10%, transparent @@ -365,6 +378,10 @@ background-image: var(--yellow-stripes); } + .status-pre-meta + & { + background-image: none; + } + > * { opacity: 0.65; transition: opacity 1s ease-out; @@ -377,7 +394,7 @@ content: ''; position: absolute; top: calc(var(--top-padding) + var(--avatar-size)); - left: var(--line-start); + inset-inline-start: var(--line-start); width: var(--line-width); height: calc( 100% - var(--top-padding) - var(--avatar-size) + (var(--top-padding) / 2) @@ -388,7 +405,7 @@ } .avatar { - margin-left: calc((50px - var(--avatar-size)) / 2); + margin-inline-start: calc((50px - var(--avatar-size)) / 2); justify-self: center; z-index: 1; } @@ -416,6 +433,7 @@ > span + span { position: static; + width: auto; &:empty { display: none; @@ -429,7 +447,7 @@ min-width: 0; } .status:not(.small) > .container { - padding-left: 12px; + padding-inline-start: 12px; } .status > .container > .meta { @@ -447,8 +465,12 @@ /* text-overflow: ellipsis; */ } .status > .container > .meta .meta-name { - mask-image: linear-gradient(to left, transparent, black 16px); + mask-image: linear-gradient(var(--to-backward), transparent, black 16px); flex-grow: 1; + + .name-text b { + opacity: 0.75; + } } .status.large > .container > .meta { min-height: 50px; @@ -462,7 +484,7 @@ text-align: end; text-decoration: none; flex-shrink: 0; - margin-left: 4px; + margin-inline-start: 4px; white-space: nowrap; } .status > .container > .meta a.time { @@ -474,7 +496,7 @@ font-size: 90%; .more { - margin-left: 4px; + margin-inline-start: 4px; transition: transform 0.2s ease-out; } } @@ -501,7 +523,8 @@ .status-reply-badge { display: inline-flex; - margin: 2px 0 2px 4px; + margin: 2px 0; + margin-inline-start: 4px; gap: 4px; align-items: center; vertical-align: middle; @@ -565,13 +588,21 @@ font-weight: bold; vertical-align: middle; display: inline-block; + + &.horizontal { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 100%; + } } -.status-filtered-badge.badge-meta { +.status-filtered-badge:not(.horizontal).badge-meta { display: inline-flex; flex-direction: column; position: relative; top: calc((9px + 2px) / 2 * -1); min-width: 50px; + max-width: 100px; text-align: center; } .status-filtered-badge.clickable:hover { @@ -580,10 +611,12 @@ border-color: var(--text-color); background: var(--bg-color); } -.status-filtered-badge.badge-meta > span:first-child { +.status-filtered-badge:not(.horizontal).badge-meta > span:first-child { + overflow: hidden; + text-overflow: ellipsis; white-space: nowrap; } -.status-filtered-badge.badge-meta > span + span { +.status-filtered-badge:not(.horizontal).badge-meta > span + span { display: block; font-size: 9px; font-weight: normal; @@ -594,12 +627,16 @@ position: absolute; width: 100%; top: calc(100% + 2px); - left: 0; + inset-inline-start: 0; text-align: center; } +.status-filtered-badge.horizontal.badge-meta > span + span { + font-weight: normal; + text-transform: none; +} .status.large > .container > .content-container { - margin-left: calc(-50px - 16px); + margin-inline-start: calc(-50px - 16px); padding-top: 10px; padding-bottom: 10px; } @@ -618,31 +655,33 @@ ~ *:not( .content.truncated, .media-container, + .media-first-container, .card, .media-figure-multiple, .spoiler-media-button ), ~ .card .meta-container { - /* filter: blur(5px) invert(0.5); - image-rendering: crisp-edges; - image-rendering: pixelated; */ opacity: 0.2; text-decoration-thickness: 1.5em; text-decoration-line: line-through; - /* text-rendering: optimizeSpeed; */ pointer-events: none; user-select: none; - /* contain: layout; */ - /* transform: scale(0.97); - transition: transform 0.1s ease-in-out; */ * { text-decoration-color: inherit; text-decoration-thickness: 1.5em; text-decoration-line: line-through; - /* text-rendering: optimizeSpeed; */ } + } + ~ *:not( + .media-container, + .media-first-container, + .card, + .media-figure-multiple, + .spoiler-media-button + ), + ~ .card .meta-container { img { filter: invert(0.5); background-color: black; @@ -708,11 +747,12 @@ } } - ~ :is(.media-container, .media-figure-multiple) .media { + ~ :is(.media-container, .media-first-container, .media-figure-multiple) + .media { background-image: radial-gradient( circle at 50% 50%, var(--average-color, var(--bg-faded-color)), - var(--bg-color) 20em + var(--bg-color) 25em ); > *:not(.media-play, .alt-badge) { @@ -773,6 +813,10 @@ max-height: 50vh; overflow: clip; position: relative; + + &:has(.status-card):not(:has(+ .media-container)) { + max-height: 80vh; + } } .timeline-deck .status-reblog:not(.status-carousel .status-reblog) @@ -790,7 +834,9 @@ black 1.5em ); } -.timeline-deck .status:not(.truncated .status) .content.truncated:after { +.timeline-deck + .status:not(.truncated .status) + .content.truncated[data-read-more]:after { content: attr(data-read-more); line-height: 1; display: inline-block; @@ -816,6 +862,12 @@ .timeline-deck .status .content.truncated ~ .card { display: none; } +.status .content .inner-content { + > img[height] { + height: auto; + aspect-ratio: var(--original-aspect-ratio); + } +} .status .content .inner-content a:not(.mention, .has-url-text) { color: var(--link-text-color); } @@ -908,7 +960,7 @@ grid-auto-rows: 1fr; gap: 2px; /* height: 160px; */ - min-height: 88px; + min-height: var(--min-dimension); height: auto; max-height: max(160px, 33vh); } @@ -971,13 +1023,13 @@ .media-gt2 ) { /* 50px = avatar size */ - margin-left: calc(-1 * ((50px / 2))); + margin-inline-start: calc(-1 * ((50px / 2))); /* outer padding = 16px gap = 12px so... 16 - 12 = 4 */ - margin-right: -4px; + margin-inline-end: -4px; } .status.large :is(.media-container, .media-container.media-gt2) { height: auto; @@ -999,6 +1051,10 @@ background-color: var(--average-color, var(--bg-faded-color)); background-clip: padding-box; } + + &[data-has-small-dimension] img { + object-fit: scale-down; + } } .status .media-container:not(.media-eq1) .media { aspect-ratio: auto !important; @@ -1037,13 +1093,17 @@ .status .media-container.media-eq1 .media { display: inline-block; max-width: 100% !important; - min-width: 88px; + min-width: var(--min-dimension); /* width: auto; */ - min-height: 88px; + min-height: var(--min-dimension); /* --maxAspectHeight: max(160px, 33vh); --aspectWidth: calc(--width / --height * var(--maxAspectHeight)); */ width: min(var(--aspectWidth), var(--width), 100%); max-height: min(var(--height), 33vh); + + &[data-has-natural-aspect-ratio] { + --media-radius: 4px; + } } .status .media-container.media-eq1 .media[data-orientation='portrait'] { /* width: auto; @@ -1079,40 +1139,46 @@ } /* Special media borders */ .status .media-container.media-eq2 .media:first-of-type { - border-radius: var(--media-radius) var(--media-radius-inner) - var(--media-radius-inner) var(--media-radius); + border-start-end-radius: var(--media-radius-inner); + border-end-end-radius: var(--media-radius-inner); } .status .media-container.media-eq2 .media:last-of-type { - border-radius: var(--media-radius-inner) var(--media-radius) - var(--media-radius) var(--media-radius-inner); + border-start-start-radius: var(--media-radius-inner); + border-end-start-radius: var(--media-radius-inner); } .status .media-container.media-eq3 .media:first-of-type { - border-radius: var(--media-radius) var(--media-radius-inner) - var(--media-radius-inner) var(--media-radius); + border-start-end-radius: var(--media-radius-inner); + border-end-end-radius: var(--media-radius-inner); } .status .media-container.media-eq3 .media:nth-of-type(2) { - border-radius: var(--media-radius-inner) var(--media-radius) - var(--media-radius-inner) var(--media-radius-inner); + border-start-start-radius: var(--media-radius-inner); + border-end-end-radius: var(--media-radius-inner); + border-end-start-radius: var(--media-radius-inner); } .status .media-container.media-eq3 .media:last-of-type { - border-radius: var(--media-radius-inner) var(--media-radius-inner) - var(--media-radius) var(--media-radius-inner); + border-start-start-radius: var(--media-radius-inner); + border-start-end-radius: var(--media-radius-inner); + border-end-start-radius: var(--media-radius-inner); } .status .media-container.media-eq4 .media:first-of-type { - border-radius: var(--media-radius) var(--media-radius-inner) - var(--media-radius-inner) var(--media-radius-inner); + border-start-end-radius: var(--media-radius-inner); + border-end-end-radius: var(--media-radius-inner); + border-end-start-radius: var(--media-radius-inner); } .status .media-container.media-eq4 .media:nth-of-type(2) { - border-radius: var(--media-radius-inner) var(--media-radius) - var(--media-radius-inner) var(--media-radius-inner); + border-start-start-radius: var(--media-radius-inner); + border-end-end-radius: var(--media-radius-inner); + border-end-start-radius: var(--media-radius-inner); } .status .media-container.media-eq4 .media:nth-of-type(3) { - border-radius: var(--media-radius-inner) var(--media-radius-inner) - var(--media-radius-inner) var(--media-radius); + border-start-start-radius: var(--media-radius-inner); + border-start-end-radius: var(--media-radius-inner); + border-end-end-radius: var(--media-radius-inner); } .status .media-container.media-eq4 .media:last-of-type { - border-radius: var(--media-radius-inner) var(--media-radius-inner) - var(--media-radius) var(--media-radius-inner); + border-start-start-radius: var(--media-radius-inner); + border-start-end-radius: var(--media-radius-inner); + border-end-start-radius: var(--media-radius-inner); } .status .media:only-child { grid-area: span 2 / span 2; @@ -1165,7 +1231,7 @@ .alt-badge { position: absolute; bottom: 8px; - left: 8px; + inset-inline-start: 8px; &:before { content: ''; @@ -1175,8 +1241,8 @@ } } } -.status .media img:is(:hover, :focus), -a:focus-visible .status .media img { +.status .media:not([data-has-small-dimension]) img:is(:hover, :focus), +a:focus-visible .status .media:not([data-has-small-dimension]) img { animation: position-object 5s ease-in-out 1s 5; animation-duration: var(--anim-duration, 5s); } @@ -1224,7 +1290,7 @@ body:has(#modal-container .carousel) .status .media img:hover { content: attr(data-formatted-duration); position: absolute; bottom: 8px; - right: 8px; + inset-inline-end: 8px; color: var(--media-fg-color); background-color: var(--media-bg-color); border: var(--hairline-width) solid var(--media-outline-color); @@ -1241,7 +1307,7 @@ body:has(#modal-container .carousel) .status .media img:hover { content: attr(data-label); position: absolute; bottom: 8px; - right: 8px; + inset-inline-end: 8px; color: var(--media-fg-color); background-color: var(--media-bg-color); border: var(--hairline-width) solid var(--media-outline-color); @@ -1300,7 +1366,7 @@ body:has(#modal-container .carousel) .status .media img:hover { :is(.status, .media-post) .media-audio { width: 100%; height: 100%; - min-height: 88px; + min-height: var(--min-dimension); background-image: radial-gradient( circle at center center, transparent, @@ -1314,6 +1380,287 @@ body:has(#modal-container .carousel) .status .media img:hover { background-blend-mode: multiply; } +.status.skeleton .media-first-container { + min-height: 320px; + background-color: var(--outline-color); +} + +.status .media-large-container { + width: 100%; + max-width: 100%; + display: inline-flex; + flex-direction: row; + /* align-items: center; + justify-content: center; */ + column-gap: 8px; + flex-wrap: wrap; + + .media { + width: var(--width, auto) !important; + } + + /* .media[data-has-small-dimension] { + width: var(--width, auto) !important; + } */ + + figure { + flex-direction: column; + + figcaption { + flex-grow: 0 !important; + flex-basis: auto !important; + align-self: flex-start !important; + } + } +} + +@keyframes media-carousel-slide { + 0% { + transform: translateX(calc(var(--dots-count, 1) * 2.5px)); + } + 100% { + transform: translateX(calc(var(--dots-count, 1) * -2.5px)); + } +} + +.status-media-first { + timeline-scope: --media-carousel; + + .meta-name { + opacity: 0.65; + transition: opacity 0.5s ease-in-out; + + b + i { + opacity: 0; + transition: opacity 0.5s ease-in-out; + } + } + :is(:hover, :focus) > & .meta-name { + opacity: 1; + b + i { + opacity: 0.5; + } + } + + .media-first-spoiler-content { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + transition: opacity 0.5s ease-in-out; + opacity: 0.5; + } + &:hover .media-first-spoiler-content { + opacity: 1; + } + + .media-first-spoiler-button { + display: inline-flex !important; + } + + .media-first-container { + position: relative; + margin-top: 8px; + margin-inline: -16px; + + @media (min-width: 40em) { + margin-inline: 0; + } + + .media-carousel-controls { + flex-shrink: 0; + position: absolute; + inset: 0; + pointer-events: none; + display: flex; + justify-content: space-between; + } + + .carousel-indexer { + z-index: 1; + position: absolute; + top: 8px; + inset-inline-end: 8px; + color: var(--media-fg-color); + background-color: var(--media-bg-color); + padding: 2px 8px; + border-radius: 16px; + font-size: 0.8em; + font-variant-numeric: tabular-nums; + opacity: 0.6; + transition: opacity 1s ease-in-out 0.3s; + border: var(--hairline-width) solid var(--media-outline-color); + } + + .media-carousel-button { + display: flex; + flex-shrink: 0; + padding-inline: 8px; + margin-block: 3em; + pointer-events: auto; + cursor: pointer; + align-items: center; + justify-content: center; + } + .carousel-button { + @media (pointer: coarse) { + display: none; + } + + + .carousel-button { + inset-inline-start: auto; + inset-inline-end: 8px; + } + } + + @media (hover: hover) and (pointer: fine) { + .carousel-button { + filter: opacity(0); + } + &:hover .carousel-button { + filter: opacity(1); + } + } + } + + .media-first-carousel { + display: flex; + max-height: 80vh; + overflow-x: auto; + overflow-y: hidden; + scroll-snap-type: x mandatory; + scroll-behavior: smooth; + user-select: none; + scrollbar-width: none; + /* border: var(--hairline-width) solid var(--outline-color); + border-inline-width: 0; + background-color: var(--bg-faded-color); */ + box-shadow: 0 0 0 var(--hairline-width) var(--outline-color); + scroll-timeline: --media-carousel x; + + @media (min-width: 40em) { + /* margin-inline: 0; */ + /* border-radius: 4px; */ + /* border-inline-width: var(--hairline-width); */ + box-shadow: none; + } + + &::-webkit-scrollbar { + display: none; + } + + > .media-first-item { + scroll-snap-align: center; + scroll-snap-stop: always; + flex-shrink: 0; + display: flex; + width: 100%; + align-items: center; + justify-content: center; + + &:not(:only-child) { + background-color: var(--bg-blur-color); + /* box-shadow: inset 0 0 0 var(--hairline-width) var(--outline-color); */ + } + + .media { + /* background-color: var(--average-color, var(--bg-faded-color)); */ + width: var(--width, 100%); + max-width: 100%; + max-height: 100%; + min-height: var(--min-dimension); + /* max-height: min(var(--height), 80vh); */ + + &:has(img:not([data-loaded='true'])) { + min-height: 320px; + } + + &:active { + transform: none; + filter: none; + } + + img, + video { + object-fit: scale-down; + animation: none; + + &:not([data-loaded='true']) { + background-color: var(--bg-color); + } + } + } + } + } + :is(:hover, :focus) > & .carousel-indexer { + opacity: 0; + } + + .media-carousel-dots { + pointer-events: none; + display: flex; + gap: 5px; + justify-content: center; + margin-top: 8px; + padding: 8px; + + @supports ((animation-timeline: scroll()) and (animation-range: 0% 100%)) { + animation: media-carousel-slide 1s linear both; + animation-timeline: --media-carousel; + } + + .carousel-dot { + display: inline-block; + width: 5px; + height: 5px; + border-radius: 50%; + background-color: var(--text-color); + transition: all 0.3s ease-in-out; + opacity: 0.3; + flex-shrink: 0; + + &.active { + opacity: 1; + background-color: var(--text-color); + transform: scale(1.5); + } + } + } + + .media-first-content { + margin-top: 8px; + height: 1.75em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.9em; + mask-image: linear-gradient(to bottom, black 1.5em, transparent 1.75em); + opacity: 0.5; + transition: opacity 0.5s ease-in-out; + + @media (min-width: 40em) { + margin-inline: 16px; + } + + * { + text-align: center; + /* Brute force ellipsis */ + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap !important; + pointer-events: none; + } + + a { + filter: grayscale(0.5); + } + } + + :is(:hover, :focus) > & .media-first-content { + opacity: 1; + } +} + .status:not(.large) .hashtag-stuffing { opacity: 0.75; transition: opacity 0.2s ease-in-out; @@ -1332,7 +1679,7 @@ body:has(#modal-container .carousel) .status .media img:hover { display: none; + * { - margin-left: 1ex; + margin-inline-start: 1ex; } } } @@ -1423,9 +1770,9 @@ body:has(#modal-container .carousel) .status .media img:hover { --bottom: 16px; bottom: var(--bottom); bottom: calc(var(--bottom) + env(safe-area-inset-bottom)); - left: 16px; - left: calc(16px + env(safe-area-inset-left)); - text-align: left; + inset-inline-start: 16px; + inset-inline-start: calc(16px + env(safe-area-inset-left)); + text-align: start; border-radius: 8px; color: var(--text-color); padding: 4px 8px; @@ -1552,6 +1899,7 @@ a:focus-visible .card img { .meta-container { align-self: flex-start; flex-grow: 0; + max-width: 100%; } .card .title { line-height: 1.25; @@ -1585,16 +1933,16 @@ a:focus-visible .card img { } .card .meta.domain { opacity: 1; - color: var(--link-color); - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - display: block; + color: var(--text-insignificant-color); + + .domain { + color: var(--link-color); + } } -.card:visited .meta.domain { +.card:visited .meta .domain { color: var(--link-visited-color); } -.card .meta.domain * { +.card .meta .domain * { vertical-align: middle; } a.card { @@ -1621,6 +1969,48 @@ a.card:is(:hover, :focus):visited { width: 100%; height: 100%; } +.card.card-post { + flex-direction: row-reverse; + + .title { + font-weight: 500; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .meta { + -webkit-line-clamp: 5; + line-clamp: 5; + opacity: 1; + /* font-size: inherit; */ + } +} +.status.large .card.large.card-post, +.status-carousel + .content-container[data-content-text-weight='1'] + .card.large.card-post { + flex-direction: column-reverse; +} +.card-byline-author { + display: inline-flex; + gap: 4px; + color: var(--text-insignificant-color); + padding: 2px 8px; + align-items: flex-start; + + .icon { + min-height: 1em; + } + + .avatar { + width: 16px !important; + height: 16px !important; + opacity: 0.8; + vertical-align: middle; + } +} /* POLLS */ @@ -1676,8 +2066,8 @@ a.card:is(:hover, :focus):visited { z-index: 0; } .poll-option:first-child:after { - border-top-left-radius: 12px; - border-top-right-radius: 12px; + border-start-start-radius: 12px; + border-start-end-radius: 12px; } .poll-option:hover:after { opacity: 1; @@ -1695,19 +2085,24 @@ a.card:is(:hover, :focus):visited { } .poll-label input:is([type='radio'], [type='checkbox']) { flex-shrink: 0; - margin: 3px; + margin: 0 3px; + min-height: 1.15em; + accent-color: var(--link-color); } .poll-option-votes { flex-shrink: 0; font-size: 90%; opacity: 0.75; + line-height: 1; } .poll-option-leading .poll-option-votes { font-weight: bold; opacity: 1; } .poll-vote-button { - margin: 8px 8px 0 12px; + margin: 8px 0 0; + margin-inline-start: 12px; + margin-inline-end: 8px; /* padding-inline: 24px; */ min-width: 160px; } @@ -1716,9 +2111,14 @@ a.card:is(:hover, :focus):visited { margin: 8px 16px; font-size: 90%; user-select: none; + + > button:first-child { + margin-inline-start: -8px; + } } .poll-option-title { text-shadow: 0 1px var(--bg-color); + line-height: 1.2; } .poll-option-title .icon { vertical-align: middle; @@ -1731,8 +2131,8 @@ a.card:is(:hover, :focus):visited { color: var(--text-insignificant-color); font-size: 90%; } -.status .extra-meta * { - vertical-align: middle; +.status .extra-meta .icon { + vertical-align: text-bottom; } .status .extra-meta a { color: inherit; @@ -1750,7 +2150,14 @@ a.card:is(:hover, :focus):visited { } .status.large .extra-meta { padding-top: 0; - margin-left: calc(-50px - 16px); + margin-inline-start: calc(-50px - 16px); +} + +/* EMOJI REACTIONS */ + +.status.large .emoji-reactions { + cursor: default; + margin-inline-start: calc(-50px - 16px); } /* ACTIONS */ @@ -1762,7 +2169,7 @@ a.card:is(:hover, :focus):visited { .status.large .actions { padding-top: 4px; padding-bottom: 16px; - margin-left: calc(-50px - 16px); + margin-inline-start: calc(-50px - 16px); color: var(--text-insignificant-color); border-top: var(--hairline-width) solid var(--outline-color); margin-top: 8px; @@ -1921,7 +2328,7 @@ a.card:is(:hover, :focus):visited { width: 100%; border: 1px solid var(--outline-color); background: linear-gradient( - to bottom right, + to bottom var(--forward), var(--bg-faded-color), transparent 160px ); @@ -1939,7 +2346,7 @@ a.card:is(:hover, :focus):visited { display: flex; position: absolute; top: -6px; - right: 8px; + inset-inline-end: 8px; background-color: var(--bg-color); border-radius: 8px; z-index: 1; @@ -1949,7 +2356,7 @@ a.card:is(:hover, :focus):visited { opacity: 0; pointer-events: none; transform: translate3d(0, 6px, 0); - transform-origin: right center; + transform-origin: var(--forward) center; transition: all 0.15s ease-out 0.3s, border-color 0.3s ease-out; .timeline.contextual .replies[data-comments-level='4'] & { @@ -2028,8 +2435,13 @@ a.card:is(:hover, :focus):visited { } } .timeline.contextual .descendant .status { + --bg-gradient-rotation: -140deg; + :dir(rtl) & { + --bg-gradient-rotation: 140deg; + } + --bg-gradient: linear-gradient( - -140deg, + var(--bg-gradient-rotation), var(--bg-faded-color), transparent 75% ); @@ -2056,7 +2468,7 @@ a.card:is(:hover, :focus):visited { .status-badge { position: absolute; top: 4px; - right: 4px; + inset-inline-end: 4px; line-height: 0; pointer-events: none; opacity: 0.75; @@ -2083,8 +2495,21 @@ a.card:is(:hover, :focus):visited { transform: translateX(0); } } +@keyframes swoosh-from-left { + 0% { + opacity: 0; + transform: translateX(-300%); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} .status-badge > * { animation: swoosh-from-right 1s cubic-bezier(0.51, 0.28, 0.16, 1.26) both; + :dir(rtl) & { + animation-name: swoosh-from-left; + } } .status-badge > *:nth-child(2) { animation-delay: 0.1s; @@ -2099,7 +2524,8 @@ a.card:is(:hover, :focus):visited { /* MISC */ .status-aside { - padding: 0 16px 16px 80px; + padding: 0 16px 16px; + padding-inline-start: 80px; color: var(--text-insignificant-color); } @@ -2109,8 +2535,8 @@ a.card:is(:hover, :focus):visited { max-width: 100%; height: 1.2em; vertical-align: text-bottom; - object-fit: cover; - object-position: left; + object-fit: contain; + /* object-position: left; */ } /* EDIT HISTORY */ @@ -2118,24 +2544,39 @@ a.card:is(:hover, :focus):visited { #edit-history { min-height: 50vh; min-height: 50dvh; -} -#edit-history h2 { - margin: 0; - padding: 0; -} + h2 { + margin: 0; + padding: 0; + } -#edit-history ol, -#edit-history ol li { - list-style: none; - margin: 0; - padding: 0; -} + ol, + ol li { + list-style: none; + margin: 0; + padding: 0; + } -#edit-history .history-item .status { - border: 1px solid var(--outline-color); - border-radius: 8px; - pointer-events: none; + .history-item .status { + border: 1px solid var(--outline-color); + border-radius: 8px; + pointer-events: none; + } + + .status { + .invisible { + display: revert; + } + + .hashtag-stuffing { + white-space: normal; + opacity: 1; + } + + a { + color: var(--text-color); + } + } } /* EMBED */ @@ -2279,7 +2720,7 @@ a.card:is(:hover, :focus):visited { mask-image: linear-gradient(to bottom, #000 80px, transparent); } - &:after { + &[data-read-more]:after { content: attr(data-read-more); line-height: 1; display: inline-block; @@ -2367,7 +2808,7 @@ a.card:is(:hover, :focus):visited { vertical-align: super; font-weight: normal; line-height: 0; - padding-left: 2px; + padding-inline-start: 2px; } &.clickable { diff --git a/src/components/status.jsx b/src/components/status.jsx index 441a034f..e527d39d 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -1,6 +1,8 @@ import './status.css'; - import '@justinribeiro/lite-youtube'; + +import { msg, plural, Plural, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { ControlledMenu, Menu, @@ -11,24 +13,30 @@ import { import { decodeBlurHash, getBlurHashAverageColor } from 'fast-blurhash'; import { shallowEqual } from 'fast-equals'; import prettify from 'html-prettify'; -import { memo } from 'preact/compat'; +import pThrottle from 'p-throttle'; +import { Fragment } from 'preact'; +import { forwardRef, memo } from 'preact/compat'; import { useCallback, useContext, useEffect, + useLayoutEffect, useMemo, useRef, useState, } from 'preact/hooks'; +import punycode from 'punycode/'; import { useHotkeys } from 'react-hotkeys-hook'; +// import { detectAll } from 'tinyld/light'; import { useLongPress } from 'use-long-press'; import { useSnapshot } from 'valtio'; -import AccountBlock from '../components/account-block'; +import CustomEmoji from '../components/custom-emoji'; import EmojiText from '../components/emoji-text'; +import LazyShazam from '../components/lazy-shazam'; import Loader from '../components/loader'; -import Menu2 from '../components/menu2'; import MenuConfirm from '../components/menu-confirm'; +import Menu2 from '../components/menu2'; import Modal from '../components/modal'; import NameText from '../components/name-text'; import Poll from '../components/poll'; @@ -41,6 +49,7 @@ import getTranslateTargetLanguage from '../utils/get-translate-target-language'; import getHTMLText from '../utils/getHTMLText'; import handleContentLinks from '../utils/handle-content-links'; import htmlContentLength from '../utils/html-content-length'; +import isRTL from '../utils/is-rtl'; import isMastodonLinkMaybe from '../utils/isMastodonLinkMaybe'; import localeMatch from '../utils/locale-match'; import niceDateTime from '../utils/nice-date-time'; @@ -48,11 +57,14 @@ import openCompose from '../utils/open-compose'; import pmem from '../utils/pmem'; import safeBoundingBoxPadding from '../utils/safe-bounding-box-padding'; import shortenNumber from '../utils/shorten-number'; +import showCompose from '../utils/show-compose'; import showToast from '../utils/show-toast'; import { speak, supportsTTS } from '../utils/speech'; import states, { getStatus, saveStatus, statusKey } from '../utils/states'; import statusPeek from '../utils/status-peek'; import store from '../utils/store'; +import { getCurrentAccountID } from '../utils/store-utils'; +import supports from '../utils/supports'; import unfurlMastodonLink from '../utils/unfurl-link'; import useTruncated from '../utils/useTruncated'; import visibilityIconsMap from '../utils/visibility-icons-map'; @@ -60,8 +72,7 @@ import visibilityIconsMap from '../utils/visibility-icons-map'; import Avatar from './avatar'; import Icon from './icon'; import Link from './link'; -import Media from './media'; -import { isMediaCaptionLong } from './media'; +import Media, { isMediaCaptionLong } from './media'; import MenuLink from './menu-link'; import RelativeTime from './relative-time'; import TranslationBlock from './translation-block'; @@ -69,22 +80,29 @@ import TranslationBlock from './translation-block'; const SHOW_COMMENT_COUNT_LIMIT = 280; const INLINE_TRANSLATE_LIMIT = 140; +const throttle = pThrottle({ + limit: 1, + interval: 1000, +}); function fetchAccount(id, masto) { return masto.v1.accounts.$select(id).fetch(); } -const memFetchAccount = pmem(fetchAccount); +const memFetchAccount = pmem(throttle(fetchAccount)); const visibilityText = { - public: 'Public', - unlisted: 'Unlisted', - private: 'Followers only', - direct: 'Private mention', + public: msg`Public`, + local: msg`Local`, + unlisted: msg`Unlisted`, + private: msg`Followers only`, + direct: msg`Private mention`, }; const isIOS = window.ontouchstart !== undefined && /iPad|iPhone|iPod/.test(navigator.userAgent); +const rtf = new Intl.RelativeTimeFormat(); + const REACTIONS_LIMIT = 80; function getPollText(poll) { @@ -107,11 +125,87 @@ function getPostText(status) { ); } -const PostContent = memo( +function forgivingQSA(selectors = [], dom = document) { + // Run QSA for list of selectors + // If a selector return invalid selector error, try the next one + for (const selector of selectors) { + try { + return dom.querySelectorAll(selector); + } catch (e) {} + } + return []; +} + +function isTranslateble(content) { + if (!content) return false; + content = content.trim(); + if (!content) return false; + const text = getHTMLText(content, { + preProcess: (dom) => { + // Remove .mention, pre, code, a:has(.invisible) + for (const a of forgivingQSA( + ['.mention, pre, code, a:has(.invisible)', '.mention, pre, code'], + dom, + )) { + a.remove(); + } + }, + }); + return !!text; +} + +function getHTMLTextForDetectLang(content) { + return getHTMLText(content, { + preProcess: (dom) => { + // Remove anything that can skew the language detection + + // Remove .mention, .hashtag, pre, code, a:has(.invisible) + for (const a of forgivingQSA( + [ + '.mention, .hashtag, pre, code, a:has(.invisible)', + '.mention, .hashtag, pre, code', + ], + dom, + )) { + a.remove(); + } + + // Remove links that contains text that starts with https?:// + for (const a of dom.querySelectorAll('a')) { + const text = a.innerText.trim(); + if (text.startsWith('https://') || text.startsWith('http://')) { + a.remove(); + } + } + }, + }); +} + +const HTTP_REGEX = /^http/i; +const PostContent = + /*memo(*/ ({ post, instance, previewMode }) => { const { content, emojis, language, mentions, url } = post; + + const divRef = useRef(); + useLayoutEffect(() => { + if (!divRef.current) return; + const dom = enhanceContent(content, { + emojis, + returnDOM: true, + }); + // Remove target="_blank" from links + for (const a of dom.querySelectorAll('a.u-url[target="_blank"]')) { + if (!HTTP_REGEX.test(a.innerText.trim())) { + a.removeAttribute('target'); + } + } + divRef.current.replaceChildren(dom.cloneNode(true)); + }, [content, emojis.length]); + return ( <div + ref={divRef} lang={language} dir="auto" class="inner-content" @@ -121,28 +215,75 @@ const PostContent = memo( previewMode, statusURL: url, })} - dangerouslySetInnerHTML={{ - __html: enhanceContent(content, { - emojis, - postEnhanceDOM: (dom) => { - // Remove target="_blank" from links - dom.querySelectorAll('a.u-url[target="_blank"]').forEach((a) => { - if (!/http/i.test(a.innerText.trim())) { - a.removeAttribute('target'); - } - }); - }, - }), - }} + // dangerouslySetInnerHTML={{ + // __html: enhanceContent(content, { + // emojis, + // postEnhanceDOM: (dom) => { + // // Remove target="_blank" from links + // dom.querySelectorAll('a.u-url[target="_blank"]').forEach((a) => { + // if (!/http/i.test(a.innerText.trim())) { + // a.removeAttribute('target'); + // } + // }); + // }, + // }), + // }} /> ); - }, + }; /*, (oldProps, newProps) => { const { post: oldPost } = oldProps; const { post: newPost } = newProps; return oldPost.content === newPost.content; }, -); +);*/ + +const SIZE_CLASS = { + s: 'small', + m: 'medium', + l: 'large', +}; + +const detectLang = pmem(async (text) => { + const { detectAll } = await import('tinyld/light'); + text = text?.trim(); + + // Ref: https://github.com/komodojp/tinyld/blob/develop/docs/benchmark.md + // 500 should be enough for now, also the default max chars for Mastodon + if (text?.length > 500) { + return null; + } + const langs = detectAll(text); + const lang = langs[0]; + if (lang?.lang && lang?.accuracy > 0.5) { + // If > 50% accurate, use it + // It can be accurate if < 50% but better be safe + // Though > 50% also can be inaccurate 🤷‍♂️ + return lang.lang; + } + return null; +}); + +const readMoreText = msg`Read more →`; + +// All this work just to make sure this only lazy-run once +// Because first run is slow due to intl-localematcher +const DIFFERENT_LANG_CHECK = {}; +const checkDifferentLanguage = ( + language, + contentTranslationHideLanguages = [], +) => { + if (!language) return false; + const targetLanguage = getTranslateTargetLanguage(true); + const different = + language !== targetLanguage && + !localeMatch([language], [targetLanguage]) && + !contentTranslationHideLanguages.find( + (l) => language === l || localeMatch([language], [l]), + ); + DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages] = true; + return different; +}; function Status({ statusID, @@ -165,15 +306,25 @@ function Status({ allowContextMenu, showActionsBar, showReplyParent, + mediaFirst, }) { + const { _ } = useLingui(); + if (skeleton) { return ( - <div class="status skeleton"> - <Avatar size="xxl" /> + <div + class={`status skeleton ${ + mediaFirst ? 'status-media-first small' : '' + }`} + > + {!mediaFirst && <Avatar size="xxl" />} <div class="container"> - <div class="meta">███ ████████</div> + <div class="meta"> + {(size === 's' || mediaFirst) && <Avatar size="m" />} ███ ████████ + </div> <div class="content-container"> - <div class="content"> + {mediaFirst && <div class="media-first-container" />} + <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}> <p>████ ████████</p> </div> </div> @@ -220,7 +371,7 @@ function Status({ sensitive, spoilerText, visibility, // public, unlisted, private, direct - language, + language: _language, editedAt, filtered, card, @@ -235,14 +386,35 @@ function Status({ url, emojis, tags, + pinned, // Non-API props _deleted, _pinned, // _filtered, + // Non-Mastodon + emojiReactions, } = status; + const [languageAutoDetected, setLanguageAutoDetected] = useState(null); + useEffect(() => { + if (!content) return; + if (_language) return; + if (languageAutoDetected) return; + let timer; + timer = setTimeout(async () => { + let detected = await detectLang(getHTMLTextForDetectLang(content)); + setLanguageAutoDetected(detected); + }, 1000); + return () => clearTimeout(timer); + }, [content, _language]); + const language = _language || languageAutoDetected; + + // if (!mediaAttachments?.length) mediaFirst = false; + const hasMediaAttachments = !!mediaAttachments?.length; + if (mediaFirst && hasMediaAttachments) size = 's'; + const currentAccount = useMemo(() => { - return store.session.get('currentAccount'); + return getCurrentAccountID(); }, []); const isSelf = useMemo(() => { return currentAccount && currentAccount === accountId; @@ -276,6 +448,7 @@ function Status({ onMouseEnter: debugHover, }} showFollowedTags + quoted={quoted} /> ); } @@ -315,7 +488,7 @@ function Status({ // default | show_all | hide_all // Ignore hide_all because it means hide *ALL* media including non-sensitive ones const prefs = store.account.get('preferences') || {}; - return prefs['reading:expand:media'] || 'default'; + return prefs['reading:expand:media']?.toLowerCase() || 'default'; }, []); // FOR TESTING: // const readingExpandSpoilers = true; @@ -338,7 +511,7 @@ function Status({ onMouseEnter={debugHover} > <div class="status-pre-meta"> - <Icon icon="group" size="l" alt="Group" />{' '} + <Icon icon="group" size="l" alt={t`Group`} />{' '} <NameText account={status.account} instance={instance} showAvatar /> </div> <Status @@ -348,6 +521,7 @@ function Status({ size={size} contentTextWeight={contentTextWeight} readOnly={readOnly} + mediaFirst={mediaFirst} /> </div> ); @@ -361,8 +535,10 @@ function Status({ > <div class="status-pre-meta"> <Icon icon="rocket" size="l" />{' '} - <NameText account={status.account} instance={instance} showAvatar />{' '} - <span>boosted</span> + <Trans> + <NameText account={status.account} instance={instance} showAvatar />{' '} + <span>boosted</span> + </Trans> </div> <Status status={statusID ? null : reblog} @@ -372,14 +548,15 @@ function Status({ contentTextWeight={contentTextWeight} readOnly={readOnly} enableCommentHint + mediaFirst={mediaFirst} /> </div> ); } // Check followedTags - if (showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length) { - return ( + const FollowedTagsParent = useCallback( + ({ children }) => ( <div data-state-post-id={sKey} class="status-followed-tags" @@ -397,25 +574,22 @@ function Status({ </Link> ))} </div> - <Status - status={statusID ? null : status} - statusID={statusID ? status.id : null} - instance={instance} - size={size} - contentTextWeight={contentTextWeight} - readOnly={readOnly} - enableCommentHint - /> + {children} </div> - ); - } + ), + [sKey, instance, snapStates.statusFollowedTags[sKey]], + ); + const StatusParent = + showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length + ? FollowedTagsParent + : Fragment; const isSizeLarge = size === 'l'; const [forceTranslate, setForceTranslate] = useState(_forceTranslate); - const targetLanguage = getTranslateTargetLanguage(true); - const contentTranslationHideLanguages = - snapStates.settings.contentTranslationHideLanguages || []; + // const targetLanguage = getTranslateTargetLanguage(true); + // const contentTranslationHideLanguages = + // snapStates.settings.contentTranslationHideLanguages || []; const { contentTranslation, contentTranslationAutoInline } = snapStates.settings; if (!contentTranslation) enableTranslate = false; @@ -457,11 +631,10 @@ function Status({ const spoilerContentRef = useTruncated(); const contentRef = useTruncated(); const mediaContainerRef = useTruncated(); - const readMoreText = 'Read more →'; const statusRef = useRef(null); - const unauthInteractionErrorMessage = `Sorry, your current logged-in instance can't interact with this post from another instance.`; + const unauthInteractionErrorMessage = t`Sorry, your current logged-in instance can't interact with this post from another instance.`; const textWeight = useCallback( () => @@ -497,9 +670,9 @@ function Status({ }); if (newWin) return; } - states.showCompose = { + showCompose({ replyToStatus: status, - }; + }); }; // Check if media has no descriptions @@ -508,44 +681,51 @@ function Status({ (attachment) => !attachment.description?.trim?.(), ); }, [mediaAttachments]); - const boostStatus = async () => { - if (!sameInstance || !authenticated) { - alert(unauthInteractionErrorMessage); - return false; - } - try { - if (!reblogged) { - let confirmText = 'Boost this post?'; - if (mediaNoDesc) { - confirmText += '\n\n⚠️ Some media have no descriptions.'; - } - const yes = confirm(confirmText); - if (!yes) { - return false; - } - } - // Optimistic - states.statuses[sKey] = { - ...status, - reblogged: !reblogged, - reblogsCount: reblogsCount + (reblogged ? -1 : 1), - }; - if (reblogged) { - const newStatus = await masto.v1.statuses.$select(id).unreblog(); - saveStatus(newStatus, instance); - return true; - } else { - const newStatus = await masto.v1.statuses.$select(id).reblog(); - saveStatus(newStatus, instance); - return true; - } - } catch (e) { - console.error(e); - // Revert optimistism - states.statuses[sKey] = status; - return false; - } - }; + + const statusMonthsAgo = useMemo(() => { + return Math.floor( + (new Date() - createdAtDate) / (1000 * 60 * 60 * 24 * 30), + ); + }, [createdAtDate]); + + // const boostStatus = async () => { + // if (!sameInstance || !authenticated) { + // alert(unauthInteractionErrorMessage); + // return false; + // } + // try { + // if (!reblogged) { + // let confirmText = 'Boost this post?'; + // if (mediaNoDesc) { + // confirmText += '\n\n⚠️ Some media have no descriptions.'; + // } + // const yes = confirm(confirmText); + // if (!yes) { + // return false; + // } + // } + // // Optimistic + // states.statuses[sKey] = { + // ...status, + // reblogged: !reblogged, + // reblogsCount: reblogsCount + (reblogged ? -1 : 1), + // }; + // if (reblogged) { + // const newStatus = await masto.v1.statuses.$select(id).unreblog(); + // saveStatus(newStatus, instance); + // return true; + // } else { + // const newStatus = await masto.v1.statuses.$select(id).reblog(); + // saveStatus(newStatus, instance); + // return true; + // } + // } catch (e) { + // console.error(e); + // // Revert optimistism + // states.statuses[sKey] = status; + // return false; + // } + // }; const confirmBoostStatus = async () => { if (!sameInstance || !authenticated) { alert(unauthInteractionErrorMessage); @@ -607,14 +787,15 @@ function Status({ if (!isSizeLarge && done) { showToast( favourited - ? `Unliked @${username || acct}'s post` - : `Liked @${username || acct}'s post`, + ? t`Unliked @${username || acct}'s post` + : t`Liked @${username || acct}'s post`, ); } } catch (e) {} }; const bookmarkStatus = async () => { + if (!supports('@mastodon/post-bookmark')) return; if (!sameInstance || !authenticated) { alert(unauthInteractionErrorMessage); return false; @@ -646,20 +827,44 @@ function Status({ if (!isSizeLarge && done) { showToast( bookmarked - ? `Unbookmarked @${username || acct}'s post` - : `Bookmarked @${username || acct}'s post`, + ? t`Unbookmarked @${username || acct}'s post` + : t`Bookmarked @${username || acct}'s post`, ); } } catch (e) {} }; - const differentLanguage = - !!language && - language !== targetLanguage && - !localeMatch([language], [targetLanguage]) && - !contentTranslationHideLanguages.find( - (l) => language === l || localeMatch([language], [l]), - ); + // const differentLanguage = + // !!language && + // language !== targetLanguage && + // !localeMatch([language], [targetLanguage]) && + // !contentTranslationHideLanguages.find( + // (l) => language === l || localeMatch([language], [l]), + // ); + const contentTranslationHideLanguages = + snapStates.settings.contentTranslationHideLanguages || []; + const [differentLanguage, setDifferentLanguage] = useState( + DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages] + ? checkDifferentLanguage(language, contentTranslationHideLanguages) + : false, + ); + useEffect(() => { + if ( + !language || + differentLanguage || + DIFFERENT_LANG_CHECK[language + contentTranslationHideLanguages] + ) { + return; + } + let timeout = setTimeout(() => { + const different = checkDifferentLanguage( + language, + contentTranslationHideLanguages, + ); + if (different) setDifferentLanguage(different); + }, 1); + return () => clearTimeout(timeout); + }, [language, differentLanguage, contentTranslationHideLanguages]); const reblogIterator = useRef(); const favouriteIterator = useRef(); @@ -715,32 +920,13 @@ function Status({ const isPinnable = ['public', 'unlisted', 'private'].includes(visibility); const StatusMenuItems = ( <> - {isSizeLarge && ( - <> - <MenuItem - onClick={() => { - states.showGenericAccounts = { - heading: 'Boosted/Liked by…', - fetchAccounts: fetchBoostedLikedByAccounts, - instance, - showReactions: true, - }; - }} - > - <Icon icon="react" /> - <span> - Boosted/Liked by<span class="more-insignificant">…</span> - </span> - </MenuItem> - </> - )} {!isSizeLarge && sameInstance && ( <> <div class="menu-control-group-horizontal status-menu"> <MenuItem onClick={replyStatus}> <Icon icon="comment" /> <span> - {repliesCount > 0 ? shortenNumber(repliesCount) : 'Reply'} + {repliesCount > 0 ? shortenNumber(repliesCount) : t`Reply`} </span> </MenuItem> <MenuConfirm @@ -748,31 +934,47 @@ function Status({ confirmLabel={ <> <Icon icon="rocket" /> - <span>{reblogged ? 'Unboost' : 'Boost'}</span> + <span>{reblogged ? t`Unboost` : t`Boost`}</span> </> } className={`menu-reblog ${reblogged ? 'checked' : ''}`} menuExtras={ <MenuItem onClick={() => { - states.showCompose = { + showCompose({ draftStatus: { status: `\n${url}`, }, - }; + }); }} > <Icon icon="quote" /> - <span>Quote</span> + <span> + <Trans>Quote</Trans> + </span> </MenuItem> } menuFooter={ - mediaNoDesc && - !reblogged && ( + mediaNoDesc && !reblogged ? ( <div class="footer"> <Icon icon="alert" /> - Some media have no descriptions. + <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> + ) ) } disabled={!canBoost} @@ -782,8 +984,8 @@ function Status({ if (!isSizeLarge && done) { showToast( reblogged - ? `Unboosted @${username || acct}'s post` - : `Boosted @${username || acct}'s post`, + ? t`Unboosted @${username || acct}'s post` + : t`Boosted @${username || acct}'s post`, ); } } catch (e) {} @@ -794,8 +996,8 @@ function Status({ {reblogsCount > 0 ? shortenNumber(reblogsCount) : reblogged - ? 'Unboost' - : 'Boost…'} + ? t`Unboost` + : t`Boost…`} </span> </MenuConfirm> <MenuItem @@ -807,78 +1009,116 @@ function Status({ {favouritesCount > 0 ? shortenNumber(favouritesCount) : favourited - ? 'Unlike' - : 'Like'} + ? t`Unlike` + : t`Like`} </span> </MenuItem> - <MenuItem - onClick={bookmarkStatusNotify} - className={`menu-bookmark ${bookmarked ? 'checked' : ''}`} - > - <Icon icon="bookmark" /> - <span>{bookmarked ? 'Unbookmark' : 'Bookmark'}</span> - </MenuItem> - </div> - </> - )} - {(enableTranslate || !language || differentLanguage) && <MenuDivider />} - {enableTranslate ? ( - <div class={supportsTTS ? 'menu-horizontal' : ''}> - <MenuItem - disabled={forceTranslate} - onClick={() => { - setForceTranslate(true); - }} - > - <Icon icon="translate" /> - <span>Translate</span> - </MenuItem> - {supportsTTS && ( - <MenuItem - onClick={() => { - const postText = getPostText(status); - if (postText) { - speak(postText, language); - } - }} - > - <Icon icon="speak" /> - <span>Speak</span> - </MenuItem> - )} - </div> - ) : ( - (!language || differentLanguage) && ( - <div class={supportsTTS ? 'menu-horizontal' : ''}> - <MenuLink - to={`${instance ? `/${instance}` : ''}/s/${id}?translate=1`} - > - <Icon icon="translate" /> - <span>Translate</span> - </MenuLink> - {supportsTTS && ( + {supports('@mastodon/post-bookmark') && ( <MenuItem - onClick={() => { - const postText = getPostText(status); - if (postText) { - speak(postText, language); - } - }} + onClick={bookmarkStatusNotify} + className={`menu-bookmark ${bookmarked ? 'checked' : ''}`} > - <Icon icon="speak" /> - <span>Speak</span> + <Icon icon="bookmark" /> + <span>{bookmarked ? t`Unbookmark` : t`Bookmark`}</span> </MenuItem> )} </div> - ) + </> )} - {!isSizeLarge || - ((enableTranslate || !language || differentLanguage) && ( - <MenuDivider /> - ))} + {!isSizeLarge && sameInstance && (isSizeLarge || showActionsBar) && ( + <MenuDivider /> + )} + {(isSizeLarge || showActionsBar) && ( + <> + <MenuItem + onClick={() => { + states.showGenericAccounts = { + heading: t`Boosted/Liked by…`, + fetchAccounts: fetchBoostedLikedByAccounts, + instance, + showReactions: true, + postID: sKey, + }; + }} + > + <Icon icon="react" /> + <span> + <Trans>Boosted/Liked by…</Trans> + </span> + </MenuItem> + </> + )} + {!mediaFirst && ( + <> + {(enableTranslate || !language || differentLanguage) && ( + <MenuDivider /> + )} + {enableTranslate ? ( + <div class={supportsTTS ? 'menu-horizontal' : ''}> + <MenuItem + disabled={forceTranslate} + onClick={() => { + setForceTranslate(true); + }} + > + <Icon icon="translate" /> + <span> + <Trans>Translate</Trans> + </span> + </MenuItem> + {supportsTTS && ( + <MenuItem + onClick={() => { + const postText = getPostText(status); + if (postText) { + speak(postText, language); + } + }} + > + <Icon icon="speak" /> + <span> + <Trans>Speak</Trans> + </span> + </MenuItem> + )} + </div> + ) : ( + (!language || differentLanguage) && ( + <div class={supportsTTS ? 'menu-horizontal' : ''}> + <MenuLink + to={`${instance ? `/${instance}` : ''}/s/${id}?translate=1`} + > + <Icon icon="translate" /> + <span> + <Trans>Translate</Trans> + </span> + </MenuLink> + {supportsTTS && ( + <MenuItem + onClick={() => { + const postText = getPostText(status); + if (postText) { + speak(postText, language); + } + }} + > + <Icon icon="speak" /> + <span> + <Trans>Speak</Trans> + </span> + </MenuItem> + )} + </div> + ) + )} + </> + )} + {((!isSizeLarge && sameInstance) || + enableTranslate || + !language || + differentLanguage) && <MenuDivider />} {!isSizeLarge && ( <> - <MenuDivider /> <MenuLink to={instance ? `/${instance}/s/${id}` : `/s/${id}`} onClick={(e) => { @@ -887,10 +1127,13 @@ function Status({ > <Icon icon="arrows-right" /> <small> - View post by @{username || acct} + <Trans> + View post by{' '} + <span class="bidi-isolate">@{username || acct}</span> + </Trans> <br /> <span class="more-insignificant"> - {visibilityText[visibility]} • {createdDateText} + {_(visibilityText[visibility])} • {createdDateText} </span> </small> </MenuLink> @@ -905,16 +1148,25 @@ function Status({ > <Icon icon="history" /> <small> - Show Edit History + <Trans>Show Edit History</Trans> <br /> - <span class="more-insignificant">Edited: {editedDateText}</span> + <span class="more-insignificant"> + <Trans>Edited: {editedDateText}</Trans> + </span> </small> </MenuItem> </> )} <MenuItem href={url} target="_blank"> <Icon icon="external" /> - <small class="menu-double-lines">{nicePostURL(url)}</small> + <small + class="menu-double-lines" + style={{ + maxWidth: '16em', + }} + > + {nicePostURL(url)} + </small> </MenuItem> <div class="menu-horizontal"> <MenuItem @@ -922,15 +1174,17 @@ function Status({ // Copy url to clipboard try { navigator.clipboard.writeText(url); - showToast('Link copied'); + showToast(t`Link copied`); } catch (e) { console.error(e); - showToast('Unable to copy link'); + showToast(t`Unable to copy link`); } }} > <Icon icon="link" /> - <span>Copy</span> + <span> + <Trans>Copy</Trans> + </span> </MenuItem> {isPublic && navigator?.share && @@ -945,12 +1199,14 @@ function Status({ }); } catch (e) { console.error(e); - alert("Sharing doesn't seem to work."); + alert(t`Sharing doesn't seem to work.`); } }} > <Icon icon="share" /> - <span>Share…</span> + <span> + <Trans>Share…</Trans> + </span> </MenuItem> )} </div> @@ -961,7 +1217,9 @@ function Status({ }} > <Icon icon="code" /> - <span>Embed post</span> + <span> + <Trans>Embed post</Trans> + </span> </MenuItem> )} {(isSelf || mentionSelf) && <MenuDivider />} @@ -973,13 +1231,15 @@ function Status({ .$select(id) [muted ? 'unmute' : 'mute'](); saveStatus(newStatus, instance); - showToast(muted ? 'Conversation unmuted' : 'Conversation muted'); + showToast( + muted ? t`Conversation unmuted` : t`Conversation muted`, + ); } catch (e) { console.error(e); showToast( muted - ? 'Unable to unmute conversation' - : 'Unable to mute conversation', + ? t`Unable to unmute conversation` + : t`Unable to mute conversation`, ); } }} @@ -987,12 +1247,16 @@ function Status({ {muted ? ( <> <Icon icon="unmute" /> - <span>Unmute conversation</span> + <span> + <Trans>Unmute conversation</Trans> + </span> </> ) : ( <> <Icon icon="mute" /> - <span>Mute conversation</span> + <span> + <Trans>Mute conversation</Trans> + </span> </> )} </MenuItem> @@ -1003,55 +1267,68 @@ function Status({ try { const newStatus = await masto.v1.statuses .$select(id) - [_pinned ? 'unpin' : 'pin'](); - // saveStatus(newStatus, instance); + [pinned ? 'unpin' : 'pin'](); + saveStatus(newStatus, instance); showToast( - _pinned - ? 'Post unpinned from profile' - : 'Post pinned to profile', + pinned + ? t`Post unpinned from profile` + : t`Post pinned to profile`, ); } catch (e) { console.error(e); showToast( - _pinned ? 'Unable to unpin post' : 'Unable to pin post', + pinned ? t`Unable to unpin post` : t`Unable to pin post`, ); } }} > - {_pinned ? ( + {pinned ? ( <> <Icon icon="unpin" /> - <span>Unpin from profile</span> + <span> + <Trans>Unpin from profile</Trans> + </span> </> ) : ( <> <Icon icon="pin" /> - <span>Pin to profile</span> + <span> + <Trans>Pin to profile</Trans> + </span> </> )} </MenuItem> )} {isSelf && ( <div class="menu-horizontal"> - <MenuItem - onClick={() => { - states.showCompose = { - editStatus: status, - }; - }} - > - <Icon icon="pencil" /> - <span>Edit</span> - </MenuItem> + {supports('@mastodon/post-edit') && ( + <MenuItem + onClick={() => { + showCompose({ + editStatus: status, + }); + }} + > + <Icon icon="pencil" /> + <span> + <Trans>Edit</Trans> + </span> + </MenuItem> + )} {isSizeLarge && ( <MenuConfirm subMenu confirmLabel={ <> <Icon icon="trash" /> - <span>Delete this post?</span> + <span> + <Trans>Delete this post?</Trans> + </span> </> } + itemProps={{ + className: 'danger', + }} menuItemClassName="danger" onClick={() => { // const yes = confirm('Delete this post?'); @@ -1061,17 +1338,19 @@ function Status({ await masto.v1.statuses.$select(id).remove(); const cachedStatus = getStatus(id, instance); cachedStatus._deleted = true; - showToast('Deleted'); + showToast(t`Post deleted`); } catch (e) { console.error(e); - showToast('Unable to delete'); + showToast(t`Unable to delete post`); } })(); // } }} > <Icon icon="trash" /> - <span>Delete…</span> + <span> + <Trans>Delete…</Trans> + </span> </MenuConfirm> )} </div> @@ -1089,7 +1368,9 @@ function Status({ }} > <Icon icon="flag" /> - <span>Report post…</span> + <span> + <Trans>Report post…</Trans> + </span> </MenuItem> </> )} @@ -1158,8 +1439,8 @@ function Status({ if (!isSizeLarge && done) { showToast( reblogged - ? `Unboosted @${username || acct}'s post` - : `Boosted @${username || acct}'s post`, + ? t`Unboosted @${username || acct}'s post` + : t`Boosted @${username || acct}'s post`, ); } } catch (e) {} @@ -1323,7 +1604,7 @@ function Status({ ]); return ( - <> + <StatusParent> {showReplyParent && !!(inReplyToId && inReplyToAccountId) && ( <StatusCompact sKey={sKey} /> )} @@ -1339,11 +1620,11 @@ function Status({ node?.closest?.( '.timeline-item, .timeline-item-alt, .status-link, .status-focus', ) || node; - rRef.current = nodeRef; - fRef.current = nodeRef; - dRef.current = nodeRef; - bRef.current = nodeRef; - xRef.current = nodeRef; + rRef(nodeRef); + fRef(nodeRef); + dRef(nodeRef); + bRef(nodeRef); + xRef(nodeRef); }} tabindex="-1" class={`status ${ @@ -1351,14 +1632,10 @@ function Status({ ? 'status-reply-to' : '' } visibility-${visibility} ${_pinned ? 'status-pinned' : ''} ${ - { - s: 'small', - m: 'medium', - l: 'large', - }[size] + SIZE_CLASS[size] } ${_deleted ? 'status-deleted' : ''} ${quoted ? 'status-card' : ''} ${ isContextMenuOpen ? 'status-menu-open' : '' - }`} + } ${mediaFirst && hasMediaAttachments ? 'status-media-first' : ''}`} onMouseEnter={debugHover} onContextMenu={(e) => { if (!showContextMenu) return; @@ -1437,8 +1714,8 @@ function Status({ > <StatusButton size="s" - title="Reply" - alt="Reply" + title={t`Reply`} + alt={t`Reply`} class="reply-button" icon="comment" iconSize="m" @@ -1447,8 +1724,8 @@ function Status({ <StatusButton size="s" checked={favourited} - title={['Like', 'Unlike']} - alt={['Like', 'Liked']} + title={[t`Like`, t`Unlike`]} + alt={[t`Like`, t`Liked`]} class="favourite-button" icon="heart" iconSize="m" @@ -1457,7 +1734,7 @@ function Status({ /> <button type="button" - title="More" + title={t`More`} class="plain more-button" onClick={(e) => { e.preventDefault(); @@ -1474,16 +1751,29 @@ function Status({ setIsContextMenuOpen('actions-bar'); }} > - <Icon icon="more2" size="m" alt="More" /> + <Icon icon="more2" size="m" alt={t`More`} /> </button> </div> )} {size !== 'l' && ( <div class="status-badge"> - {reblogged && <Icon class="reblog" icon="rocket" size="s" />} - {favourited && <Icon class="favourite" icon="heart" size="s" />} - {bookmarked && <Icon class="bookmark" icon="bookmark" size="s" />} - {_pinned && <Icon class="pin" icon="pin" size="s" />} + {reblogged && ( + <Icon class="reblog" icon="rocket" size="s" alt={t`Boosted`} /> + )} + {favourited && ( + <Icon class="favourite" icon="heart" size="s" alt={t`Liked`} /> + )} + {bookmarked && ( + <Icon + class="bookmark" + icon="bookmark" + size="s" + alt={t`Bookmarked`} + /> + )} + {_pinned && ( + <Icon class="pin" icon="pin" size="s" alt={t`Pinned`} /> + )} </div> )} {size !== 's' && ( @@ -1526,7 +1816,9 @@ function Status({ {/* </span> */}{' '} {size !== 'l' && (_deleted ? ( - <span class="status-deleted-tag">Deleted</span> + <span class="status-deleted-tag"> + <Trans>Deleted</Trans> + </span> ) : url && !previewMode && !readOnly && !quoted ? ( <Link to={instance ? `/${instance}/s/${id}` : `/s/${id}`} @@ -1563,20 +1855,27 @@ function Status({ <Icon icon="comment2" size="s" - alt={`${repliesCount} ${ - repliesCount === 1 ? 'reply' : 'replies' - }`} + // alt={`${repliesCount} ${ + // repliesCount === 1 ? 'reply' : 'replies' + // }`} + alt={plural(repliesCount, { + one: '# reply', + other: '# replies', + })} /> ) : ( - <Icon - icon={visibilityIconsMap[visibility]} - alt={visibilityText[visibility]} - size="s" - /> + visibility !== 'public' && + visibility !== 'direct' && ( + <Icon + icon={visibilityIconsMap[visibility]} + alt={_(visibilityText[visibility])} + size="s" + /> + ) )}{' '} <RelativeTime datetime={createdAtDate} format="micro" /> {!previewMode && !readOnly && ( - <Icon icon="more2" class="more" /> + <Icon icon="more2" class="more" alt={t`More`} /> )} </Link> ) : ( @@ -1623,18 +1922,24 @@ function Status({ // {StatusMenuItems} // </Menu> <span class="time"> - <Icon - icon={visibilityIconsMap[visibility]} - alt={visibilityText[visibility]} - size="s" - />{' '} + {visibility !== 'public' && visibility !== 'direct' && ( + <> + <Icon + icon={visibilityIconsMap[visibility]} + alt={_(visibilityText[visibility])} + size="s" + />{' '} + </> + )} <RelativeTime datetime={createdAtDate} format="micro" /> </span> ))} </div> {visibility === 'direct' && ( <> - <div class="status-direct-badge">Private mention</div>{' '} + <div class="status-direct-badge"> + <Trans>Private mention</Trans> + </div>{' '} </> )} {!withinContext && ( @@ -1642,10 +1947,12 @@ function Status({ {isThread ? ( <div class="status-thread-badge"> <Icon icon="thread" size="s" /> - Thread - {snapStates.statusThreadNumber[sKey] - ? ` ${snapStates.statusThreadNumber[sKey]}/X` - : ''} + <Trans> + Thread + {snapStates.statusThreadNumber[sKey] + ? ` ${snapStates.statusThreadNumber[sKey]}/X` + : ''} + </Trans> </div> ) : ( !!inReplyToId && @@ -1679,205 +1986,316 @@ function Status({ } } > - {!!spoilerText && ( + {mediaFirst && hasMediaAttachments ? ( <> - <div - class="content spoiler-content" - lang={language} - dir="auto" - ref={spoilerContentRef} - data-read-more={readMoreText} - > - <p> - <EmojiText text={spoilerText} emojis={emojis} /> - </p> - </div> - {readingExpandSpoilers || previewMode ? ( - <div class="spoiler-divider"> - <Icon icon="eye-open" /> Content warning + {(!!spoilerText || !!sensitive) && !readingExpandSpoilers && ( + <> + {!!spoilerText && ( + <span + class="spoiler-content media-first-spoiler-content" + lang={language} + dir="auto" + ref={spoilerContentRef} + data-read-more={_(readMoreText)} + > + <EmojiText text={spoilerText} emojis={emojis} />{' '} + </span> + )} + <button + class={`light spoiler-button media-first-spoiler-button ${ + showSpoiler ? 'spoiling' : '' + }`} + type="button" + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + if (showSpoiler) { + delete states.spoilers[id]; + if (!readingExpandSpoilers) { + delete states.spoilersMedia[id]; + } + } else { + states.spoilers[id] = true; + if (!readingExpandSpoilers) { + states.spoilersMedia[id] = true; + } + } + }} + > + <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '} + {showSpoiler ? t`Show less` : t`Show content`} + </button> + </> + )} + <MediaFirstContainer + mediaAttachments={mediaAttachments} + language={language} + postID={id} + instance={instance} + /> + {!!content && ( + <div class="media-first-content content" ref={contentRef}> + <PostContent + post={status} + instance={instance} + previewMode={previewMode} + /> </div> - ) : ( - <button - class={`light spoiler-button ${ - showSpoiler ? 'spoiling' : '' - }`} - type="button" - onClick={(e) => { - e.preventDefault(); - e.stopPropagation(); - if (showSpoiler) { - delete states.spoilers[id]; - if (!readingExpandSpoilers) { - delete states.spoilersMedia[id]; - } - } else { - states.spoilers[id] = true; - if (!readingExpandSpoilers) { - states.spoilersMedia[id] = true; - } - } - }} - > - <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '} - {showSpoiler ? 'Show less' : 'Show content'} - </button> )} </> - )} - {!!content && ( - <div - class="content" - ref={contentRef} - data-read-more={readMoreText} - > - <PostContent - post={status} - instance={instance} - previewMode={previewMode} - /> - <QuoteStatuses id={id} instance={instance} level={quoted} /> - </div> - )} - {!!poll && ( - <Poll - lang={language} - poll={poll} - readOnly={readOnly || !sameInstance || !authenticated} - onUpdate={(newPoll) => { - states.statuses[sKey].poll = newPoll; - }} - refresh={() => { - return masto.v1.polls - .$select(poll.id) - .fetch() - .then((pollResponse) => { - states.statuses[sKey].poll = pollResponse; - }) - .catch((e) => {}); // Silently fail - }} - votePoll={(choices) => { - return masto.v1.polls - .$select(poll.id) - .votes.create({ - choices, - }) - .then((pollResponse) => { - states.statuses[sKey].poll = pollResponse; - }) - .catch((e) => {}); // Silently fail - }} - /> - )} - {(((enableTranslate || inlineTranslate) && - !!content.trim() && - !!getHTMLText(emojifyText(content, emojis)) && - differentLanguage) || - forceTranslate) && ( - <TranslationBlock - forceTranslate={forceTranslate || inlineTranslate} - mini={!isSizeLarge && !withinContext} - sourceLanguage={language} - text={getPostText(status)} - /> - )} - {!previewMode && - sensitive && - !!mediaAttachments.length && - readingExpandMedia !== 'show_all' && ( - <button - class={`plain spoiler-media-button ${ - showSpoilerMedia ? 'spoiling' : '' - }`} - type="button" - hidden={!readingExpandSpoilers && !!spoilerText} - onClick={(e) => { - e.preventDefault(); - e.stopPropagation(); - if (showSpoilerMedia) { - delete states.spoilersMedia[id]; - } else { - states.spoilersMedia[id] = true; - } - }} - > - <Icon icon={showSpoilerMedia ? 'eye-open' : 'eye-close'} />{' '} - {showSpoilerMedia ? 'Show less' : 'Show media'} - </button> - )} - {!!mediaAttachments.length && ( - <MultipleMediaFigure - lang={language} - enabled={showMultipleMediaCaptions} - captionChildren={captionChildren} - > - <div - ref={mediaContainerRef} - class={`media-container media-eq${mediaAttachments.length} ${ - mediaAttachments.length > 2 ? 'media-gt2' : '' - } ${mediaAttachments.length > 4 ? 'media-gt4' : ''}`} - > - {displayedMediaAttachments.map((media, i) => ( - <Media - key={media.id} - media={media} - autoAnimate={isSizeLarge} - showCaption={mediaAttachments.length === 1} - allowLongerCaption={!content} + ) : ( + <> + {!!spoilerText && ( + <> + <div + class="content spoiler-content" lang={language} - altIndex={ - showMultipleMediaCaptions && - !!media.description && - i + 1 - } - to={`/${instance}/s/${id}?${ - withinContext ? 'media' : 'media-only' - }=${i + 1}`} - onClick={ - onMediaClick - ? (e) => { - onMediaClick(e, i, media, status); + dir="auto" + ref={spoilerContentRef} + data-read-more={_(readMoreText)} + > + <p> + <EmojiText text={spoilerText} emojis={emojis} /> + </p> + </div> + {readingExpandSpoilers || previewMode ? ( + <div class="spoiler-divider"> + <Icon icon="eye-open" /> <Trans>Content warning</Trans> + </div> + ) : ( + <button + class={`light spoiler-button ${ + showSpoiler ? 'spoiling' : '' + }`} + type="button" + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + if (showSpoiler) { + delete states.spoilers[id]; + if (!readingExpandSpoilers) { + delete states.spoilersMedia[id]; } - : undefined - } + } else { + states.spoilers[id] = true; + if (!readingExpandSpoilers) { + states.spoilersMedia[id] = true; + } + } + }} + > + <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '} + {showSpoiler ? t`Show less` : t`Show content`} + </button> + )} + </> + )} + {!!content && ( + <div + class="content" + ref={contentRef} + data-read-more={_(readMoreText)} + inert={!!spoilerText && !showSpoiler ? true : undefined} + > + <PostContent + post={status} + instance={instance} + previewMode={previewMode} /> + <QuoteStatuses id={id} instance={instance} level={quoted} /> + </div> + )} + {!!poll && ( + <Poll + lang={language} + poll={poll} + readOnly={readOnly || !sameInstance || !authenticated} + onUpdate={(newPoll) => { + states.statuses[sKey].poll = newPoll; + }} + refresh={() => { + return masto.v1.polls + .$select(poll.id) + .fetch() + .then((pollResponse) => { + states.statuses[sKey].poll = pollResponse; + }) + .catch((e) => {}); // Silently fail + }} + votePoll={(choices) => { + return masto.v1.polls + .$select(poll.id) + .votes.create({ + choices, + }) + .then((pollResponse) => { + states.statuses[sKey].poll = pollResponse; + }) + .catch((e) => {}); // Silently fail + }} + /> + )} + {(((enableTranslate || inlineTranslate) && + isTranslateble(content) && + differentLanguage) || + forceTranslate) && ( + <TranslationBlock + forceTranslate={forceTranslate || inlineTranslate} + mini={!isSizeLarge && !withinContext} + sourceLanguage={language} + autoDetected={languageAutoDetected} + text={getPostText(status)} + /> + )} + {!previewMode && + sensitive && + !!mediaAttachments.length && + readingExpandMedia !== 'show_all' && ( + <button + class={`plain spoiler-media-button ${ + showSpoilerMedia ? 'spoiling' : '' + }`} + type="button" + hidden={!readingExpandSpoilers && !!spoilerText} + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + if (showSpoilerMedia) { + delete states.spoilersMedia[id]; + } else { + states.spoilersMedia[id] = true; + } + }} + > + <Icon + icon={showSpoilerMedia ? 'eye-open' : 'eye-close'} + />{' '} + {showSpoilerMedia ? t`Show less` : t`Show media`} + </button> + )} + {!!mediaAttachments.length && + (mediaAttachments.length > 1 && + (isSizeLarge || (withinContext && size === 'm')) ? ( + <div class="media-large-container"> + {mediaAttachments.map((media, i) => ( + <div key={media.id} class={`media-container media-eq1`}> + <Media + media={media} + autoAnimate + showCaption + allowLongerCaption={!content} + lang={language} + to={`/${instance}/s/${id}?${ + withinContext ? 'media' : 'media-only' + }=${i + 1}`} + onClick={ + onMediaClick + ? (e) => onMediaClick(e, i, media, status) + : undefined + } + /> + </div> + ))} + </div> + ) : ( + <MultipleMediaFigure + lang={language} + enabled={showMultipleMediaCaptions} + captionChildren={captionChildren} + > + <div + ref={mediaContainerRef} + class={`media-container media-eq${ + mediaAttachments.length + } ${mediaAttachments.length > 2 ? 'media-gt2' : ''} ${ + mediaAttachments.length > 4 ? 'media-gt4' : '' + }`} + > + {displayedMediaAttachments.map((media, i) => ( + <Media + key={media.id} + media={media} + autoAnimate={isSizeLarge} + showCaption={mediaAttachments.length === 1} + allowLongerCaption={ + !content && mediaAttachments.length === 1 + } + lang={language} + altIndex={ + showMultipleMediaCaptions && + !!media.description && + i + 1 + } + to={`/${instance}/s/${id}?${ + withinContext ? 'media' : 'media-only' + }=${i + 1}`} + onClick={ + onMediaClick + ? (e) => { + onMediaClick(e, i, media, status); + } + : undefined + } + checkAspectRatio={mediaAttachments.length === 1} + /> + ))} + </div> + </MultipleMediaFigure> ))} - </div> - </MultipleMediaFigure> + {!!card && + /^https/i.test(card?.url) && + !sensitive && + !spoilerText && + !poll && + !mediaAttachments.length && + !snapStates.statusQuotes[sKey] && ( + <Card + card={card} + selfReferential={ + card?.url === status.url || card?.url === status.uri + } + selfAuthor={card?.authors?.some( + (a) => a.account?.url === accountURL, + )} + instance={currentInstance} + /> + )} + </> )} - {!!card && - /^https/i.test(card?.url) && - !sensitive && - !spoilerText && - !poll && - !mediaAttachments.length && - !snapStates.statusQuotes[sKey] && ( - <Card - card={card} - selfReferential={ - card?.url === status.url || card?.url === status.uri - } - instance={currentInstance} - /> - )} </div> {!isSizeLarge && showCommentCount && ( <div class="content-comment-hint insignificant"> - <Icon icon="comment2" alt="Replies" /> {repliesCount} + <Icon icon="comment2" alt={t`Replies`} /> {repliesCount} </div> )} {isSizeLarge && ( <> <div class="extra-meta"> {_deleted ? ( - <span class="status-deleted-tag">Deleted</span> + <span class="status-deleted-tag"> + <Trans>Deleted</Trans> + </span> ) : ( <> {/* <Icon icon={visibilityIconsMap[visibility]} alt={visibilityText[visibility]} /> */} - <span>{visibilityText[visibility]}</span> •{' '} + <span>{_(visibilityText[visibility])}</span> •{' '} <a href={url} target="_blank" rel="noopener noreferrer"> + { + // within a day + new Date().getTime() - createdAtDate.getTime() < + 86400000 && ( + <> + <RelativeTime + datetime={createdAtDate} + format="micro" + />{' '} + ‒{' '} + </> + ) + } <time class="created" datetime={createdAtDate.toISOString()} @@ -1889,7 +2307,7 @@ function Status({ {editedAt && ( <> {' '} - • <Icon icon="pencil" alt="Edited" />{' '} + • <Icon icon="pencil" alt={t`Edited`} />{' '} <time tabIndex="0" class="edited" @@ -1905,11 +2323,68 @@ function Status({ </> )} </div> + {!!emojiReactions?.length && ( + <div class="emoji-reactions"> + {emojiReactions.map((emojiReaction) => { + const { name, count, me, url, staticUrl } = emojiReaction; + if (url) { + // Some servers return url and staticUrl + return ( + <span + class={`emoji-reaction tag ${ + me ? '' : 'insignificant' + }`} + > + <CustomEmoji + alt={name} + url={url} + staticUrl={staticUrl} + />{' '} + {count} + </span> + ); + } + const isShortCode = /^:.+?:$/.test(name); + if (isShortCode) { + const emoji = emojis.find( + (e) => + e.shortcode === + name.replace(/^:/, '').replace(/:$/, ''), + ); + if (emoji) { + return ( + <span + class={`emoji-reaction tag ${ + me ? '' : 'insignificant' + }`} + > + <CustomEmoji + alt={name} + url={emoji.url} + staticUrl={emoji.staticUrl} + />{' '} + {count} + </span> + ); + } + } + return ( + <span + class={`emoji-reaction tag ${ + me ? '' : 'insignificant' + }`} + > + {name} {count} + </span> + ); + })} + </div> + )} <div class={`actions ${_deleted ? 'disabled' : ''}`}> <div class="action has-count"> <StatusButton - title="Reply" - alt="Comments" + title={t`Reply`} + alt={t`Comments`} class="reply-button" icon="comment" count={repliesCount} @@ -1928,73 +2403,77 @@ function Status({ disabled={!canBoost} /> </div> */} - <MenuConfirm - disabled={!canBoost} - onClick={confirmBoostStatus} - confirmLabel={ - <> - <Icon icon="rocket" /> - <span>{reblogged ? 'Unboost' : 'Boost'}</span> - </> - } - menuExtras={ - <MenuItem - onClick={() => { - states.showCompose = { - draftStatus: { - status: `\n${url}`, - }, - }; - }} - > - <Icon icon="quote" /> - <span>Quote</span> - </MenuItem> - } - menuFooter={ - mediaNoDesc && - !reblogged && ( - <div class="footer"> - <Icon icon="alert" /> - Some media have no descriptions. - </div> - ) - } - > - <div class="action has-count"> + <div class="action has-count"> + <MenuConfirm + disabled={!canBoost} + onClick={confirmBoostStatus} + confirmLabel={ + <> + <Icon icon="rocket" /> + <span>{reblogged ? t`Unboost` : t`Boost`}</span> + </> + } + menuExtras={ + <MenuItem + onClick={() => { + showCompose({ + draftStatus: { + status: `\n${url}`, + }, + }); + }} + > + <Icon icon="quote" /> + <span> + <Trans>Quote</Trans> + </span> + </MenuItem> + } + menuFooter={ + mediaNoDesc && + !reblogged && ( + <div class="footer"> + <Icon icon="alert" /> + <Trans>Some media have no descriptions.</Trans> + </div> + ) + } + > <StatusButton checked={reblogged} - title={['Boost', 'Unboost']} - alt={['Boost', 'Boosted']} + title={[t`Boost`, t`Unboost`]} + alt={[t`Boost`, t`Boosted`]} class="reblog-button" icon="rocket" count={reblogsCount} // onClick={boostStatus} disabled={!canBoost} /> - </div> - </MenuConfirm> + </MenuConfirm> + </div> <div class="action has-count"> <StatusButton checked={favourited} - title={['Like', 'Unlike']} - alt={['Like', 'Liked']} + title={[t`Like`, t`Unlike`]} + alt={[t`Like`, t`Liked`]} class="favourite-button" icon="heart" count={favouritesCount} onClick={favouriteStatus} /> </div> - <div class="action"> - <StatusButton - checked={bookmarked} - title={['Bookmark', 'Unbookmark']} - alt={['Bookmark', 'Bookmarked']} - class="bookmark-button" - icon="bookmark" - onClick={bookmarkStatus} - /> - </div> + {supports('@mastodon/post-bookmark') && ( + <div class="action"> + <StatusButton + checked={bookmarked} + title={[t`Bookmark`, t`Unbookmark`]} + alt={[t`Bookmark`, t`Bookmarked`]} + class="bookmark-button" + icon="bookmark" + onClick={bookmarkStatus} + /> + </div> + )} <Menu2 portal={{ target: @@ -2008,10 +2487,10 @@ function Status({ <div class="action"> <button type="button" - title="More" + title={t`More`} class="plain more-button" > - <Icon icon="more" size="l" alt="More" /> + <Icon icon="more" size="l" alt={t`More`} /> </button> </div> } @@ -2062,7 +2541,7 @@ function Status({ </Modal> )} </article> - </> + </StatusParent> ); } @@ -2079,7 +2558,151 @@ function MultipleMediaFigure(props) { ); } -function Card({ card, selfReferential, instance }) { +function MediaFirstContainer(props) { + const { mediaAttachments, language, postID, instance } = props; + const moreThanOne = mediaAttachments.length > 1; + + const carouselRef = useRef(); + const [currentIndex, setCurrentIndex] = useState(0); + + useEffect(() => { + let handleScroll = () => { + const { clientWidth, scrollLeft } = carouselRef.current; + const index = Math.round(Math.abs(scrollLeft) / clientWidth); + setCurrentIndex(index); + }; + if (carouselRef.current) { + carouselRef.current.addEventListener('scroll', handleScroll, { + passive: true, + }); + } + return () => { + if (carouselRef.current) { + carouselRef.current.removeEventListener('scroll', handleScroll); + } + }; + }, []); + + return ( + <> + <div class="media-first-container"> + <div class="media-first-carousel" ref={carouselRef}> + {mediaAttachments.map((media, i) => ( + <div class="media-first-item" key={media.id}> + <Media + media={media} + lang={language} + to={`/${instance}/s/${postID}?media=${i + 1}`} + /> + </div> + ))} + </div> + {moreThanOne && ( + <div class="media-carousel-controls"> + <div class="carousel-indexer"> + {currentIndex + 1}/{mediaAttachments.length} + </div> + <label class="media-carousel-button"> + <button + type="button" + class="carousel-button" + hidden={currentIndex === 0} + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + carouselRef.current.focus(); + carouselRef.current.scrollTo({ + left: + carouselRef.current.clientWidth * + (currentIndex - 1) * + (isRTL() ? -1 : 1), + behavior: 'smooth', + }); + }} + > + <Icon icon="arrow-left" /> + </button> + </label> + <label class="media-carousel-button"> + <button + type="button" + class="carousel-button" + hidden={currentIndex === mediaAttachments.length - 1} + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + carouselRef.current.focus(); + carouselRef.current.scrollTo({ + left: + carouselRef.current.clientWidth * + (currentIndex + 1) * + (isRTL() ? -1 : 1), + behavior: 'smooth', + }); + }} + > + <Icon icon="arrow-right" /> + </button> + </label> + </div> + )} + </div> + {moreThanOne && ( + <div + class="media-carousel-dots" + style={{ + '--dots-count': mediaAttachments.length, + }} + > + {mediaAttachments.map((media, i) => ( + <span + key={media.id} + class={`carousel-dot ${i === currentIndex ? 'active' : ''}`} + /> + ))} + </div> + )} + </> + ); +} + +function getDomain(url) { + return punycode.toUnicode( + URL.parse(url) + .hostname.replace(/^www\./, '') + .replace(/\/$/, ''), + ); +} + +// "Post": Quote post + card link preview combo +// Assume all links from these domains are "posts" +// Mastodon links are "posts" too but they are converted to real quote posts and there's too many domains to check +// This is just "Progressive Enhancement" +function isCardPost(domain) { + return ['x.com', 'twitter.com', 'threads.net', 'bsky.app'].includes(domain); +} + +function Byline({ authors, hidden, children }) { + if (hidden) return children; + if (!authors?.[0]?.account?.id) return children; + const author = authors[0].account; + + return ( + <div class="card-byline"> + {children} + <div class="card-byline-author"> + <Icon icon="link" size="s" />{' '} + <small> + <Trans comment="More from [Author]"> + More from <NameText account={author} showAvatar /> + </Trans> + </small> + </div> + </div> + ); +} + +function Card({ card, selfReferential, selfAuthor, instance }) { const snapStates = useSnapshot(states); const { blurhash, @@ -2099,6 +2722,7 @@ function Card({ card, selfReferential, instance }) { embedUrl, language, publishedAt, + authors, } = card; /* type @@ -2156,69 +2780,103 @@ function Card({ card, selfReferential, instance }) { [hasIframeHTML], ); + const [blurhashImage, setBlurhashImage] = useState(null); if (hasText && (image || (type === 'photo' && blurhash))) { - const domain = new URL(url).hostname - .replace(/^www\./, '') - .replace(/\/$/, ''); - let blurhashImage; + const domain = getDomain(url); const rgbAverageColor = image && blurhash ? getBlurHashAverageColor(blurhash) : null; if (!image) { const w = 44; const h = 44; const blurhashPixels = decodeBlurHash(blurhash, w, h); - const canvas = document.createElement('canvas'); + const canvas = window.OffscreenCanvas + ? new OffscreenCanvas(1, 1) + : document.createElement('canvas'); canvas.width = w; canvas.height = h; const ctx = canvas.getContext('2d'); + ctx.imageSmoothingEnabled = false; const imageData = ctx.createImageData(w, h); imageData.data.set(blurhashPixels); ctx.putImageData(imageData, 0, 0); - blurhashImage = canvas.toDataURL(); + try { + if (window.OffscreenCanvas) { + canvas.convertToBlob().then((blob) => { + setBlurhashImage(URL.createObjectURL(blob)); + }); + } else { + setBlurhashImage(canvas.toDataURL()); + } + } catch (e) { + // Silently fail + console.error(e); + } } + + const isPost = isCardPost(domain); + return ( - <a - href={cardStatusURL || url} - target={cardStatusURL ? null : '_blank'} - rel="nofollow noopener noreferrer" - class={`card link ${blurhashImage ? '' : size}`} - lang={language} - dir="auto" - style={{ - '--average-color': - rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`, - }} - onClick={handleClick} - > - <div class="card-image"> - <img - src={image || blurhashImage} - width={width} - height={height} - loading="lazy" - alt={imageDescription || ''} - onError={(e) => { - try { - e.target.style.display = 'none'; - } catch (e) {} - }} - /> - </div> - <div class="meta-container"> - <p class="meta domain" dir="auto"> - {domain} - </p> - <p class="title" dir="auto"> - {title} - </p> - <p class="meta" dir="auto"> - {description || - (!!publishedAt && ( - <RelativeTime datetime={publishedAt} format="micro" /> - ))} - </p> - </div> - </a> + <Byline hidden={!!selfAuthor} authors={authors}> + <a + href={cardStatusURL || url} + target={cardStatusURL ? null : '_blank'} + rel="nofollow noopener noreferrer" + class={`card link ${isPost ? 'card-post' : ''} ${ + blurhashImage ? '' : size + }`} + style={{ + '--average-color': + rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`, + }} + onClick={handleClick} + > + <div class="card-image"> + <img + src={image || blurhashImage} + width={width} + height={height} + loading="lazy" + decoding="async" + fetchPriority="low" + alt={imageDescription || ''} + onError={(e) => { + try { + e.target.style.display = 'none'; + } catch (e) {} + }} + style={{ + '--anim-duration': + width && + height && + `${Math.min( + Math.max(Math.max(width, height) / 100, 5), + 120, + )}s`, + }} + /> + </div> + <div class="meta-container" lang={language}> + <p class="meta domain"> + <span class="domain">{domain}</span>{' '} + {!!publishedAt && <>· </>} + {!!publishedAt && ( + <> + <RelativeTime datetime={publishedAt} format="micro" /> + </> + )} + </p> + <p class="title" dir="auto" title={title}> + {title} + </p> + <p class="meta" dir="auto" title={description}> + {description || + (!!publishedAt && ( + <RelativeTime datetime={publishedAt} format="micro" /> + ))} + </p> + </div> + </a> + </Byline> ); } else if (type === 'photo') { return ( @@ -2250,7 +2908,7 @@ function Card({ card, selfReferential, instance }) { if (videoID) { return ( <a class="card video" onClick={handleClick}> - <lite-youtube videoid={videoID} nocookie></lite-youtube> + <lite-youtube videoid={videoID} nocookie autoPause></lite-youtube> </a> ); } @@ -2266,22 +2924,36 @@ function Card({ card, selfReferential, instance }) { // ); } if (hasText && !image) { - const domain = new URL(url).hostname.replace(/^www\./, ''); + const domain = getDomain(url); + const isPost = isCardPost(domain); return ( <a href={cardStatusURL || url} target={cardStatusURL ? null : '_blank'} rel="nofollow noopener noreferrer" - class={`card link no-image`} + class={`card link ${isPost ? 'card-post' : ''} no-image`} lang={language} + dir="auto" onClick={handleClick} > <div class="meta-container"> <p class="meta domain"> - <Icon icon="link" size="s" /> <span>{domain}</span> + <span class="domain"> + <Icon icon="link" size="s" /> <span>{domain}</span> + </span>{' '} + {!!publishedAt && <>· </>} + {!!publishedAt && ( + <> + <RelativeTime datetime={publishedAt} format="micro" /> + </> + )} + </p> + <p class="title" title={title}> + {title} + </p> + <p class="meta" title={description || providerName || authorName}> + {description || providerName || authorName} </p> - <p class="title">{title}</p> - <p class="meta">{description || providerName || authorName}</p> </div> </a> ); @@ -2317,15 +2989,21 @@ function EditedAtModal({ <div id="edit-history" class="sheet"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <h2>Edit History</h2> - {uiState === 'error' && <p>Failed to load history</p>} + <h2> + <Trans>Edit History</Trans> + </h2> + {uiState === 'error' && ( + <p> + <Trans>Failed to load history</Trans> + </p> + )} {uiState === 'loading' && ( <p> - <Loader abrupt /> Loading… + <Loader abrupt /> <Trans>Loading…</Trans> </p> )} </header> @@ -2454,7 +3132,7 @@ function generateHTMLCode(post, instance, level = 0) { const mediaURL = previewMediaURL || sourceMediaURL; const sourceMediaURLObj = sourceMediaURL - ? new URL(sourceMediaURL) + ? URL.parse(sourceMediaURL) : null; const isVideoMaybe = type === 'unknown' && @@ -2489,8 +3167,8 @@ function generateHTMLCode(post, instance, level = 0) { } else { mediaHTML = ` <a href="${sourceMediaURL}">📄 ${ - description || sourceMediaURL - }</a> + description || sourceMediaURL + }</a> `; } @@ -2500,7 +3178,7 @@ function generateHTMLCode(post, instance, level = 0) { : ''); const htmlCode = ` - <blockquote lang="${language}" cite="${url}"> + <blockquote lang="${language}" cite="${url}" data-source="fediverse"> ${ spoilerText ? ` @@ -2550,20 +3228,25 @@ function EmbedModal({ post, instance, onClose }) { <div id="embed-post" class="sheet"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <h2>Embed post</h2> + <h2> + <Trans>Embed post</Trans> + </h2> </header> <main tabIndex="-1"> - <h3>HTML Code</h3> + <h3> + <Trans>HTML Code</Trans> + </h3> <textarea class="embed-code" readonly onClick={(e) => { e.target.select(); }} + dir="auto" > {htmlCode} </textarea> @@ -2572,18 +3255,23 @@ function EmbedModal({ post, instance, onClose }) { onClick={() => { try { navigator.clipboard.writeText(htmlCode); - showToast('HTML code copied'); + showToast(t`HTML code copied`); } catch (e) { console.error(e); - showToast('Unable to copy HTML code'); + showToast(t`Unable to copy HTML code`); } }} > - <Icon icon="clipboard" /> <span>Copy</span> + <Icon icon="clipboard" />{' '} + <span> + <Trans>Copy</Trans> + </span> </button> {!!mediaAttachments?.length && ( <section> - <p>Media attachments:</p> + <p> + <Trans>Media attachments:</Trans> + </p> <ol class="links-list"> {mediaAttachments.map((media) => { return ( @@ -2603,7 +3291,9 @@ function EmbedModal({ post, instance, onClose }) { )} {!!accountEmojis?.length && ( <section> - <p>Account Emojis:</p> + <p> + <Trans>Account Emojis:</Trans> + </p> <ul> {accountEmojis.map((emoji) => { return ( @@ -2625,7 +3315,7 @@ function EmbedModal({ post, instance, onClose }) { </picture>{' '} <code>:{emoji.shortcode}:</code> ( <a href={emoji.url} target="_blank" download> - url + URL </a> ) {emoji.staticUrl ? ( @@ -2633,7 +3323,7 @@ function EmbedModal({ post, instance, onClose }) { {' '} ( <a href={emoji.staticUrl} target="_blank" download> - static + <Trans>static URL</Trans> </a> ) </> @@ -2646,7 +3336,9 @@ function EmbedModal({ post, instance, onClose }) { )} {!!emojis?.length && ( <section> - <p>Emojis:</p> + <p> + <Trans>Emojis:</Trans> + </p> <ul> {emojis.map((emoji) => { return ( @@ -2668,7 +3360,7 @@ function EmbedModal({ post, instance, onClose }) { </picture>{' '} <code>:{emoji.shortcode}:</code> ( <a href={emoji.url} target="_blank" download> - url + URL </a> ) {emoji.staticUrl ? ( @@ -2676,7 +3368,7 @@ function EmbedModal({ post, instance, onClose }) { {' '} ( <a href={emoji.staticUrl} target="_blank" download> - static + <Trans>static URL</Trans> </a> ) </> @@ -2689,48 +3381,64 @@ function EmbedModal({ post, instance, onClose }) { )} <section> <small> - <p>Notes:</p> + <p> + <Trans>Notes:</Trans> + </p> <ul> <li> - This is static, unstyled and scriptless. You may need to apply - your own styles and edit as needed. + <Trans> + This is static, unstyled and scriptless. You may need to apply + your own styles and edit as needed. + </Trans> </li> <li> - Polls are not interactive, becomes a list with vote counts. + <Trans> + Polls are not interactive, becomes a list with vote counts. + </Trans> </li> <li> - Media attachments can be images, videos, audios or any file - types. + <Trans> + Media attachments can be images, videos, audios or any file + types. + </Trans> + </li> + <li> + <Trans>Post could be edited or deleted later.</Trans> </li> - <li>Post could be edited or deleted later.</li> </ul> </small> </section> - <h3>Preview</h3> + <h3> + <Trans>Preview</Trans> + </h3> <output class="embed-preview" dangerouslySetInnerHTML={{ __html: htmlCode }} + dir="auto" /> <p> - <small>Note: This preview is lightly styled.</small> + <small> + <Trans>Note: This preview is lightly styled.</Trans> + </small> </p> </main> </div> ); } -function StatusButton({ - checked, - count, - class: className, - title, - alt, - size, - icon, - iconSize = 'l', - onClick, - ...props -}) { +const StatusButton = forwardRef((props, ref) => { + let { + checked, + count, + class: className, + title, + alt, + size, + icon, + iconSize = 'l', + onClick, + ...otherProps + } = props; if (typeof title === 'string') { title = [title, title]; } @@ -2753,6 +3461,7 @@ function StatusButton({ return ( <button + ref={ref} type="button" title={buttonTitle} class={`plain ${size ? 'small' : ''} ${className} ${ @@ -2764,7 +3473,7 @@ function StatusButton({ e.stopPropagation(); onClick(e); }} - {...props} + {...otherProps} > <Icon icon={icon} size={iconSize} alt={iconAlt} /> {!!count && ( @@ -2775,33 +3484,18 @@ function StatusButton({ )} </button> ); -} - -export function formatDuration(time) { - if (!time) return; - let hours = Math.floor(time / 3600); - let minutes = Math.floor((time % 3600) / 60); - let seconds = Math.round(time % 60); - - if (hours === 0) { - return `${minutes}:${seconds.toString().padStart(2, '0')}`; - } else { - return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds - .toString() - .padStart(2, '0')}`; - } -} +}); function nicePostURL(url) { if (!url) return; - const urlObj = new URL(url); + const urlObj = URL.parse(url); const { host, pathname } = urlObj; const path = pathname.replace(/\/$/, ''); // split only first slash const [_, username, restPath] = path.match(/\/(@[^\/]+)\/(.*)/) || []; return ( <> - {host} + {punycode.toUnicode(host)} {username ? ( <> /{username} @@ -2827,7 +3521,7 @@ function StatusCompact({ sKey }) { const { sensitive, spoilerText, - account: { avatar, avatarStatic, bot }, + account: { avatar, avatarStatic, bot } = {}, visibility, content, language, @@ -2863,7 +3557,9 @@ function StatusCompact({ sKey }) { > {filterInfo ? ( <b class="status-filtered-badge badge-meta" title={filterTitleStr}> - <span>Filtered</span> + <span> + <Trans>Filtered</Trans> + </span> <span>{filterTitleStr}</span> </b> ) : ( @@ -2880,7 +3576,9 @@ function FilteredStatus({ instance, containerProps = {}, showFollowedTags, + quoted, }) { + const { _ } = useLingui(); const snapStates = useSnapshot(states); const { id: statusID, @@ -2924,13 +3622,15 @@ function FilteredStatus({ return ( <div class={ - isReblog - ? group - ? 'status-group' - : 'status-reblog' - : isFollowedTags - ? 'status-followed-tags' - : '' + quoted + ? '' + : isReblog + ? group + ? 'status-group' + : 'status-reblog' + : isFollowedTags + ? 'status-followed-tags' + : '' } {...containerProps} // title={statusPeekText} @@ -2940,7 +3640,11 @@ function FilteredStatus({ }} {...bindLongPressPeek()} > - <article data-state-post-id={ssKey} class="status filtered" tabindex="-1"> + <article + data-state-post-id={ssKey} + class={`status filtered ${quoted ? 'status-card' : ''}`} + tabindex="-1" + > <b class="status-filtered-badge clickable badge-meta" title={filterTitleStr} @@ -2949,30 +3653,52 @@ function FilteredStatus({ setShowPeek(true); }} > - <span>Filtered</span> + <span> + <Trans>Filtered</Trans> + </span> <span>{filterTitleStr}</span> </b>{' '} <Avatar url={avatarStatic || avatar} squircle={bot} /> <span class="status-filtered-info"> <span class="status-filtered-info-1"> - <NameText account={status.account} instance={instance} />{' '} - <Icon - icon={visibilityIconsMap[visibility]} - alt={visibilityText[visibility]} - size="s" - />{' '} {isReblog ? ( - 'boosted' + <Trans comment="[Name] [Visibility icon] boosted"> + <NameText account={status.account} instance={instance} />{' '} + <Icon + icon={visibilityIconsMap[visibility]} + alt={_(visibilityText[visibility])} + size="s" + />{' '} + boosted + </Trans> ) : isFollowedTags ? ( - <span> - {snapStates.statusFollowedTags[sKey].slice(0, 3).map((tag) => ( - <span key={tag} class="status-followed-tag-item"> - #{tag} - </span> - ))} - </span> + <> + <NameText account={status.account} instance={instance} />{' '} + <Icon + icon={visibilityIconsMap[visibility]} + alt={_(visibilityText[visibility])} + size="s" + />{' '} + <span> + {snapStates.statusFollowedTags[sKey] + .slice(0, 3) + .map((tag) => ( + <span key={tag} class="status-followed-tag-item"> + #{tag} + </span> + ))} + </span> + </> ) : ( - <RelativeTime datetime={createdAtDate} format="micro" /> + <> + <NameText account={status.account} instance={instance} />{' '} + <Icon + icon={visibilityIconsMap[visibility]} + alt={_(visibilityText[visibility])} + size="s" + />{' '} + <RelativeTime datetime={createdAtDate} format="micro" /> + </> )} </span> <span class="status-filtered-info-2"> @@ -3002,10 +3728,13 @@ function FilteredStatus({ class="sheet-close" onClick={() => setShowPeek(false)} > - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> <header> - <b class="status-filtered-badge">Filtered</b> {filterTitleStr} + <b class="status-filtered-badge"> + <Trans>Filtered</Trans> + </b>{' '} + {filterTitleStr} </header> <main tabIndex="-1"> <Link @@ -3015,7 +3744,7 @@ function FilteredStatus({ onClick={() => { setShowPeek(false); }} - data-read-more="Read more →" + data-read-more={_(readMoreText)} > <Status status={status} instance={instance} size="s" readOnly /> </Link> @@ -3029,6 +3758,7 @@ function FilteredStatus({ const QuoteStatuses = memo(({ id, instance, level = 0 }) => { if (!id || !instance) return; + const { _ } = useLingui(); const snapStates = useSnapshot(states); const sKey = statusKey(id, instance); const quotes = snapStates.statusQuotes[sKey]; @@ -3041,20 +3771,22 @@ const QuoteStatuses = memo(({ id, instance, level = 0 }) => { return uniqueQuotes.map((q) => { return ( - <Link - key={q.instance + q.id} - to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`} - class="status-card-link" - data-read-more="Read more →" - > - <Status - statusID={q.id} - instance={q.instance} - size="s" - quoted={level + 1} - enableCommentHint - /> - </Link> + <LazyShazam id={q.instance + q.id}> + <Link + key={q.instance + q.id} + to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`} + class="status-card-link" + data-read-more={_(readMoreText)} + > + <Status + statusID={q.id} + instance={q.instance} + size="s" + quoted={level + 1} + enableCommentHint + /> + </Link> + </LazyShazam> ); }); }); diff --git a/src/components/submenu2.jsx b/src/components/submenu2.jsx new file mode 100644 index 00000000..8922ac7d --- /dev/null +++ b/src/components/submenu2.jsx @@ -0,0 +1,26 @@ +import { SubMenu } from '@szhsin/react-menu'; +import { useRef } from 'preact/hooks'; + +export default function SubMenu2(props) { + const menuRef = useRef(); + return ( + <SubMenu + {...props} + instanceRef={menuRef} + // Test fix for bug; submenus not opening on Android + itemProps={{ + onPointerMove: (e) => { + if (e.pointerType === 'touch') { + menuRef.current?.openMenu?.(); + } + }, + onPointerLeave: (e) => { + if (e.pointerType === 'touch') { + menuRef.current?.openMenu?.(); + } + }, + ...props.itemProps, + }} + /> + ); +} diff --git a/src/components/timeline.jsx b/src/components/timeline.jsx index f7b48b70..978763bb 100644 --- a/src/components/timeline.jsx +++ b/src/components/timeline.jsx @@ -1,5 +1,12 @@ +import { plural, t, Trans } from '@lingui/macro'; import { memo } from 'preact/compat'; -import { useCallback, useEffect, useRef, useState } from 'preact/hooks'; +import { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; import { InView } from 'react-intersection-observer'; import { useDebouncedCallback } from 'use-debounce'; @@ -7,8 +14,11 @@ import { useSnapshot } from 'valtio'; import FilterContext from '../utils/filter-context'; import { filteredItems, isFiltered } from '../utils/filters'; +import isRTL from '../utils/is-rtl'; +import showToast from '../utils/show-toast'; import states, { statusKey } from '../utils/states'; import statusPeek from '../utils/status-peek'; +import { isMediaFirstInstance } from '../utils/store-utils'; import { groupBoosts, groupContext } from '../utils/timeline-utils'; import useInterval from '../utils/useInterval'; import usePageVisibility from '../utils/usePageVisibility'; @@ -48,26 +58,33 @@ function Timeline({ filterContext, showFollowedTags, showReplyParent, + clearWhenRefresh, }) { const snapStates = useSnapshot(states); const [items, setItems] = useState([]); - const [uiState, setUIState] = useState('default'); + const [uiState, setUIState] = useState('start'); const [showMore, setShowMore] = useState(false); const [showNew, setShowNew] = useState(false); const [visible, setVisible] = useState(true); const scrollableRef = useRef(); console.debug('RENDER Timeline', id, refresh); + __BENCHMARK.start(`timeline-${id}-load`); + + const mediaFirst = useMemo(() => isMediaFirstInstance(), []); const allowGrouping = view !== 'media'; + const loadItemsTS = useRef(0); // Ensures only one loadItems at a time const loadItems = useDebouncedCallback( (firstLoad) => { setShowNew(false); - if (uiState === 'loading') return; + // if (uiState === 'loading') return; setUIState('loading'); (async () => { try { + const ts = (loadItemsTS.current = Date.now()); let { done, value } = await fetchItems(firstLoad); + if (ts !== loadItemsTS.current) return; if (Array.isArray(value)) { // Avoid grouping for pinned posts const [pinnedPosts, otherPosts] = value.reduce( @@ -103,18 +120,22 @@ function Timeline({ setShowMore(false); } setUIState('default'); + __BENCHMARK.end(`timeline-${id}-load`); } catch (e) { console.error(e); setUIState('error'); + if (firstLoad && !items.length && errorText) { + showToast(errorText); + } } finally { loadItems.cancel(); } })(); }, - 1500, + 1_000, { leading: true, - trailing: false, + // trailing: false, }, ); @@ -200,8 +221,8 @@ function Timeline({ const oRef = useHotkeys(['enter', 'o'], () => { // open active status - const activeItem = document.activeElement.closest(itemsSelector); - if (activeItem) { + const activeItem = document.activeElement; + if (activeItem?.matches(itemsSelector)) { activeItem.click(); } }); @@ -209,17 +230,13 @@ function Timeline({ const showNewPostsIndicator = items.length > 0 && uiState !== 'loading' && showNew; const handleLoadNewPosts = useCallback(() => { - loadItems(true); + if (showNewPostsIndicator) loadItems(true); scrollableRef.current?.scrollTo({ top: 0, behavior: 'smooth', }); - }, [loadItems]); - const dotRef = useHotkeys('.', () => { - if (showNewPostsIndicator) { - handleLoadNewPosts(); - } - }); + }, [loadItems, showNewPostsIndicator]); + const dotRef = useHotkeys('.', handleLoadNewPosts); // const { // scrollDirection, @@ -268,9 +285,18 @@ function Timeline({ scrollableRef.current?.scrollTo({ top: 0 }); loadItems(true); }, []); + const firstLoad = useRef(true); useEffect(() => { + if (firstLoad.current) { + firstLoad.current = false; + return; + } + if (clearWhenRefresh && items?.length) { + loadItems.cancel?.(); + setItems([]); + } loadItems(true); - }, [refresh]); + }, [clearWhenRefresh, refresh]); // useEffect(() => { // if (reachStart) { @@ -359,14 +385,28 @@ function Timeline({ <FilterContext.Provider value={filterContext}> <div id={`${id}-page`} - class="deck-container" + class={`deck-container ${ + mediaFirst ? 'deck-container-media-first' : '' + }`} ref={(node) => { scrollableRef.current = node; - jRef.current = node; - kRef.current = node; - oRef.current = node; + jRef(node); + kRef(node); + oRef(node); + dotRef(node); }} tabIndex="-1" + onClick={(e) => { + // If click on timeline item, unhide header + if ( + headerRef.current && + e.target.closest('.timeline-item, .timeline-item-alt') + ) { + setTimeout(() => { + headerRef.current.hidden = false; + }, 250); + } + }} > <div class="timeline-deck deck"> <header @@ -394,7 +434,7 @@ function Timeline({ headerStart ) : ( <Link to="/" class="button plain home-button"> - <Icon icon="home" size="l" /> + <Icon icon="home" size="l" alt={t`Home`} /> </Link> )} </div> @@ -410,7 +450,7 @@ function Timeline({ type="button" onClick={handleLoadNewPosts} > - <Icon icon="arrow-up" /> New posts + <Icon icon="arrow-up" /> <Trans>New posts</Trans> </button> )} </header> @@ -435,6 +475,7 @@ function Timeline({ view={view} showFollowedTags={showFollowedTags} showReplyParent={showReplyParent} + mediaFirst={mediaFirst} /> ))} {showMore && @@ -446,14 +487,14 @@ function Timeline({ height: '20vh', }} > - <Status skeleton /> + <Status skeleton mediaFirst={mediaFirst} /> </li> <li style={{ height: '25vh', }} > - <Status skeleton /> + <Status skeleton mediaFirst={mediaFirst} /> </li> </> ))} @@ -475,11 +516,13 @@ function Timeline({ onClick={() => loadItems()} style={{ marginBlockEnd: '6em' }} > - Show more… + <Trans>Show more…</Trans> </button> </InView> ) : ( - <p class="ui-state insignificant">The end.</p> + <p class="ui-state insignificant"> + <Trans>The end.</Trans> + </p> ))} </> ) : uiState === 'loading' ? ( @@ -493,13 +536,14 @@ function Timeline({ /> ) : ( <li key={i}> - <Status skeleton /> + <Status skeleton mediaFirst={mediaFirst} /> </li> ), )} </ul> ) : ( - uiState !== 'error' && <p class="ui-state">{emptyText}</p> + uiState !== 'error' && + uiState !== 'start' && <p class="ui-state">{emptyText}</p> )} {uiState === 'error' && ( <p class="ui-state"> @@ -507,7 +551,7 @@ function Timeline({ <br /> <br /> <button type="button" onClick={() => loadItems(!items.length)}> - Try again + <Trans>Try again</Trans> </button> </p> )} @@ -527,6 +571,7 @@ const TimelineItem = memo( view, showFollowedTags, showReplyParent, + mediaFirst, }) => { console.debug('RENDER TimelineItem', status.id); const { id: statusID, reblog, items, type, _pinned } = status; @@ -535,16 +580,21 @@ const TimelineItem = memo( const url = instance ? `/${instance}/s/${actualStatusID}` : `/s/${actualStatusID}`; - let title = ''; - if (type === 'boosts') { - title = `${items.length} Boosts`; - } else if (type === 'pinned') { - title = 'Pinned posts'; - } - const isCarousel = type === 'boosts' || type === 'pinned'; + if (items) { - const fItems = filteredItems(items, filterContext); + let fItems = filteredItems(items, filterContext); + let title = ''; + if (type === 'boosts') { + title = plural(fItems.length, { + one: '# Boost', + other: '# Boosts', + }); + } else if (type === 'pinned') { + title = t`Pinned posts`; + } + const isCarousel = type === 'boosts' || type === 'pinned'; if (isCarousel) { + const filteredItemsIDs = new Set(); // Here, we don't hide filtered posts, but we sort them last fItems.sort((a, b) => { // if (a._filtered && !b._filtered) { @@ -555,6 +605,8 @@ const TimelineItem = memo( // } const aFiltered = isFiltered(a.filtered, filterContext); const bFiltered = isFiltered(b.filtered, filterContext); + if (aFiltered) filteredItemsIDs.add(a.id); + if (bFiltered) filteredItemsIDs.add(b.id); if (aFiltered && !bFiltered) { return 1; } @@ -563,11 +615,69 @@ const TimelineItem = memo( } return 0; }); + + if (filteredItemsIDs.size >= 2) { + const GROUP_SIZE = 5; + // If 2 or more, group filtered items into one, limit to GROUP_SIZE in a group + const unfiltered = []; + const filtered = []; + fItems.forEach((item) => { + if (filteredItemsIDs.has(item.id)) { + filtered.push(item); + } else { + unfiltered.push(item); + } + }); + const filteredItems = []; + for (let i = 0; i < filtered.length; i += GROUP_SIZE) { + filteredItems.push({ + _grouped: true, + posts: filtered.slice(i, i + GROUP_SIZE), + }); + } + fItems = unfiltered.concat(filteredItems); + } + return ( <li key={`timeline-${statusID}`} class="timeline-item-carousel"> <StatusCarousel title={title} class={`${type}-carousel`}> {fItems.map((item) => { - const { id: statusID, reblog, _pinned } = item; + const { id: statusID, reblog, _pinned, _grouped } = item; + if (_grouped) { + return ( + <li key={statusID} class="timeline-item-carousel-group"> + {item.posts.map((item) => { + const { id: statusID, reblog, _pinned } = item; + const actualStatusID = reblog?.id || statusID; + const url = instance + ? `/${instance}/s/${actualStatusID}` + : `/s/${actualStatusID}`; + if (_pinned) useItemID = false; + return ( + <Link + class="status-carousel-link timeline-item-alt" + to={url} + > + {useItemID ? ( + <Status + statusID={statusID} + instance={instance} + size="s" + /> + ) : ( + <Status + status={item} + instance={instance} + size="s" + /> + )} + </Link> + ); + })} + </li> + ); + } + const actualStatusID = reblog?.id || statusID; const url = instance ? `/${instance}/s/${actualStatusID}` @@ -587,6 +697,7 @@ const TimelineItem = memo( contentTextWeight enableCommentHint // allowFilters={allowFilters} + mediaFirst={mediaFirst} /> ) : ( <Status @@ -596,6 +707,7 @@ const TimelineItem = memo( contentTextWeight enableCommentHint // allowFilters={allowFilters} + mediaFirst={mediaFirst} /> )} </Link> @@ -632,7 +744,11 @@ const TimelineItem = memo( > <Link class="status-link timeline-item" to={url}> {showCompact ? ( - <TimelineStatusCompact status={item} instance={instance} /> + <TimelineStatusCompact + status={item} + instance={instance} + filterContext={filterContext} + /> ) : useItemID ? ( <Status statusID={statusID} @@ -691,6 +807,7 @@ const TimelineItem = memo( showFollowedTags={showFollowedTags} showReplyParent={showReplyParent} // allowFilters={allowFilters} + mediaFirst={mediaFirst} /> ) : ( <Status @@ -700,6 +817,7 @@ const TimelineItem = memo( showFollowedTags={showFollowedTags} showReplyParent={showReplyParent} // allowFilters={allowFilters} + mediaFirst={mediaFirst} /> )} </Link> @@ -759,13 +877,16 @@ function StatusCarousel({ title, class: className, children }) { class="small plain2" // disabled={reachStart} onClick={() => { + const left = + Math.min(320, carouselRef.current?.offsetWidth) * + (isRTL() ? 1 : -1); carouselRef.current?.scrollBy({ - left: -Math.min(320, carouselRef.current?.offsetWidth), + left, behavior: 'smooth', }); }} > - <Icon icon="chevron-left" /> + <Icon icon="chevron-left" alt={t`Previous`} /> </button>{' '} <button ref={endButtonRef} @@ -773,13 +894,16 @@ function StatusCarousel({ title, class: className, children }) { class="small plain2" // disabled={reachEnd} onClick={() => { + const left = + Math.min(320, carouselRef.current?.offsetWidth) * + (isRTL() ? -1 : 1); carouselRef.current?.scrollBy({ - left: Math.min(320, carouselRef.current?.offsetWidth), + left, behavior: 'smooth', }); }} > - <Icon icon="chevron-right" /> + <Icon icon="chevron-right" alt={t`Next`} /> </button> </span> </header> @@ -804,11 +928,12 @@ function StatusCarousel({ title, class: className, children }) { ); } -function TimelineStatusCompact({ status, instance }) { +function TimelineStatusCompact({ status, instance, filterContext }) { const snapStates = useSnapshot(states); const { id, visibility, language } = status; const statusPeekText = statusPeek(status); const sKey = statusKey(id, instance); + const filterInfo = isFiltered(status.filtered, filterContext); return ( <article class={`status compact-thread ${ @@ -818,14 +943,14 @@ function TimelineStatusCompact({ status, instance }) { > {!!snapStates.statusThreadNumber[sKey] ? ( <div class="status-thread-badge"> - <Icon icon="thread" size="s" /> + <Icon icon="thread" size="s" alt={t`Thread`} /> {snapStates.statusThreadNumber[sKey] ? ` ${snapStates.statusThreadNumber[sKey]}/X` : ''} </div> ) : ( <div class="status-thread-badge"> - <Icon icon="thread" size="s" /> + <Icon icon="thread" size="s" alt={t`Thread`} /> </div> )} <div @@ -834,13 +959,32 @@ function TimelineStatusCompact({ status, instance }) { lang={language} dir="auto" > - {statusPeekText} - {status.sensitive && status.spoilerText && ( + {!!filterInfo ? ( + <b + class="status-filtered-badge badge-meta horizontal" + title={filterInfo?.titlesStr || ''} + > + {filterInfo?.titlesStr ? ( + <Trans> + <span>Filtered</span>: <span>{filterInfo.titlesStr}</span> + </Trans> + ) : ( + <span> + <Trans>Filtered</Trans> + </span> + )} + </b> + ) : ( <> - {' '} - <span class="spoiler-badge"> - <Icon icon="eye-close" size="s" /> - </span> + {statusPeekText} + {status.sensitive && status.spoilerText && ( + <> + {' '} + <span class="spoiler-badge"> + <Icon icon="eye-close" size="s" alt={t`Content warning`} /> + </span> + </> + )} </> )} </div> diff --git a/src/components/translation-block.css b/src/components/translation-block.css index a1c83b9c..cbed2b8b 100644 --- a/src/components/translation-block.css +++ b/src/components/translation-block.css @@ -35,7 +35,7 @@ border-bottom: 0; margin-bottom: -1px; background-image: linear-gradient( - to top left, + to top var(--backward), var(--bg-color) 50%, var(--bg-faded-blur-color) ); @@ -44,12 +44,13 @@ .status-translation-block .translated-block { border: 1px solid var(--outline-color); line-height: 1.3; - border-radius: 0 8px 8px 8px; + border-radius: 8px; + border-start-start-radius: 0; margin: 0; padding: 8px; background-color: var(--bg-color); background-image: linear-gradient( - to bottom right, + to bottom var(--forward), var(--bg-color), var(--bg-faded-blur-color) ); diff --git a/src/components/translation-block.jsx b/src/components/translation-block.jsx index 588ee1f9..7e4f10ca 100644 --- a/src/components/translation-block.jsx +++ b/src/components/translation-block.jsx @@ -1,5 +1,6 @@ import './translation-block.css'; +import { t, Trans } from '@lingui/macro'; import pRetry from 'p-retry'; import pThrottle from 'p-throttle'; import { useEffect, useRef, useState } from 'preact/hooks'; @@ -10,6 +11,7 @@ import localeCode2Text from '../utils/localeCode2Text'; import pmem from '../utils/pmem'; import Icon from './icon'; +import LazyShazam from './lazy-shazam'; import Loader from './loader'; const { PHANPY_LINGVA_INSTANCES } = import.meta.env; @@ -76,6 +78,7 @@ function TranslationBlock({ onTranslate, text = '', mini, + autoDetected, }) { const targetLang = getTranslateTargetLanguage(true); const [uiState, setUIState] = useState('default'); @@ -142,23 +145,21 @@ function TranslationBlock({ detectedLang !== targetLangText ) { return ( - <div class="shazam-container"> - <div class="shazam-container-inner"> - <div class="status-translation-block-mini"> - <Icon - icon="translate" - alt={`Auto-translated from ${sourceLangText}`} - /> - <output - lang={targetLang} - dir="auto" - title={pronunciationContent || ''} - > - {translatedContent} - </output> - </div> + <LazyShazam> + <div class="status-translation-block-mini"> + <Icon + icon="translate" + alt={t`Auto-translated from ${sourceLangText}`} + /> + <output + lang={targetLang} + dir="auto" + title={pronunciationContent || ''} + > + {translatedContent} + </output> </div> - </div> + </LazyShazam> ); } return null; @@ -186,10 +187,12 @@ function TranslationBlock({ <Icon icon="translate" />{' '} <span> {uiState === 'loading' - ? 'Translating…' + ? t`Translating…` : sourceLanguage && sourceLangText && !detectedLang - ? `Translate from ${sourceLangText}` - : `Translate`} + ? autoDetected + ? t`Translate from ${sourceLangText} (auto-detected)` + : t`Translate from ${sourceLangText}` + : t`Translate`} </span> </button> </summary> @@ -203,17 +206,34 @@ function TranslationBlock({ translate(); }} > - {sourceLanguages.map((l) => ( - <option value={l.code}> - {l.code === 'auto' ? `Auto (${detectedLang ?? '…'})` : l.name} - </option> - ))} + {sourceLanguages.map((l) => { + const common = localeCode2Text({ + code: l.code, + fallback: l.name, + }); + const native = localeCode2Text({ + code: l.code, + locale: l.code, + }); + const showCommon = common !== native; + return ( + <option value={l.code}> + {l.code === 'auto' + ? t`Auto (${detectedLang ?? '…'})` + : showCommon + ? `${native} - ${common}` + : native} + </option> + ); + })} </select>{' '} <span>→ {targetLangText}</span> <Loader abrupt hidden={uiState !== 'loading'} /> </div> {uiState === 'error' ? ( - <p class="ui-state">Failed to translate</p> + <p class="ui-state"> + <Trans>Failed to translate</Trans> + </p> ) : ( !!translatedContent && ( <> diff --git a/src/compose.jsx b/src/compose.jsx index 30856359..709275e7 100644 --- a/src/compose.jsx +++ b/src/compose.jsx @@ -1,32 +1,50 @@ import './index.css'; - import './app.css'; +import './polyfills'; +import { i18n } from '@lingui/core'; +import { t, Trans } from '@lingui/macro'; +import { I18nProvider } from '@lingui/react'; import { render } from 'preact'; import { useEffect, useState } from 'preact/hooks'; -import Compose from './components/compose'; +import ComposeSuspense from './components/compose-suspense'; +import Loader from './components/loader'; +import { initActivateLang } from './utils/lang'; +import { initStates } from './utils/states'; +import { getCurrentAccount, setCurrentAccountID } from './utils/store-utils'; import useTitle from './utils/useTitle'; +initActivateLang(); + if (window.opener) { console = window.opener.console; } function App() { const [uiState, setUIState] = useState('default'); + const [isLoggedIn, setIsLoggedIn] = useState(null); const { editStatus, replyToStatus, draftStatus } = window.__COMPOSE__ || {}; useTitle( editStatus - ? 'Editing source status' + ? t`Editing source status` : replyToStatus - ? `Replying to @${ - replyToStatus.account?.acct || replyToStatus.account?.username - }` - : 'Compose', + ? t`Replying to @${ + replyToStatus.account?.acct || replyToStatus.account?.username + }` + : t`Compose`, ); + useEffect(() => { + const account = getCurrentAccount(); + setIsLoggedIn(!!account); + if (account) { + initStates(); + } + }, []); + useEffect(() => { if (uiState === 'closed') { try { @@ -40,14 +58,16 @@ function App() { if (uiState === 'closed') { return ( <div class="box"> - <p>You may close this page now.</p> + <p> + <Trans>You may close this page now.</Trans> + </p> <p> <button onClick={() => { window.close(); }} > - Close window + <Trans>Close window</Trans> </button> </p> </div> @@ -56,25 +76,56 @@ function App() { console.debug('OPEN COMPOSE'); + if (isLoggedIn === false) { + return ( + <div class="box"> + <h1> + <Trans>Error</Trans> + </h1> + <p> + <Trans>Login required.</Trans> + </p> + <p> + <a href="/"> + <Trans>Go home</Trans> + </a> + </p> + </div> + ); + } + + if (isLoggedIn) { + return ( + <ComposeSuspense + editStatus={editStatus} + replyToStatus={replyToStatus} + draftStatus={draftStatus} + standalone + hasOpener={window.opener} + onClose={(results) => { + const { newStatus, fn = () => {} } = results || {}; + try { + if (newStatus) { + window.opener.__STATES__.reloadStatusPage++; + } + fn(); + setUIState('closed'); + } catch (e) {} + }} + /> + ); + } + return ( - <Compose - editStatus={editStatus} - replyToStatus={replyToStatus} - draftStatus={draftStatus} - standalone - hasOpener={window.opener} - onClose={(results) => { - const { newStatus, fn = () => {} } = results || {}; - try { - if (newStatus) { - window.opener.__STATES__.reloadStatusPage++; - } - fn(); - setUIState('closed'); - } catch (e) {} - }} - /> + <div class="box"> + <Loader /> + </div> ); } -render(<App />, document.getElementById('app-standalone')); +render( + <I18nProvider i18n={i18n}> + <App /> + </I18nProvider>, + document.getElementById('app-standalone'), +); diff --git a/src/data/catalogs.json b/src/data/catalogs.json new file mode 100644 index 00000000..1e5a4683 --- /dev/null +++ b/src/data/catalogs.json @@ -0,0 +1,164 @@ +[ + { + "code": "ar-SA", + "nativeName": "العربية", + "name": "Arabic", + "completion": 25 + }, + { + "code": "ca-ES", + "nativeName": "català", + "name": "Catalan", + "completion": 100 + }, + { + "code": "cs-CZ", + "nativeName": "čeština", + "name": "Czech", + "completion": 79 + }, + { + "code": "de-DE", + "nativeName": "Deutsch", + "name": "German", + "completion": 94 + }, + { + "code": "eo-UY", + "nativeName": "Esperanto", + "name": "Esperanto", + "completion": 100 + }, + { + "code": "es-ES", + "nativeName": "español", + "name": "Spanish", + "completion": 100 + }, + { + "code": "eu-ES", + "nativeName": "euskara", + "name": "Basque", + "completion": 100 + }, + { + "code": "fa-IR", + "nativeName": "فارسی", + "name": "Persian", + "completion": 78 + }, + { + "code": "fi-FI", + "nativeName": "suomi", + "name": "Finnish", + "completion": 100 + }, + { + "code": "fr-FR", + "nativeName": "français", + "name": "French", + "completion": 97 + }, + { + "code": "gl-ES", + "nativeName": "galego", + "name": "Galician", + "completion": 99 + }, + { + "code": "he-IL", + "nativeName": "עברית", + "name": "Hebrew", + "completion": 12 + }, + { + "code": "it-IT", + "nativeName": "italiano", + "name": "Italian", + "completion": 100 + }, + { + "code": "ja-JP", + "nativeName": "日本語", + "name": "Japanese", + "completion": 51 + }, + { + "code": "kab", + "nativeName": "Taqbaylit", + "name": "Kabyle", + "completion": 98 + }, + { + "code": "ko-KR", + "nativeName": "한국어", + "name": "Korean", + "completion": 95 + }, + { + "code": "lt-LT", + "nativeName": "lietuvių", + "name": "Lithuanian", + "completion": 98 + }, + { + "code": "nb-NO", + "nativeName": "norsk bokmål", + "name": "Norwegian Bokmål", + "completion": 52 + }, + { + "code": "nl-NL", + "nativeName": "Nederlands", + "name": "Dutch", + "completion": 82 + }, + { + "code": "pl-PL", + "nativeName": "polski", + "name": "Polish", + "completion": 10 + }, + { + "code": "pt-BR", + "nativeName": "português", + "name": "Portuguese", + "completion": 100 + }, + { + "code": "pt-PT", + "nativeName": "português", + "name": "Portuguese", + "completion": 100 + }, + { + "code": "ru-RU", + "nativeName": "русский", + "name": "Russian", + "completion": 100 + }, + { + "code": "th-TH", + "nativeName": "ไทย", + "name": "Thai", + "completion": 9 + }, + { + "code": "uk-UA", + "nativeName": "українська", + "name": "Ukrainian", + "completion": 100 + }, + { + "code": "zh-CN", + "nativeName": "简体中文", + "name": "Simplified Chinese", + "completion": 100 + }, + { + "code": "zh-TW", + "nativeName": "繁體中文", + "name": "Traditional Chinese", + "completion": 32 + } +] \ No newline at end of file diff --git a/src/data/features.json b/src/data/features.json index 69be7477..7376418b 100644 --- a/src/data/features.json +++ b/src/data/features.json @@ -1,4 +1,9 @@ { "@mastodon/edit-media-attributes": ">=4.1", - "@mastodon/list-exclusive": ">=4.2" + "@mastodon/list-exclusive": ">=4.2", + "@gotosocial/list-exclusive": ">=0.17", + "@mastodon/filtered-notifications": "~4.3 || >=4.3", + "@mastodon/fetch-multiple-statuses": "~4.3 || >=4.3", + "@mastodon/trending-link-posts": "~4.3 || >=4.3", + "@mastodon/grouped-notifications": "~4.3 || >=4.3" } diff --git a/src/data/instances.json b/src/data/instances.json index bb6c44bd..4c0a6e79 100644 --- a/src/data/instances.json +++ b/src/data/instances.json @@ -2,383 +2,365 @@ "mastodon.social", "mstdn.jp", "mstdn.social", + "infosec.exchange", "mas.to", "mastodon.world", - "infosec.exchange", "hachyderm.io", - "troet.cafe", - "mastodon.uno", "m.cmx.im", + "troet.cafe", "techhub.social", "piaille.fr", + "mastodon.uno", "mastodon.gamedev.place", - "mastodonapp.uk", - "mastodon.nl", "social.vivaldi.net", + "mastodonapp.uk", "universeodon.com", - "mastodon.sdf.org", - "c.im", - "mstdn.ca", + "mastodon.nl", + "social.tchncs.de", "kolektiva.social", - "mastodon-japan.net", + "mastodon.sdf.org", + "tech.lgbt", + "c.im", "norden.social", - "o3o.ca", + "mstdn.ca", + "occm.cc", + "mastodon.scot", "sfba.social", "nrw.social", - "tech.lgbt", - "mastodon.scot", - "mstdn.party", - "occm.cc", "aus.social", "mathstodon.xyz", + "mastodon-japan.net", + "mstdn.party", + "det.social", "toot.community", "ohai.social", - "sueden.social", + "mstdn.business", "mastodon.ie", - "mastodon.top", + "sueden.social", + "defcon.social", + "masto.es", "mastodontech.de", "mastodon.nu", - "masto.es", - "freemasonry.social", "ioc.exchange", "mindly.social", "hessen.social", "ruhr.social", + "mastodon.au", "nerdculture.de", - "muenchen.social", - "defcon.social", - "social.anoxinon.de", "mastodon.green", - "mastouille.fr", - "social.linux.pizza", "social.cologne", + "muenchen.social", "indieweb.social", - "livellosegreto.it", - "ruby.social", - "ieji.de", + "social.linux.pizza", + "feuerwehr.social", + "social.anoxinon.de", "mastodon.nz", + "ruby.social", + "livellosegreto.it", + "fairy.id", + "ieji.de", "toot.io", - "tkz.one", + "mastouille.fr", "mastodont.cat", - "social.tchncs.de", - "mastodon.com.tr", - "noc.social", - "sciences.social", + "tkz.one", "toot.wales", - "masto.nu", + "pouet.chapril.org", "phpc.social", - "social.dev-wiki.de", "cyberplace.social", + "sciences.social", + "noc.social", + "mastodon.com.tr", + "ravenation.club", + "masto.nu", + "metalhead.club", + "mastodon.ml", + "urbanists.social", "mastodontti.fi", "climatejustice.social", - "urbanists.social", - "mstdn.plus", - "metalhead.club", - "ravenation.club", - "mastodon.ml", - "fairy.id", - "feuerwehr.social", - "dresden.network", - "stranger.social", - "mastodon.iriseden.eu", - "rollenspiel.social", - "pol.social", - "mstdn.business", - "mstdn.games", - "wien.rocks", - "h4.io", - "socel.net", - "mastodon.eus", - "wehavecookies.social", - "glasgow.social", - "mastodon.me.uk", - "uri.life", - "hostux.social", - "theblower.au", - "mastodon-uk.net", - "masto.pt", - "awscommunity.social", "flipboard.social", - "mast.lat", - "freiburg.social", + "mstdn.plus", + "dresden.network", + "pol.social", + "mastodon.bida.im", + "mastodon.eus", + "mstdn.games", "snabelen.no", - "mastodon.zaclys.com", - "muenster.im", - "mastodon-belgium.be", - "geekdom.social", - "hcommons.social", - "tooot.im", - "tooting.ch", - "rheinneckar.social", - "discuss.systems", - "sunny.garden", - "mapstodon.space", - "toad.social", - "lor.sh", - "peoplemaking.games", - "union.place", + "mastodon.me.uk", + "rollenspiel.social", + "todon.eu", "bark.lgbt", - "bonn.social", - "tilde.zone", - "vmst.io", - "mastodon.berlin", - "emacs.ch", - "blorbo.social", + "hostux.social", "furry.engineer", - "rivals.space", - "cupoftea.social", + "sunny.garden", + "uri.life", + "mast.lat", + "wien.rocks", + "mastodon.zaclys.com", + "emacs.ch", + "freiburg.social", + "discuss.systems", + "mapstodon.space", + "masto.pt", + "hcommons.social", + "tooting.ch", + "socel.net", + "theblower.au", + "glasgow.social", + "lor.sh", + "stranger.social", + "tilde.zone", + "rheinneckar.social", + "peoplemaking.games", + "geekdom.social", + "bonn.social", + "mastodon-belgium.be", + "wehavecookies.social", + "toad.social", + "mastodon.iriseden.eu", + "vmst.io", + "muenster.im", + "union.place", + "h4.io", + "awscommunity.social", + "blorbo.social", "qdon.space", - "graphics.social", - "veganism.social", - "ludosphere.fr", - "4bear.com", - "famichiki.jp", - "expressional.social", - "convo.casa", - "historians.social", - "mastorol.es", - "retro.pizza", - "shelter.moe", - "mast.dragon-fly.club", - "sakurajima.moe", - "mastodon.arch-linux.cz", - "squawk.mytransponder.com", - "mastodon.gal", - "disabled.social", - "vkl.world", - "eupolicy.social", - "fandom.ink", - "toot.funami.tech", - "mastodonbooks.net", - "lgbtqia.space", - "witter.cz", - "planetearth.social", - "oslo.town", - "mastodon.com.pl", + "todon.nl", "pawb.fun", - "darmstadt.social", + "tooot.im", + "rivals.space", + "ludosphere.fr", + "expressional.social", + "mast.dragon-fly.club", + "mastorol.es", + "cupoftea.social", + "veganism.social", + "mastodon.berlin", + "shelter.moe", + "famichiki.jp", + "lgbtqia.space", + "graphics.social", + "mastodon.gal", + "retro.pizza", + "sakurajima.moe", + "historians.social", + "fandom.ink", + "4bear.com", + "oslo.town", + "disabled.social", + "convo.casa", + "urusai.social", + "freeradical.zone", "masto.nobigtech.es", - "cr8r.gg", - "pnw.zone", - "hear-me.social", - "furries.club", + "witter.cz", + "eupolicy.social", "gaygeek.social", - "birdon.social", - "mastodon.energy", - "mastodon-swiss.org", - "dizl.de", - "libretooth.gr", - "mustard.blog", - "machteburch.social", - "fulda.social", + "furries.club", "muri.network", - "babka.social", - "archaeo.social", + "corteximplant.com", + "cr8r.gg", + "toot.aquilenet.fr", "mastodon.uy", "xarxa.cloud", - "corteximplant.com", - "mastodon.london", - "urusai.social", - "thecanadian.social", - "federated.press", + "pnw.zone", + "libretooth.gr", + "machteburch.social", + "dizl.de", + "mustard.blog", + "babka.social", + "vkl.world", "kanoa.de", - "opalstack.social", - "bahn.social", - "mograph.social", - "dmv.community", - "social.bau-ha.us", - "mastodon.free-solutions.org", - "masto.nyc", - "tyrol.social", - "burma.social", - "toot.kif.rocks", - "donphan.social", - "mast.hpc.social", - "musicians.today", - "drupal.community", - "hometech.social", - "norcal.social", - "social.politicaconciencia.org", - "social.seattle.wa.us", - "is.nota.live", - "genealysis.social", - "wargamers.social", - "guitar.rodeo", - "bookstodon.com", - "mstdn.dk", - "elizur.me", - "irsoluciones.social", - "h-net.social", - "mastoot.fr", "qaf.men", - "est.social", - "kurry.social", - "mastodon.pnpde.social", - "ani.work", - "nederland.online", - "epicure.social", - "occitania.social", - "lgbt.io", + "fulda.social", + "archaeo.social", + "spojnik.works", + "dmv.community", + "bookstodon.com", + "mastodon.energy", + "thecanadian.social", + "mastodon.arch-linux.cz", + "social.bau-ha.us", + "drupal.community", + "donphan.social", + "hear-me.social", + "toot.funami.tech", + "toot.kif.rocks", + "musicians.today", + "mograph.social", + "masto.nyc", "mountains.social", - "persiansmastodon.com", - "seocommunity.social", - "cyberfurz.social", - "fedi.at", + "federated.press", + "mstdn.dk", + "mast.hpc.social", + "social.seattle.wa.us", + "mastodon.pnpde.social", + "norcal.social", + "hometech.social", + "is.nota.live", + "ani.work", + "tyrol.social", "gamepad.club", - "augsburg.social", - "mastodon.education", - "toot.re", - "linux.social", - "neovibe.app", + "wargamers.social", + "social.politicaconciencia.org", + "mastodon.com.pl", + "mastodon.london", "musician.social", - "esq.social", - "social.veraciousnetwork.com", - "datasci.social", - "tooters.org", - "ciberlandia.pt", - "cloud-native.social", - "social.silicon.moe", + "epicure.social", + "genealysis.social", "cosocial.ca", - "arvr.social", - "hispagatos.space", - "friendsofdesoto.social", + "mastoot.fr", + "toot.si", + "kurry.social", + "esq.social", + "est.social", + "bahn.social", "musicworld.social", - "aut.social", - "masto.yttrx.com", - "mastodon.wien", - "colorid.es", - "arsenalfc.social", - "allthingstech.social", - "mastodon.vlaanderen", - "mastodon.com.py", + "mastodon.mnetwork.co.kr", + "lgbt.io", + "h-net.social", + "social.silicon.moe", "tooter.social", - "lounge.town", - "puntarella.party", - "earthstream.social", - "apobangpo.space", - "opencoaster.net", + "fedi.at", "frikiverse.zone", - "airwaves.social", - "toot.garden", - "lewacki.space", - "gardenstate.social", + "datasci.social", + "augsburg.social", + "opencoaster.net", + "hispagatos.space", + "neovibe.app", + "friendsofdesoto.social", + "elekk.xyz", + "cyberfurz.social", + "guitar.rodeo", + "khiar.net", + "seocommunity.social", "theatl.social", - "maly.io", - "library.love", - "kfem.cat", - "ruhrpott.social", - "techtoots.com", - "furry.energy", - "mastodon.pirateparty.be", - "metalverse.social", + "colorid.es", + "puntarella.party", + "aut.social", + "toot.garden", + "apobangpo.space", + "mastodon.vlaanderen", + "gardenstate.social", + "opalstack.social", + "mastodon.education", + "occitania.social", + "earthstream.social", "indieauthors.social", - "tuiter.rocks", "mastodon.africa", - "jvm.social", + "masto.yttrx.com", + "arvr.social", + "allthingstech.social", + "furry.energy", + "tuiter.rocks", + "beekeeping.ninja", + "lounge.town", + "mastodon.wien", + "lewacki.space", + "mastodon.pirateparty.be", + "kfem.cat", + "burningboard.net", + "social.veraciousnetwork.com", + "raphus.social", + "lsbt.me", "poweredbygay.social", "fikaverse.club", - "gametoots.de", - "mastodon.cr", - "hoosier.social", - "khiar.net", - "seo.chat", - "drumstodon.net", - "raphus.social", - "toots.nu", - "k8s.social", - "mastodon.holeyfox.co", - "fribygda.no", + "jvm.social", + "rail.chat", + "mastodon-swiss.org", + "elizur.me", + "metalverse.social", "x0r.be", - "fpl.social", - "toot.pizza", - "mastodon.cipherbliss.com", - "burningboard.net", + "library.love", + "drumstodon.net", + "mastodon.sg", + "rheinhessen.social", "synapse.cafe", + "fribygda.no", "cultur.social", - "vermont.masto.host", + "mastodon.cr", + "mastodon.free-solutions.org", + "mastodon.cipherbliss.com", + "cwb.social", + "mastodon.holeyfox.co", + "hoosier.social", + "toot.re", + "techtoots.com", + "mastodon.escepticos.es", + "seo.chat", + "leipzig.town", + "bzh.social", "mastodon.bot", "bologna.one", - "mastodon.sg", - "tchafia.be", - "rail.chat", - "mastodon.hosnet.fr", - "leipzig.town", - "wayne.social", - "rheinhessen.social", - "rap.social", - "cwb.social", - "mastodon.bachgau.social", - "cville.online", - "bzh.social", - "mastodon.escepticos.es", - "zenzone.social", - "mastodon.ee", - "lsbt.me", - "neurodiversity-in.au", - "fairmove.net", - "stereodon.social", - "mcr.wtf", - "mastodon.frl", - "mikumikudance.cloud", - "okla.social", - "camp.smolnet.org", - "ailbhean.co-shaoghal.net", - "clj.social", - "tu.social", - "nomanssky.social", - "mastodon.iow.social", + "vermont.masto.host", + "squawk.mytransponder.com", + "freemasonry.social", "frontrange.co", - "episcodon.net", - "devianze.city", - "paktodon.asia", - "travelpandas.fr", - "silversword.online", - "nwb.social", - "skastodon.com", - "kcmo.social", - "balkan.fedive.rs", - "openedtech.social", - "mastodon.ph", - "enshittification.social", - "spojnik.works", - "mastodon.conquestuniverse.com", - "nutmeg.social", - "social.sndevs.com", - "social.diva.exchange", + "tchafia.be", + "k8s.social", + "planetearth.social", + "tu.social", "growers.social", - "pdx.sh", - "nfld.me", - "cartersville.social", - "voi.social", - "mastodon.babb.no", - "kzoo.to", - "mastodon.vanlife.is", - "toot.works", - "sanjuans.life", - "dariox.club", + "toots.nu", + "clj.social", + "paktodon.asia", + "devianze.city", "xreality.social", + "camp.smolnet.org", + "episcodon.net", + "okla.social", + "mastodon.hosnet.fr", + "balkan.fedive.rs", + "stereodon.social", + "mastodon.bachgau.social", + "nomanssky.social", + "sanjuans.life", + "cville.online", + "t.chadole.com", + "mastodon.conquestuniverse.com", + "skastodon.com", + "mastodon.babb.no", + "travelpandas.fr", + "mastodon.iow.social", + "rap.social", + "masr.social", + "silversword.online", + "kcmo.social", + "ailbhean.co-shaoghal.net", + "mikumikudance.cloud", + "toot.works", + "mastodon.ph", + "mcr.wtf", + "social.diva.exchange", + "fpl.social", + "kzoo.to", + "mastodon.ee", + "pdx.sh", + "23.illuminati.org", + "social.sndevs.com", + "voi.social", + "mastodon.frl", + "nwb.social", + "polsci.social", + "nfld.me", + "mastodon.fedi.quebec", "social.ferrocarril.net", "pool.social", - "polsci.social", - "mastodon.mg", - "23.illuminati.org", - "apotheke.social", - "jaxbeach.social", - "ceilidh.online", - "netsphere.one", + "neurodiversity-in.au", "biplus.social", - "bvb.social", + "mastodon.mg", + "mastodon.vanlife.is", "ms.maritime.social", - "darticulate.com", + "bvb.social", + "netsphere.one", + "ceilidh.online", "persia.social", - "streamerchat.social", - "troet.fediverse.at", + "jaxbeach.social", "publishing.social", - "finsup.social", + "wayne.social", + "troet.fediverse.at", "kjas.no", - "wxw.moe", - "learningdisability.social", - "mastodon.bida.im", + "darticulate.com", "computerfairi.es", + "learningdisability.social", + "wxw.moe", "tea.codes" ] \ No newline at end of file diff --git a/src/data/status-supported-languages.json b/src/data/status-supported-languages.json index 495b9fa5..b587da90 100644 --- a/src/data/status-supported-languages.json +++ b/src/data/status-supported-languages.json @@ -534,6 +534,11 @@ "Malay", "Bahasa Melayu" ], + [ + "ms-Arab", + "Jawi Malay", + "بهاس ملايو" + ], [ "mt", "Maltese", @@ -626,7 +631,7 @@ ], [ "pa", - "Panjabi", + "Punjabi", "ਪੰਜਾਬੀ" ], [ @@ -949,6 +954,11 @@ "Montenegrin", "crnogorski" ], + [ + "csb", + "Kashubian", + "Kaszëbsczi" + ], [ "jbo", "Lojban", @@ -969,6 +979,21 @@ "Lingua Franca Nova", "lingua franca nova" ], + [ + "moh", + "Mohawk", + "Kanienʼkéha" + ], + [ + "nds", + "Low German", + "Plattdüütsch" + ], + [ + "pdc", + "Pennsylvania Dutch", + "Pennsilfaani-Deitsch" + ], [ "sco", "Scots", @@ -994,6 +1019,11 @@ "Toki Pona", "toki pona" ], + [ + "vai", + "Vai", + "ꕙꔤ" + ], [ "xal", "Kalmyk", diff --git a/src/index.css b/src/index.css index 149375a8..912e8516 100644 --- a/src/index.css +++ b/src/index.css @@ -16,6 +16,12 @@ --blue-color: royalblue; --purple-color: blueviolet; + --purple-fg-color: color-mix( + in srgb-linear, + var(--purple-color) 60%, + var(--text-color) 40% + ); + --purple-bg-color: color-mix(in srgb, var(--purple-color) 10%, transparent); --green-color: darkgreen; --orange-color: darkorange; --orange-light-bg-color: color-mix( @@ -23,7 +29,18 @@ var(--orange-color) 20%, transparent ); + --orange-fg-color: color-mix( + in srgb-linear, + var(--orange-color) 60%, + var(--text-color) 40% + ); + --orange-bg-color: color-mix(in srgb, var(--orange-color) 10%, transparent); --red-color: orangered; + --red-text-color: color-mix( + in srgb-linear, + var(--red-color) 60%, + var(--text-color) 40% + ); --red-bg-color: color-mix(in lch, var(--red-color) 40%, transparent); --bg-color: #fff; --bg-faded-color: #f0f2f5; @@ -67,11 +84,13 @@ var(--text-color) 60% ); --outline-color: rgba(128, 128, 128, 0.2); + --outline-stronger-color: rgba(128, 128, 128, 0.4); --outline-hover-color: rgba(128, 128, 128, 0.7); --divider-color: rgba(0, 0, 0, 0.1); --backdrop-color: rgba(0, 0, 0, 0.1); + --backdrop-solid-color: color-mix(in srgb, var(--bg-color) 90%, #000 10%); + --backdrop-theme-color: #e5e5e5; --backdrop-darker-color: rgba(0, 0, 0, 0.25); - --backdrop-solid-color: #eee; --img-bg-color: rgba(128, 128, 128, 0.2); --loader-color: #1c1e2199; --comment-line-color: #e5e5e5; @@ -91,6 +110,19 @@ --timing-function: cubic-bezier(0.3, 0.5, 0, 1); --spring-timing-funtion: cubic-bezier(0.175, 0.885, 0.32, 1.275); + + --min-dimension: 88px; + + --forward: right; + --backward: left; + --to-forward: to right; + --to-backward: to left; + &:dir(rtl) { + --forward: left; + --backward: right; + --to-forward: to left; + --to-backward: to right; + } } @media (min-resolution: 2dppx) { @@ -119,13 +151,19 @@ mediumslateblue 70%, var(--text-color) 30% ); + --button-bg-color: color-mix( + in srgb, + var(--blue-color) 80%, + var(--bg-color) 20% + ); --reblog-faded-color: #b190f141; --reply-to-text-color: var(--reply-to-color); --reply-to-faded-color: #ffa60017; --divider-color: rgba(255, 255, 255, 0.1); --bg-blur-color: #24252699; --backdrop-color: rgba(0, 0, 0, 0.5); - --backdrop-solid-color: #111; + --backdrop-solid-color: color-mix(in srgb, var(--bg-color) 50%, #000 50%); + --backdrop-theme-color: #121213; /* same as backdrop-solid-color but without color-mix, to be used for meta[theme-color] */ --loader-color: #f0f2f599; --comment-line-color: #565656; --drop-shadow-color: rgba(0, 0, 0, 0.5); @@ -227,7 +265,7 @@ button[hidden] { } :is(button, .button):not(:disabled, .disabled):is(:hover, :focus) { cursor: pointer; - filter: brightness(1.2); + filter: brightness(1.05); } :is(button, .button):not(:disabled, .disabled):active { filter: brightness(0.8); @@ -328,6 +366,7 @@ button[hidden] { } input[type='text'], +input[type='search'], textarea, select { color: var(--text-color); @@ -337,6 +376,7 @@ select { border-radius: 4px; } input[type='text']:focus, +input[type='search']:focus, textarea:focus, select:focus { border-color: var(--outline-color); @@ -352,16 +392,22 @@ textarea:disabled { background-color: var(--bg-faded-color); } -:is(input[type='text'], textarea, select).block { +:is(input[type='text'], input[type='search'], textarea, select).block { display: block; width: 100%; } -button.small { +:is(button, .button, select).small { font-size: 90%; padding: 4px 8px; } +.button.centered { + display: inline-flex; + justify-content: center; + align-items: center; +} + select.plain { border: 0; background-color: transparent; @@ -415,6 +461,11 @@ kbd { display: initial; } +.bidi-isolate { + direction: initial; + unicode-bidi: isolate; +} + /* KEYFRAMES */ @keyframes appear { @@ -526,3 +577,9 @@ kbd { .shazam-container-horizontal[hidden] { grid-template-columns: 0fr; } + +@keyframes spin { + to { + transform: rotate(360deg); + } +} diff --git a/src/locales.js b/src/locales.js new file mode 100644 index 00000000..b19934c6 --- /dev/null +++ b/src/locales.js @@ -0,0 +1,26 @@ +import catalogs from './data/catalogs.json'; + +export const DEFAULT_LANG = 'en'; +export const CATALOGS = catalogs; + +// Get locales that's >= X% translated +const PERCENTAGE_THRESHOLD = 50; + +const locales = [ + DEFAULT_LANG, + ...catalogs + .filter(({ completion }) => completion >= PERCENTAGE_THRESHOLD) + .map(({ code }) => code), +]; +export const LOCALES = locales; + +let devLocales = []; +if (import.meta.env?.DEV || import.meta.env?.PHANPY_SHOW_DEV_LOCALES) { + devLocales = catalogs + .filter(({ completion }) => completion < PERCENTAGE_THRESHOLD) + .map(({ code }) => code); + devLocales.push('pseudo-LOCALE'); +} +export const DEV_LOCALES = devLocales; + +export const ALL_LOCALES = [...locales, ...devLocales]; diff --git a/src/locales/ar-SA.po b/src/locales/ar-SA.po new file mode 100644 index 00000000..3c58a72d --- /dev/null +++ b/src/locales/ar-SA.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ar\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Arabic\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: ar\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "مقفل" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "المشاركات: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "آخر مشاركة: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "مجموعة" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "متبادل" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "مطلوب" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "يُتابِعُك" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "تم التحقق منه" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "انضم في <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "إلى الأبد" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "تعذر تحميل الحساب." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "الانتقال إلى صفحة الحساب" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "مُتابِعون" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "منشورات" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "المزيد" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "الذهاب إلى الصفحة الشخصية الأصلية" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "" + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "الأصلي" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "الردود" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "المعاد نشرها" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "" + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "آخر منشور: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "محظور" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "تعديل الملاحظة الخاصة" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "إضافة ملاحظة خاصة" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "تعطيل الإشعارات" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "تمكين الإشعارات" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "" + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "تعذر نسخ الرابط" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "نسخ" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "لا يبدو أن المشاركة ناجحة." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "مشاركة…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "تعديل المِلَفّ الشخصي" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "متابعة" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "غلق" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "ترجمة النبذة التعريفية" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "ليس هناك قوائم." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "قائمة جديدة" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "إلغاء" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "حفظ وغلق" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "تعذر تحديث الملف الشخصي." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "التسمية" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "المحتوى" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "حفظ" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "اسم المستخدم" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "إسم نطاق الخادم" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "الرئيسي" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "إنشاء" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 "" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "للعامة" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "المحلي" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "انشر ردّك" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "ما الجديد؟" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "إضافة" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "تحديث" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "انشر" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "المزيد…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "إزالة" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "خطأ" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "تعديل وصف الصورة" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "تعديل وصف الفيديو" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "تحرير وصف المقطع الصوتي" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "إنشاء الوصف. يرجى الانتظار…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "تم" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "الخيار {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "خيارات متعددة" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "المدّة" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "إزالة استطلاع الرأي" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "البحث عن حسابات" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "حدث خطأ أثناء تحميل الحسابات" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "الرموز التعبيرية المخصصة" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "البحث في الرموز التعبيرية" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "خطأ في تحميل الرموز التعبيرية المخصصة" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "المستخدمة مؤخراً" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "أخرى" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "" + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "حذف…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "" + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "الحسابات" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "اختصارات لوحة المفاتيح" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "المنشور التالي" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "المنشور السابق" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "البحث" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "إعادة نشر" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "علامة مرجعية" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "تعديل القائمة" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "إنشاء" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "ترجمة" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "نطق" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "وصف الصورة…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "عرض المنشور" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "وسائط حساسة" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "القائمة" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "الإشارات" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "الإشعارات" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "الملف التعريفي الشخصي" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "الإشارات المرجعية" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "إعجابات" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "الحسابات…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "الرائجة" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "الفديرالي" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "الاختصارات / الأعمدة…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "الإعدادات…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "القوائم" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "كافة القوائم" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "نشر {account} منشورا." + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "تعلم المزيد <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "اقرأ المزيد ←" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "صوتت" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "إخفاء النتائج" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "صوِّت" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "إنعاش" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "إظهار النتائج" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "مزعج" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "روابط خبيثة أو تفاعل كاذب أو ردود متكررة" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "غير قانوني" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "ينتهك قانون بلدك أو دولة الخادم" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "يخالف قواعد الخادم" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "معلومات إضافية" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "إضافة عمود…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "إضافة اختصار…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "تعديل الاختصارات" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "إضافة اختصار" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "استيراد…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "تصدير" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "تم نسخ الاختصارات" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "تعذر نسخ الاختصارات" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "تم نسخ إعدادات الاختصار" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "تعذر نسخ إعدادات الاختصار" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "مشاركة" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "إلغاء إعادة النشر" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "اقتباس" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "ألغيت إعادة نشر منشور @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "إعادة نشر…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "أعيد نشره" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "جارٍ التحميل…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "الرموز التعبيرية:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "الملاحظات:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "معاينة" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "ملاحظة: هذه المعاينة ذات نمط خفيف." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "منشورات جديدة" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "حاول مجددًا" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "مناقشة" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "الترجمة جارية…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "ترجمة من {sourceLangText} (اكتشاف تلقائي)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "ترجمة من {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "تلقائي ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "منشورات الحساب" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "مسح" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- المعاد نشرها" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "الشهر" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "الحالي" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "افتراضي" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "عرض الملف الشخصي…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "تعيين كإفتراضي" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "مغادرة…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "إضافة حساب موجود" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "مساعدة" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "ما هذا؟" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "التاريخ" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "الكثافة" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "الناشرون" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "بلا" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "إظهار كل الناشرين" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "لا يتوجب عليك قراءة كل شيء." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "هذا كل شيء." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "الملفات التعريفية" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "أبدًا" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "عامل تصفية جديد" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "إضافة عامل تصفية" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "تعديل عامل التصفية" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "تعذر تعديل عامل التصفية" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "تعذر إنشاء عامل التصفية" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "العنوان" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "الكلمة بأكملها" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "لا توجد كلمات مفتاحية. أضف واحدة." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "إضافة كلمة مفتاحية" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "الذهاب إلى خادم آخر…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "الانتقال إلى خادمي (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "لا تمتلك حسابا؟ أنشئ واحد!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "الإشارات الخاصة" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "خاص" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "اليوم" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "البارحة" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "الخط الزمني المحلي ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "الخيط الزمني الفدرالي ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "الخيط الزمني المحلي" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "الخيط الفيدرالي" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "البحث: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "الوُسوم" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "عرض المزيد" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "عرض المزيد من الحسابات" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "لم يتم العثور على أي حساب." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "شاهد المزيد من الوسوم" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "عرض المزيد من المنشورات" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "لم يتم العثور على أي منشور." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "الإعدادات" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "المظهر" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "فاتح" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "داكن" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "تلقائي" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "حجم النص" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "لغة العرض" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "النشر" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "مدى الرؤية الافتراضي" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "تمت المزامنة" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "فشل تحديث خصوصية النشر" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "التجارب" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "ترجمة المنشور" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "ترجمة إلى" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "لغة النظام ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "ترجمة تلقائية مضمنة" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "استطلاعات الرأي" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "تعديلات المنشور" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "خطأ: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "الانتقال إلى خادمي لتمكين التفاعلات" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "تعذر تحميل الردود." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "عودة" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "انتقل إلى المنشور الرئيس" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "تجريبي" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "تعذر التحويل" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "المنشورات الرائجة" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "لِج عبر ماستدون" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "إنشاء حساب" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "قم بتوصيل حساب ماستدون/الفديفرس الخاص بك.<0/>بيانات الاعتماد الخاصة بك غير مخزنة على هذا الخادم." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/ca-ES.po b/src/locales/ca-ES.po new file mode 100644 index 00000000..bc4b993f --- /dev/null +++ b/src/locales/ca-ES.po @@ -0,0 +1,3809 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ca\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Catalan\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: ca\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Blocada" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Publicacions: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Última publicació: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatitzat" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Grup" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Mutu" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Sol·licitat per" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Seguint-ne" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Et segueix" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount , plural, one {# seguidor} other {# seguidors}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Verificat" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "S'hi va unir <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Per sempre" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "No es pot carregar el compte." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Ves a la pàgina del compte" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Seguidors" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Seguint-ne" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Publicacions" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Més" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> ha indicat que té un nou compte:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Identificador copiat" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "No ha sigut possible copiar l'identificador d'usuari" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Copia l'identificador d'usuari" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Ves a la pàgina del perfil original" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Veure imatge de perfil" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Veure imatge de la capçalera" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "En 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 "Aquest usuari ha decidit no mostrar aquesta informació." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} publicacions originals, {1} respostes, {2} impulsos" + +#: 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 publicació en el darrer dia} other {Última publicació en els darrers {2} dies}}} other {{3, plural, one {Últimes {4} publicacions en el darrer dia} other {Últimes {5} publicacions en els darrers {6} dies}}}}" + +#: 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 publicació en el darrer any(s)} other {Últimes {1} publicacions en el darrer any(s)}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Original" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Respostes" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Impulsos" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Les estadístiques de les publicacions no estan disponibles." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Veure estadístiques de les publicacions" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Última publicació: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Usuaris silenciats" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Usuaris blocats" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Nota privada" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Menciona a <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Tradueix la biografia" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Edita una nota privada" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Afegiu una nota privada" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "S'han activat les publicacions de @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "S'han desactivat les publicacions de @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Desactiva les notificacions" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Activa les notificacions" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Impulsos de @{username} permesos." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Impulsos de @{username} inhabilitats." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Desactiva els impulsos" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Activa els impulsos" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Afegeix/elimina de les llistes" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Enllaç copiat" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "No estat possible copiar l'enllaç" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Copia" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Sembla que la compartició no funciona." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Comparteix…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "@{username} s'ha deixat de silenciar" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Deixa de silenciar a <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Silencia a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} silenciat durant {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "No ha estat possible silenciar @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Voleu suprimir a <0>@{username}</0> dels seguidors?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "S'ha eliminat @{username} de la llista de seguidors" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Suprimeix seguidor…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Voleu blocar a <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "S'ha desblocat a @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "S'ha blocat a @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "No ha estat possible desblocar @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "No ha estat possible blocar @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Deixa de blocar a <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Bloca a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Denúncia a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Edita el perfil" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Voleu retirar la sol·licitud de seguiment?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Voleu deixar de seguir @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Deixa de seguir…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Descarta…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Segueix" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Tanca" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Biografia traduïda" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "No s'ha pogut eliminar de la llista." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "No s'ha pogut afegir a la llista." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "No s'ha pogut carregar les llistes." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "No hi ha cap llista." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Llista nova" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Nota privada sobre <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "No ha estat possible actualitzar la nota privada." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Cancel·la" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Desa i tanca" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "No ha estat possible actualitzar el perfil." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nom" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Biografia" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Camps addicionals" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etiqueta" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Contingut" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Desa" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "nom d’usuari" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "nom de domini del servidor" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Mode ocult desactivat" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Mode ocult activat" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Inici" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Redacta" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Afegeix un mitjà" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Afegeix emoji personalitzat" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Afegeix un GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Afegeix una enquesta" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Hi ha canvis sense desar. Voleu descartar la publicació?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {{1} fitxer no és compatible.} other {{2} fitxers no són compatibles.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Només podeu adjuntar com a màxim 1 fitxer.} other {Només podeu adjuntar un màxim de # fitxers.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Finestra emergent" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimitza" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Sembla que heu tancat la finestra principal." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Sembla que ja teniu un camp d'edició obert a la finestra principal i que esteu publicant. Espereu que es publiqui i torneu-ho a provar més tard." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Sembla que ja teniu un camp d'edició obert a la finestra principal. Si l'utilitzeu en aquesta finestra, es descartaran els canvis que heu fet a la finestra principal. Voleu continuar?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Mostra" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Contestant la publicació de @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "En resposta a la publicació de @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Editant la publicació original" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "L'enquesta ha de tenir si més no 2 opcions" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Alguna opció de l'enquesta és buida" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Alguns mitjans no tenen descripcions. Voleu continuar?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "El fitxer adjunt #{i} ha fallat" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Avís de contingut" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Advertiment de contingut o mitjans sensibles" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Públic" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Local" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Sense llistar" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Només per als seguidors" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Menció privada" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Publica la resposta" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Edita la publicació" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Què feu ara?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Marca els mitjans com a sensibles" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Afegeix" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Respon" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Actualitza" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Publica" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "S'està baixant el GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Ha fallat la descàrrega del GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Més…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Pujat" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Descripció de la imatge" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Descripció del vídeo" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Descripció de l'àudio" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "La mida del fitxer és massa gran. La càrrega pot tenir problemes. Proveu de reduir la mida del fitxer de {0} a {1} o inferior." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "La resolució del fitxer és massa gran. La càrrega pot tenir problemes. Proveu de reduir la resolució de {0}×{1}px a {2}×{3}px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "La velocitat de fotogrames és massa alta. La càrrega pot tenir problemes." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Suprimeix" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Error" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Edita la descripció de la imatge" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Edita la descripció del vídeo" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Edita la descripció de l'àudio" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Generant descripció. Si us plau, espereu…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "No s'ha pogut generar la descripció: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "No s'ha pogut generar la descripció" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Genera una descripció…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "No s'ha pogut generar la descripció{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— experimental</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Fet" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Opció {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Opció múltiple" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Durada" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Elimina l'enquesta" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Cerca comptes" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "S'ha produït un error en carregar els comptes" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Emojis personalitzats" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Cerca emoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "S'ha produït un error en carregar els emojis personalitzats" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Usats recentment" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Altres" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} més…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Cerca GIF" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Desenvolupat per GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Escriviu per cercar un GIF" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Anterior" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Següent" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "S'ha produït un error en carregar els GIF" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Esborranys no enviats" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Sembla que hi ha esborranys sense enviar. Continuarem on ho vau deixar." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Voleu suprimir aquesta esborrany?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Error quan desava l'esborrany. Torneu a intentar-ho." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Esborra…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "S'ha produït un error en obtenir l'estat de resposta!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Voleu suprimir tots els esborranys?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "S'ha produït un error en suprimir els esborranys! Si us plau, torna-ho a provar." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Elimina-ho tot…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "No s'han trobat esborranys." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Enquesta" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Multimèdia" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Obre en una finestra nova" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Accepta" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Rebutja" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Acceptat" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Rebutjat" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Res a mostrar" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Comptes" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Mostra'n més…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Final." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Dreceres de teclat" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Ajuda sobre dreceres de teclat" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Publicació següent" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Publicació anterior" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Omet el carrusel a la següent publicació" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Omet el carrusel a l'anterior publicació" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Carrega publicacions noves" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Obre els detalls de la publicació" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> o bé <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Amplieu l'avís de contingut o<0/>canvia al fil ampliat/replegat" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Tanca la publicació o els diàlegs" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> o <1>Retrocés</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Centra la columna en mode de múltiples columnes" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> a <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Centra la columna següent en mode de múltiples columnes" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Centra la columna anterior en mode de múltiples columnes" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Redacta una publicació nova" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Redacta una publicació nova (en una altra finestra)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Envia la publicació" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> o <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Cerca" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Respon (en una altra finestra)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "M'agrada (favorit)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> o <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Impulsa" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Afegeix als marcadors" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Alterna el mode ocult" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Edita la llista" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "No s'ha pogut editar la llista." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "No s'ha pogut crear la llista." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Mostra les respostes dels membres de la llista" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Mostra les respostes de gent que segueixo" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "No mostris les respostes" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Amaga les publicacions d'inici/seguint en aquesta llista" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Crea" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Voleu suprimir aquesta llista?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "No s'ha pogut esborrar la llista." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Descripció dels mitjans" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Tradueix" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Pronuncia" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Obre el fitxer original en una finestra nova" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Obre el fitxer original" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Intentant descriure la imatge. Si us plau, espereu…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "No s'ha pogut descriure la imatge" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Descriu la imatge…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Mostra la publicació" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Contingut sensible" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtrat: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrat" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Publicació enviada. Comproveu-la." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Resposta enviada. Comproveu-la." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Publicació actualitzada. Comproveu-la." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menú" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Voleu tornar a carregar la pàgina per actualitzar-la?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nova actualització disponible…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Seguint-ne" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Posada al dia" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Mencions" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Notificacions" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Nou" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Perfil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Marcadors" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "\"M'agrada\"" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Etiquetes seguides" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtres" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Usuaris silenciats" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Usuaris silenciats…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Usuaris blocats" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Usuaris blocats…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Comptes…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Inicia sessió" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Tendències" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federada" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Dreceres / Columnes…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Configuració…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Llistes" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Totes les llistes" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Notificació" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Aquesta notificació és d'un altre compte vostre." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Mostra totes les notificacions" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} ha reaccionat a la vostra publicació \n" +"amb {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} ha compartit una publicació." + +#: src/components/notification.jsx:85 +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} ha impulsat la teva resposta.} other {{account} ha impulsat la teva publicació.}}} other {{account} ha impulsat {postsCount} de les teves publicacions.}}} other {{postType, select, reply {<0><1>{0}</1> persones</0> han impulsat la teva resposta.} other {<2><3>{1}</3> persones</2> han impulsat la teva publicació.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, one {}=1 {{account} et segueix.} other {<0><1>{0}</1> persones</0> et segueixen.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} ha enviat una sol·licitud de seguiment." + +#: src/components/notification.jsx:151 +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} li agrada la teva resposta.} other {{account} li agrada la teva publicació.}}} other {{account} li agrada {postsCount} de les teves publicacions.}}} other {{postType, select, reply {<0><1>{0}</1> persones</0> els agrada la teva resposta.} other {<2><3>{1}</3> persones</2> els agrada la teva publicació.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Ha finalitzat una enquesta vostra o en la qual heu participat." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Ha finalitzat una enquesta vostra." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Ha finalitzat una enquesta en què heu votat." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Una publicació amb què heu interactuat ha estat editada." + +#: src/components/notification.jsx:204 +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} ha impulsat i li agrada la teva resposta.} other {{account} ha impulsat i li agrada la teva publicació.}}} other {{account} ha impulsat i li agrada {postsCount} de les teves publicacions.}}} other {{postType, select, reply {<0><1>{0}</1> persones</0> han impulsat i els agrada la teva resposta.} other {<2><3>{1}</3> persones</2> han impulsat i els agrada la teva publicació.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} s'hi ha unit." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} ha denunciat a {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "S'han perdut les connexions amb <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Avís de moderació" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Un administrador de <0>{from}</0> ha suspès <1>{targetName}</1>; això vol dir que ja no en podreu rebre actualitzacions o interactuar-hi." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Un administrador de <0>{from}</0> ha blocat <1>{targetName}</1>. Seguidors afectats: {followersCount}, seguiments: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Heu bloquejat a <0>{targetName}</0>. Seguidors eliminats: {followersCount}, seguidors: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "El vostre compte ha rebut un avís de moderació." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "S'ha desactivat el vostre compte." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "S'ha marcat com a sensibles algunes de les vostres publicacions." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "S'han eliminat algunes de les vostres publicacions." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "A partir d'ara les vostres publicacions es marcaran com sensibles." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "S'ha limitat el vostre compte." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "El vostre compte ha estat suspès." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Tipus de notificació desconeguda: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Impulsat/Afavorit per…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Li agrada a…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Impulsat per…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Seguit per…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Saber-ne més <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Llegiu més →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Votat" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# vot} other {# vots}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Amaga els resultats" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Vota" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Actualitza" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Mostra els resultats" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> vot} other {<1>{1}</1> vots}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> votant} other {<1>{1}</1> votants}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Finalitzada<0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Finalitzada" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Finalitza <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Finalitza" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Contingut brossa" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Enllaços maliciosos, interacció falsa o respostes repetitives" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Il·legal" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Viola la llei del vostre país o del país on és el servidor" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Incompliment d'alguna regla del servidor" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Viola regles específiques del servidor" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Violació" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Altres" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "El problema no encaixa en altres categories" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Denuncia la publicació" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Informar sobre @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Pendent de revisió" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Publicació denunciada" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Perfil denunciat" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "No ha estat possible denunciar la publicació" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "No ha estat possible denunciar el perfil" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Quin és el problema amb aquesta publicació?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Quin és el problema amb aquest perfil?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Informació addicional" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Reenvia a <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Envia informe" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Silencia a @{username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "No ha estat possible silenciar a {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Envia l'informe <0>+ Silencia el perfil</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Bloca a {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "No ha estat possible blocar a {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Envia l'informe <0>+ Bloca el perfil</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ comptes, etiquetes i publicacions</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Publicacions amb <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Publicacions etiquetades amb <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Cerca <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Comptes amb <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Inici / Seguint" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Públic (Local / Federat)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Compte" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Etiqueta" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID de llista" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Només local" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instància" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Opcional, p. ex. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Cerca terme" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Opcional, tret que sigui per al mode de múltiples columnes" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "p. ex. PixelArt (màx. 5, separats per espais)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Només mèdia" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Dreceres" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Especifiqueu una llista de dreceres que apareixeran com a:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Botó flotant" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Pestanya/Barra de menú" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Múltiples columnes" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "No disponible en el mode de visualització actual" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Mou cap amunt" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Mou cap avall" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Edita" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Afegiu més d'una drecera/columna perquè funcioni." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "No hi ha columnes encara. Toqueu el botó Afegeix columna." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "No hi ha dreceres encara. Toqueu el botó Afegeix drecera." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "No saps què afegir?<0/>Prova d'afegir primer <1>Pàgina d'Inici / Seguint i notificacions</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Màxim {SHORTCUTS_LIMIT} columnes" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Màxim {SHORTCUTS_LIMIT} dreceres" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importa/exporta" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Afegeix una columna…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Afegeix una drecera…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "La llista específica és opcional. Per al mode de múltiples columnes, la llista és necessària, en cas contrari la columna no es mostrarà." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Per al mode de múltiples columnes, cal un terme de cerca, en cas contrari la columna no es mostrarà." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "S'admeten diverses etiquetes. Separades per espais." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Edita la drecera" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Afegeix una drecera" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Línia de temps" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Llista" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importar/exportar <0>dreceres</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importa" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Enganxeu dreceres aquí" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "S'estan baixant les dreceres desades a la instància del servidor…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "No es poden baixar les dreceres" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Baixeu les dreceres des de la instància del servidor" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "*Ja existeix a les dreceres actuals" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "És possible que la llista no funcioni si prové d'un compte diferent." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Format de configuració no vàlid" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Voleu afegir-hi les dreceres actuals?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Només s'afegiran les dreceres que no existeixen a les dreceres actuals." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "No hi ha dreceres noves per importar" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Dreceres importades. S'ha superat el màxim de {SHORTCUTS_LIMIT}, de manera que la resta no s'importaran." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Dreceres importades" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importa i annexa…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Voleu reemplaçar les dreceres actuals?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Voleu importar les dreceres?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "o reemplaçar-les…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importa…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exporta" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "S'han copiat les dreceres" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "No es poden copiar les dreceres" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "S'ha copiat la configuració de la drecera" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "No es pot copiar la configuració de la drecera" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Comparteix" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "S'estan desant les dreceres a la instància del servidor…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "S'han desat les dreceres" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "No es poden desar les dreceres" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sincronitza amb la instància del servidor" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0 , plural, one {# caràcter} other {# caràcters}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Dreceres JSON en brut" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importació o exportació de la configuració des de o cap a la instància del servidor (molt experimental)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>ha impulsat</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Ho sentim, la instància en què heu iniciat la sessió actual no pot interactuar amb aquesta publicació des d'una altra instància." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "La publicació de @{0} s'ha eliminat dels favorits" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "La publicació de @{0} s'ha afegit als favorits" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "La publicació de @{0} s'ha eliminat dels marcadors" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "La publicació de @{0} s'ha afegit als marcadors" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Desfés l'impuls" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Cita" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "No tots els mèdia tenen descripció." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Publicacions antigues (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "S'ha eliminat l'impuls de la publicació de @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Heu impulsat la publicació de @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Impulsa…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Ja no m'agrada" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "M'agrada" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Suprimeix l'adreça d'interès" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Mostra la publicació de <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Mostra l'historial d'edició" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Editat: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Insereix la publicació" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "La conversa ha deixat d'estar silenciada" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Conversa silenciada" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "No s'ha pogut reactivar la conversa" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "No ha estat possible silenciar la conversa" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Deixa de silenciar la conversa" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Silencia la conversa" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "La publicació ja no està fixada al perfil" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "La publicació s'ha fixat al perfil" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "No s'ha pogut desenganxar la publicació" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "No s'ha pogut desenganxar la publicació" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Desfixa del perfil" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Fixa al perfil" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Voleu suprimir aquesta publicació?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Publicació esborrada" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "No ha estat possible esborrar la publicació" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Denuncia la publicació…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "M'ha agradat" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Millorats" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Afegit a marcadors" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Fixat" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Eliminat" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# resposta} other {# respostes}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Fil{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Mostra'n menys" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Mostra el contingut" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Mostra els mèdia" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Editat" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Comentaris" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Més de <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Edita l'Historial" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "No s'ha pogut carregar l'historial" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Carregant…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "Codi HTML" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Codi HTML copiat" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "No ha estat possible copiar el codi HTML" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Adjunts multimèdia:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Emojis d'aquest compte:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL estàtic" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojis:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notes:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Això és estàtic, sense estil i sense guió. És possible que hàgiu d'aplicar els vostres propis estils i editar-los segons sigui necessari." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Les enquestes no són interactives, es converteixen en una llista amb recompte de vots." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Els mèdia adjunts poden ser imatges, vídeos, àudios o qualsevol altre tipus de fitxer." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "La publicació pot ser editada o eliminada després." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Vista prèvia" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Nota: a aquesta vista prèvia se li ha aplicat cert estil." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> ha impulsat" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Publicacions noves" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Torna-ho a provar" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# impuls} other {# impulsos}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Publicacions fixades" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Fil" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtrat</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Traducció automàtica des del {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Traducció en procés…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Tradueix des del {sourceLangText} (autodetectat)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Tradueix des del {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Automàtic ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "No s'ha pogut traduir" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "S'està editant la publicació original" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "En resposta a @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Podeu tancar aquesta pàgina ara." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Tanca la finestra" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Cal iniciar sessió." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Ves a la pàgina d'inici" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Publicacions del compte" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Respostes)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Impulsos)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Mèdia)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Neteja els filtres" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Neteja" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Es mostren les publicacions amb respostes" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Respostes" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Es mostren publicacions sense impulsos" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Impulsos" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Es mostren les publicacions amb mèdia" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Es mostren les publicacions etiquetades amb #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Es mostren publicacions a {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "No hi ha res a veure encara." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "No ha estat possible carregar les publicacions" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "No ha estat possible la informació del compte" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Canvia a la instància del compte {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Canvia a la meva instància (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Mes" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Actual" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Per defecte" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Canvia a aquest compte" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Canvia a una pestanya/finestra nova" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Veure el perfil…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Estableix com a predeterminat" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Voleu tancar la sessió de <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Tanca la sessió…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Afegeix un compte existent" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Nota: el compte <0>Per defecte</0> sempre s'utilitzarà per a la primera càrrega. Si canvieu de compte, aquest es mantindrà obert durant la sessió." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "No teniu marcadors. Cerqueu alguna cosa per guardar!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "No es poden carregar les adreces d'interès." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "l'última hora" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "les últimes 2 hores" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "les últimes 3 hores" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "les últimes 4 hores" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "les últimes 5 hores" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "les últimes 6 hores" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "les últimes 7 hores" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "les últimes 8 hores" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "de les últimes 9 hores" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "les últimes 10 hores" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "les últimes 11 hores" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "les últimes 12 hores" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "més de 12 hores" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Etiquetes seguides" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +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 {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Posada al dia <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Ajuda" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Què és això?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Posada al dia és una línia de temps independent per als vostre seguiments, que ofereix una visió ràpida i precisa, amb una interfície senzilla inspirada en el correu electrònic que permet ordenar i filtrar les publicacions sense esforç." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Vista prèvia de la interfície de Posada al dia" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Posem-nos al dia" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Poseu-vos al dia amb les publicacions de les persones que seguiu." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Mostra'm totes les publicacions de…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "fins al màxim" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Posada al dia" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Superposa amb la darrera posada al dia" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Fins a l'última posada al dia ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Nota: la vostra instància només pot mostrar un màxim de 800 publicacions a la línia de temps d'inici, independentment de l'interval de temps. Aquest valor podria variar." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Anteriorment…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# publicació} other {# publicacions}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Voleu eliminar aquesta posada al dia?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "S'està eliminant la Posada al dia {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "S'ha eliminat la Posada al dia {0}" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Nota: només s'emmagatzemaran un màxim de 3. La resta s'eliminarà automàticament." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Recuperant publicacions…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Això pot trigar una estona." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Restableix els filtres" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Enllaços populars" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Compartit per {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Totes" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0 , plural, one {# autor} other {# autors}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Ordre" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Data" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Densitat" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Filtra" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autors" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Cap" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Mostra tots els autors" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "No cal que ho llegiu tot." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Això és tot." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Torna a dalt" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Enllaços compartits pels vostres seguits, ordenats per recomptes de compartits, impulsos i M'agrada." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Ordre: Densitat" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Les publicacions s'ordenen per densitat o quantitat d'informació. Les publicacions més curtes són \"més lleugeres\" mentre que les publicacions més llargues són \"més pesades\". Les publicacions amb fotos són \"més pesades\" que les publicacions sense fotos." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Grup: Autors" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Les publicacions s'agrupen per autors, ordenades pel nombre de publicacions per autor." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Actor següent" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Autor anterior" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Torna a dalt" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtrat: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "No teniu favorits. Cerqueu alguna cosa que us agradi!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "No ha estat possible carregar els favorits." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Inici i llistes" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Línies de temps públiques" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Converses" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Perfils" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Mai" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Filtre nou" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0 , plural, one {# filtre} other {# filtres}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "No ha estat possible carregar els filtres." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Encara no hi ha cap filtre." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Afegeix un filtre" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Edita el filtre" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "No ha estat possible editar el filtre" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "No ha estat possible crear el filtre" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Títol" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Paraula sencera" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "No hi ha paraules clau. Afegiu-ne una." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Afegeix una paraula clau" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# paraula clau} other {# paraules clau}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtra des de…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Encara no s'ha implementat" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Status: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Canvia la caducitat" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Caducitat" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "La publicació filtrada serà…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimitzada" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "oculta" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Voleu suprimir aquest filtre?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "No ha estat possible esborrar el filtre." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Ha vençut" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Finalitza en <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "No caduca mai" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# etiqueta} other {# etiquetes}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "No ha estat possible carregar les etiquetes seguides." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Encara no seguiu cap etiqueta." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "No hi ha res a veure ací." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "No ha estat possible carregar les publicacions." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (només multimèdia) a {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} a {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (només multimèdia)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Ningú ha publicat res encara amb aquesta etiqueta." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "No ha estat possible carregar les publicacions amb aquesta etiqueta" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Voleu deixar de seguir #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Deixa de seguir l'etiqueta #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Etiquetes seguides #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Seguint…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "No es mostra al perfil" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "No s'ha eliminat dels elements destacats del perfil" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Destacades al perfil" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Destaca al perfil" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {}other {Màxim de # etiquetes}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Afegeix etiqueta" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Elimina etiqueta" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {S'ha arribat al màxim de # drecera. No es pot afegir un altra.} other {S'ha arribat al màxim de # dreceres. No es pot afegir un altra.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Aquesta drecera ja existeix" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "S'ha afegit una drecera a l'etiqueta" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Afegeix a les dreceres" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Introduïu una nova instància, p. ex. \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "La instància no és vàlida" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Ves a una altra instància…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Ves a la meva instància (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "No ha estat possible recuperar les notificacions." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Noves</0> <1>sol·licituds de seguiment</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Veure-ho tot" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "S'està resolent…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "No es pot resoldre l'URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Encara res." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Gestiona els membres" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Voleu suprimir a <0>@{0}</0> de la llista?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Suprimeix…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# llista} other {# llistes}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Encara no hi ha cap llista." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "No s'ha pogut registrar l'aplicació" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "domini de la instància" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "p. ex. \"mastodont.social\"" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "No s'ha pogut iniciar la sessió. Torneu-ho a provar o canvieu d'instància." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Continueu amb {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Continua" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "No hi teniu compte? Creeu-n'hi un!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Mencions privades" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privat" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Ningú us ha esmentat :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "No ha estat possible carregar les mencions." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "No segueixes" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Qui no et segueix" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Amb un compte nou" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Amb menció privada no sol·licitada" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Qui està limitat per la moderació del servidor" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Configuració de les notificacions" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Notificacions noves" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Anunci} other {Anuncis}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Sol·licituds de seguiment" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# petició de seguiment} other {# peticions de seguiment}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Notificacions filtrades d'# persona} other {Notificacions filtrades de # persones}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Només mencions" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Avui" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Ja les heu vist totes." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Ahir" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "No s'han carregat les notificacions" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "S’ha actualitzat la configuració de notificacions" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Exclou les notificacions de:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtra" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignora" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Actualitzat <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Consulteu les notificacions de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Notificacions de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Les notificacions de @{0} no es filtraran a partir d'ara." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "No es pot acceptar la sol·licitud de notificació" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Permet" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Les notificacions de @{0} no es mostraran a les Notificacions filtrades a partir d'ara." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "No s'ha pogut descartar la sol·licitud de notificació" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Ometre" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Omeses" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Línia de temps local ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Línia de temps federada ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Línia de temps local" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Línia de temps federada" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Ningú ha publicat res encara." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Canvia a federada" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Canvia a local" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Cerca: {q} (publicacions)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Cerca: {q} (comptes)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Cerca: {q} (etiquetes)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Cerca: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Etiquetes" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Mostra'n més" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Veure més comptes" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "No s'ha trobat cap compte." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Veure més etiquetes" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "No s'ha trobat cap etiqueta." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Veure més publicacions" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "No s'ha trobat cap publicació." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Introduïu el vostre terme de cerca o enganxeu un URL a dalt per començar." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Configuració" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Aparença" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Clar" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Fosc" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automàtic" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Mida del text" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Llengua de visualització" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Ajudeu a traduir" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Publicacions" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Visibilitat per defecte" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "S'ha sincronitzat" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "No s'ha pogut actualitzar la privadesa de la publicació" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Sincronitzat amb la configuració de la instància del servidor. \n" +"<0>Aneu a la vostra instància ({instance}) per realitzar més canvis en la configuració.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Funcions experimentals" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Actualitza automàticament les publicacions de la línia de temps" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Carrusel d'impulsos" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Traducció de les publicacions" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Tradueix a" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Llengua del sistema ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {Amaga el botó \"Tradueix\" per a:} other {Amaga el botó \"Tradueix\" per a (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Nota: aquesta funcionalitat utilitza serveis de traducció externs, amb la tecnologia <0>Lingva API</0> i <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Traducció automàtica en línia" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Mostra automàticament la traducció de les publicacions a la línia de temps. Només funciona per a publicacions <0>breus</0> sense advertència de contingut, contingut multimèdia o enquesta." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Selector de GIF per a compositor" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Nota: aquesta funcionalitat utilitza un servei de cerca GIF extern, impulsat per <0>GIPHY</0>. Classificació G (apte per a la visualització per a totes les edats), els paràmetres de seguiment s'eliminen, la informació de referència s'omet de les sol·licituds, però les consultes de cerca i la informació de l'adreça IP encara arribaran als seus servidors." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Generador de descripcions d'imatges" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Només per a imatges noves mentre es redacten publicacions noves." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Nota: aquesta funcionalitat utilitza un servei d'IA extern, impulsat per <0>img-alt-api</0>. Pot ser que no funcioni bé. Només per a imatges i en anglès." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Notificacions agrupades del servidor" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Funcionalitat en fase alfa. Finestra d'agrupació potencialment millorada, però amb una lògica d'agrupació bàsica." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Sincronitza la configuració al núvol" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Funcionalitat experimental.<0/>S'emmagatzemen en les notes del perfil propi. Les notes del perfil (privades) s'utilitzen principalment per altres perfils i estan amagades del perfil propi." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Nota: Aquesta funcionalitat utilitza l'API del servidor on l'usuari ha iniciat la sessió." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Mode ocult <0>(<1>Text</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Substitueix el text per blocs, útil per prendre captures de pantalla per raons de privacitat." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Quant a" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Creat</0> per <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Patrocinadors" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Donacions" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Política de privadesa" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Lloc web:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versió:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Informació de la versió copiada" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "No s'ha pogut copiar la versió" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "No s'ha actualitzat la subscripció. Si us plau, intenta-ho de nou." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "No s'ha eliminat la subscripció. Si us plau, intenta-ho de nou." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Notificacions (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Les notificacions estan bloquejades. Si us plau, activeu-les al vostre navegador." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Permet-les de <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "qualsevol" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "persones que segueixo" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "seguidors" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Seguiments" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Enquestes" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Edició de publicacions" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "No s'ha concedit el permís d'enviar notificacions des del darrer inici de sessió. Haureu d'<0><1>iniciar la sessió</1> de nou per concedir aquest permís</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "NOTA: les notificacions només funcionen per a <0>un compte</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Publicació" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "No heu iniciat la sessió. Les interaccions (resposta, impuls, etc.) no són possibles." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Aquesta publicació és d'una altra instància (<0>{instance}</0>). Les interaccions (resposta, impuls, etc.) no són possibles." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Error: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Canvia a la meva instància per permetre interaccions" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "No s'han pogut obtenir les respostes." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Enrere" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Ves a la publicació principal" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} publicacions més amunt ‒ Ves a la part superior" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Canvia a vista lateral" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Canvia a vista completa" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Mostra tot el contingut sensitiu" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Experimental" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "No s'ha pogut canviar" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Canvia a la instància de la publicació ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Canvia a la instància de la publicació" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "No ha estat possible carregar la publicació" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# resposta} other {<0>{1}</0> respostes}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# comentari} other {<0>{0}</0> comentaris}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Mostra la publicació amb respostes" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "En tendència ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Ara és tendència" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Per {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Torna a les publicacions en tendència" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Mostra publicacions mencionant <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Publicacions influents" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "No hi ha publicacions influents." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Un client web per Mastodon minimalista i original." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Inicia sessió amb Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Registreu-vos" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Connecta el teu compte de Mastodon/Fedivers.<0/>Les teves credencials no s'emmagatzemaran en aquest servidor." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Creat</0> per <1>@cheeaun</1>. <2>Política de Privadesa</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Captura del Carrusel d'impulsos" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Carrusel d'impulsos" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Separeu visualment les publicacions originals de les compartides (impulsos)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Captura de fil de comentaris imbricats" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Fil de comentaris imbricats" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Seguiu les converses sense esforç. Respostes minimitzades." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Captura de les notificacions agrupades" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Notificacions agrupades" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Les notificacions similars s'agrupen i es contrauen per reduir el desordre." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Captura de la interfície d'usuari del mode de múltiples columnes" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Única o múltiples columnes" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Per defecte, una única columna per qui busca tranquil·litat. Múltiples columnes configurables per a usuaris avançats." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Captura de la línia de temps de diverses etiquetes amb un formulari per afegir més etiquetes" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Línia de temps de diverses etiquetes" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Fins a 5 etiquetes combinades en una única línia de temps." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Sembla que el vostre navegador bloca les finestres emergents." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Actualment hi ha un esborrany minimitzat. Publiqueu-lo o descarteu-lo abans de crear-ne un de nou." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Actualment hi ha una publicació oberta. Publiqueu-la o descarteu-la abans de crear-ne una de nova." + diff --git a/src/locales/cs-CZ.po b/src/locales/cs-CZ.po new file mode 100644 index 00000000..9c7b5163 --- /dev/null +++ b/src/locales/cs-CZ.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: cs\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Czech\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: cs\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "uzamčeno" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Příspěvky: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Poslední příspěvek: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automaticky" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Skupina" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Vzájemné" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Vyžadováno" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Sleduji" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Sleduje vás" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# odpověď} few {# odpovědi} many {# odpovědi} other {# odpovědi}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Ověřeno" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Připojeno <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Navždy" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Účet nelze načíst." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Přejít na stránku účtu" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Sledující" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Příspěvky" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Více" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> naznačil, že jejich nový účet je nyní:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Uživatelské jméno X zkopírováno" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Nepodařilo se zkopírovat uživatelské jméno" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Zkopírovat uživatelské jméno" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Přejít na původní stránku profilu" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Zobrazit profilový obrázek" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Zobrazit hlavičku profilu" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "In Memoriam" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Tento uživatel se rozhodl nezpřístupnit tyto informace." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} původní příspěvky, {1} odpovědi, {2} zvyšuje" + +#: 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 "" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Originál" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Odpovědi" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Boosty" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Statistiky příspěvku nejsou k dispozici." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Zobrazit statistiky příspěvku" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Poslední příspěvek: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Ztlumeno" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Blokováno" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Soukromá poznámka" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Zmínit <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Přeložit bio" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Upravit soukromou poznámku" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Přidat soukromou poznámku" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Upozornění pro příspěvky od @{username} povolena." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Upozornění pro příspěvky od @{username} zakázána." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Vypnout oznámení" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Povolit oznámení" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Boosty od @{username} povoleny." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Boosty od @{username} zakázány." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Zakázat boosty" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Povolit boosty" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Přidat/odebrat ze seznamu" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Odkaz zkopírován" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Nebylo možné zkopírovat soubor" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopírovat" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Sdílení zřejmě nefunguje." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Sdílet…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Zrušeno ztišení @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Zrušit ztlumení <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Ztišit <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Ztlumený @{username} pro {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Nelze ztlumit @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Odstranit <0>@{username}</0> ze sledujících?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} odebrán ze sledujících" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Odstranit sledujícího…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Blokovat <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Odblokován @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Uživatel @{username} zablokován" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Nelze odblokovat uživatele @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Nelze zablokovat uživatele @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Odblokovat <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Blok <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Nahlásit <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Upravit profil" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Zrušit žádost o sledování?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Chcete přestat sledovat {0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Přestat sledovat…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Vybrat…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Sledovat" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Zavřít" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Přeložit bio" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Nelze odstranit ze seznamu." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Nelze přidat do seznamu." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Nelze načíst seznamy." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Žádné seznamy." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nový seznam" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Soukromá poznámka o <0> @{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Nelze aktualizovat soukromou poznámku." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Zrušit" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Uložit a zavřít" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Nelze aktualizovat profil." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Název" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "O mně" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Extra pole" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Štítek" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Obsah" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Uložit" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "uživatelské jméno" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "jméno domény serveru" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Režim zavření zakázán" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Režim skrytí aktivován" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Domovská stránka" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Vytvořit" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Přidat vlastní emoji" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Přidat anketu" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Máte neuložené změny. Zrušit tento příspěvek?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Můžete připojit pouze 1 soubor.} few {Můžete připojit pouze # souborů.} many {Můžete připojit pouze # souborů.} other {Můžete připojit pouze # souborů.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Vyskakovací okno" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimalizovat" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Zdá se, že jste zavřeli nadřazené okno." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Vypadá to, že již máte složené pole otevřené v nadřazeném okně a aktuálně publikované. Počkejte prosím, než se to udělá a zkuste to znovu později." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Vypadá to, že již máte v nadřazeném okně otevřené políčko. Vyskakování v tomto okně zruší změny, které jste provedli v nadřazeném okně. Pokračovat?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Ukázat v" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Odpovědět na příspěvek od @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Odpovídám na příspěvek uživatele @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Editace zdrojového příspěvku" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Anketa musí mít alespoň dvě možnosti" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Některé volby anket jsou prázdné" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Některá média jsou bez popisu. Pokračovat?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Příloha #{i} selhala" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Varování o obsahu" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Upozornění na obsah nebo citlivá média" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Veřejný" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Místní" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Neveřejný" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Pouze pro sledující" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Soukromá zmínka" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Poslat odpověď" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Upravit příspěvek" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Co děláte??" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Označit média jako citlivá" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Přidat" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Odpovědět" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Aktualizovat" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Příspěvek" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Stahování GIFu…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Nepodařilo se stáhnout GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Více…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Odesláno" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Popis obrázku" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Popis videa" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Popis audia" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +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žší." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Rozměr je příliš velký. Při nahrávání mohou vzniknout problémy. Zkuste zmenšit rozměr z {0}×{1}px na {2}×{3}px." + +#: src/components/compose.jsx:2451 +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:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Odstranit" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Chyba" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Upravit popis obrázku" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Upravit popis videa" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Upravit popis audia" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Generování popisu. Počkejte prosím…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Nepodařilo se vytvořit popis{0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Nepodařilo se vytvořit popis" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Vytvořit popis…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Nepodařilo se vytvořit popis{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>– experimentální</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Hotovo" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Volba {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Více možností" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Trvání" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Odstranit anketu" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Vyhledat účty" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Chyba při načítání účtů" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Vlastní emoji" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Vyhledat emoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Chyba při načítání vlastních emoji" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Nedávno použité" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Ostatní" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} další…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Hledat GIFy" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Poháněno GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Zadejte pro vyhledávání GIFů" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Zpět" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Další" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Chyba při načítání GIFů" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Neodeslané koncepty" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Vypadá to, že máte neodeslané koncepty. Pojďme pokračovat tam, kde jste skončili." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Smazat koncept?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Chyba při mazání konceptu. Zkuste to prosím znovu." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Smazat…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Chyba při načítání stavu odpovědi!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Smazat všechny koncepty?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Chyba při mazání konceptů! Zkuste to prosím znovu." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Smazat vše…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Nebyly nalezeny žádné koncepty." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Anketa" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Média" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Otevřít v novém okně" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Přijmout" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Odmítnout" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Přijato" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Odmítnuto" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Nic k zobrazení" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Účty" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Zobrazit více…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Konec." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Klávesové zkratky" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Nápověda pro klávesové zkratky" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Následující příspěvek" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Předchozí příspěvek" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Přeskočit carousel na další příspěvek" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0>+ <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Přeskočit na předchozí příspěvek v karuselu" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0>+ <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Načíst nové příspěvky" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Otevře detaily příspěvku" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> nebo <1>o </1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Rozbalit varování obsahu nebo<0/>přepínat rozšířené nebo sbalené vlákno" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Zavřít příspěvek nebo dialogové okno" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> nebo <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Zaměřit se na sloupec v režimu více sloupců" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> do <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Napsat nový příspěvek" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Napsat nový příspěvek (nové okno)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Odeslat příspěvek" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Hledat" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Odpovědět (nové okno)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Líbí se mi (oblíbené)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> nebo <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Boost" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Oblíbené položky" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Přepnout režim maskování" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Upravit seznam" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Seznam nelze upravit." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Seznam nelze vytvořit." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Zobrazit odpovědi členům seznamu" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Zobrazit odpovědi lidem, které sleduji" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Nezobrazovat odpovědi" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Skrýt příspěvky z tohoto seznamu na Domovské stránce/Sledované" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Vytvořit" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Smazat tento seznam?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Seznam nelze smazat." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Popis médií" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Přeložit" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Přečíst" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Otevřít originální média v novém okně" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Otevřít původní média" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Pokus o popis obrázku. Počkejte prosím,…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Nepodařilo se popsat obrázek" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Popište obrázek…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Zobrazit příspěvek" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Citlivá média" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtrováno: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrovaný" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Příspěvek zveřejněn. Podívejte se na něj." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Odpověď odeslána. Podívejte se na ni." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Příspěvek aktualizován. Podívejte se na něj." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menu" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Znovu načíst stránku a aktualizovat?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nová aktualizace k dispozici…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Rekapitulace" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Zmínky" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Oznámení" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Nový" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Záložky" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Líbí se mi" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Sledované hashtagy" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtry" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Ztlumení uživatelé" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Ztlumeni uživatelé…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Blokovaní uživatelé" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Blokovaní uživatelé…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Účty…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Přihlásit se" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Trendy" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federovaná" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Zkratky / Sloupce…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Nastavení…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Seznam" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Všechny seznamy" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Oznámení" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Toto oznámení pochází z vašeho dalšího účtu." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Zobrazit všechna oznámení" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} reagoval na váš příspěvek s {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} publikoval příspěvek." + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} vás začal sledovat.} few {<0><1>{0}</1> lidé</0> vás začali sledovat.} other {<0><1>{0}</1> lidí</0> vás začalo sledovat.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} vás požádal o sledování." + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Anketa, v níž jste hlasovali nebo byla vytvořena, skončila." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Anketa, kterou jste vytvořili, skončila." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Anketa, ve které jste hlasovali, skončila." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Příspěvek, na který jste reagovali, byl upraven." + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} se zaregistroval/a." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} nahlásil {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Ztraceno spojení s <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Upozornění na moderování" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Admin z <0>{from}</0> pozastavil účet <1>{targetName}</1>, což znamená, že už nemůžete přijímat jejich aktualizace ani s nimi komunikovat." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Admin z <0>{from}</0> zablokoval <1>{targetName}</1>. Počet ovlivněných sledujících: {followersCount}, sledovaných: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Zablokovali jste <0>{targetName}</0>. Odstranění sledujících: {followersCount}, následující: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Váš účet obdržel upozornění na moderování." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Váš účet je zablokován." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Některé z vašich příspěvků byly označeny jako citlivé." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Některé z vašich příspěvků byly odstraněny." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Vaše příspěvky budou od nynějška označeny jako citlivé." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Váš účet byl omezen." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Váš účet byl pozastaven." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Neznámý typ oznámení: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Boost/Líbilo se mi…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Líbí se…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Boostováno…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Sleduje…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Další informace <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Přečti si více →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Hlasoval/a" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Skrýt výsledky" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Hlasovat" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Obnovit" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Zobrazit výsledky" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> hlas} few {<1>{1}</1> hlasy} other {<1>{1}</1> hlasů}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> volič} few {<1>{1}</1> voliči} other {<1>{1}</1> voličů}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Skončilo <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Ukončeno" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Konec <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Ukončení" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Nevyžádané" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Škodlivé odkazy, falešné interakce nebo opakované odpovědi" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Nelegální" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Porušuje zákon vaší nebo země serveru" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Porušení pravidla serveru" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Porušuje specifická pravidla serveru" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Porušení" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Ostatní" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Problém neodpovídá ostatním kategoriím" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Nahlásit příspěvek" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Nahlásit @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Čeká na posouzení" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Příspěvek nahlášen" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Profil nahlášen" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Nelze nahlásit příspěvek" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Profil nelze nahlásit" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Jaký je s tímto příspěvkem problém?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Jaký je s tímto účtem problém?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Další informace" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Přeposlat na <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Odeslat hlášení" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Ztlumit {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Nebylo možné ztlumit {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Odeslat hlášení <0>+ ztlumit profil</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Zablokován {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Nelze zablokovat {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Odeslat hlášení <0>+ Blokovat profil</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ účty, hashtagy & příspěvky</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Příspěvky obsahující <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Příspěvky označené <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Vyhledat <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Účty s <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Domů / Sledování" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Veřejná (Lokální/Federovaná)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Účet" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Hashtag" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID seznamu" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Pouze místní" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instance" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Nepovinné, např. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Hledaný výraz" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Volitelné, pokud není pro více sloupců" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "např. PixelArt (Max 5, oddělený mezerami)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Pouze média" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Zkratky" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Zadejte seznam zkratek, které se zobrazí jako:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Plovoucí tlačítko" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Záložka/Panel nabídek" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Více sloupců" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Není k dispozici v aktuálním režimu zobrazení" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Posunout nahoru" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Dolů" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Upravit" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Přidejte více než jednu zkratku/sloupec, aby to fungovalo." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Zatím žádné sloupce. Klikněte na tlačítko Přidat sloupec." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Zatím žádné zkratky. Klepněte na tlačítko Přidat zkratku." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Nejste si jisti, co přidat?<0/>Zkuste nejdříve přidat <1>Domů / Sledování a oznámení</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Max {SHORTCUTS_LIMIT} sloupců" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Maximálně {SHORTCUTS_LIMIT} zkratek" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Import/export" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Přidat sloupec…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Přidat zkratku…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Specifický seznam je volitelný. Pro režim více sloupců je seznam povinný, jinak se sloupec nezobrazí." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Pro režim více sloupců je vyžadován hledaný výraz, jinak nebude sloupec zobrazen." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Podporováno je více hashtagů. Oddělené mezerami." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Upravit zkratky" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Přidat zkratku" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Časová osa" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Seznam" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importovat/Exportovat <0>Zástupce</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importovat" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Zde vložte zkratky" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Stahuji uložené zkratky z instance serveru…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Zkratky nelze stáhnout" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Stáhnout zkratky z instance serveru" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Existuje v aktuálních zkratkách" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Seznam nemusí fungovat, pokud je z jiného účtu." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Neplatný formát nastavení" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Existuje v aktuálních zkratkách?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Budou připojeny pouze zkratky, které v současných zkratkách neexistují." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Žádné nové zkratky k importu" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Zkratky importovány. Překročeno max. {SHORTCUTS_LIMIT}, zbytek tedy není importován." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Zkratky importovány" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importovat & připojit…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Přepsat aktuální zkratky?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Importovat zkratky?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "nebo přepsat…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importovat…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exportovat" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Zkratky zkopírovány" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Nelze kopírovat zkratky" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Nastavení zkratky zkopírováno" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Nelze kopírovat nastavení zástupce" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Sdílet" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Ukládání zkratek na instanci serveru…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Zkratky uloženy" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Zkratky nelze uložit" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Synchronizujte se serverem instance" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0,plural, one{# znak} few {# znaky} many {# znaků} other{# znaků}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Nezpracované zkratky JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importovat/exportovat nastavení z/do instance serveru (experimentální)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>boostnul</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Omlouváme se, vaše aktuální přihlášená instance nemůže komunikovat s tímto příspěvkem z jiné instance." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Nelíbí se @{0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Líbí se @{0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Odebrali jste záložku z příspěvku od @{0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Přidali jste příspěvek uživatele @{0} do záložek" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Zrušit boostnutí" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Citace" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Některá média jsou bez popisu." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Starý příspěvek (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Zrušili jste boostnutí příspěvku od @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Boostnuli jste @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Boostnout…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Nelíbí se mi" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Líbí se mi" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Odebrat záložku" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Zobrazit příspěvek od <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Ukázat historii úprav" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Upraveno: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Vložit příspěvek" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Ztlumení konverzace zrušeno" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Konverzace ztlumena" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Nelze zrušit ztlumení konverzace" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Nelze ztlumit konverzaci" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Zrušit ztlumení konverzace" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Ztlumit konverzaci" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Příspěvek odepnut z profilu" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Příspěvek připnut na profil" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Nelze odepnout příspěvek" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Příspěvek nelze připnout" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Odepnout z profilu" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Připnout na profil" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Smazat tento příspěvek?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Příspěvek odstraněn" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Příspěvek nelze odstranit" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Nahlásit příspěvek…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Líbí se" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Boosty" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Záložky" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Připnuto" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Smazat" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# odpověď} few {# odpovědi} many {# odpovědi} other {# odpovědi}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Vlákna{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Zobrazit méně" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Zobrazit obsah" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Zobrazit média" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Upraveno" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Komentáře" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Historie úprav" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Nepodařilo se načíst historii" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Načítání…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML kód" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML kód zkopírován" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Nelze kopírovat HTML kód" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Přílohy médií:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Emoji účtu:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "statická URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emoji:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Poznámky:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Toto je statické, nestylizované a bez skriptů. Možná budete muset použít vlastní styly a podle potřeby upravovat." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Hlasování v anketách není interaktivní, místo toho se zobrazí seznam s počty hlasů." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Mediální přílohy mohou být obrázky, videa, audio nebo jakékoli typy souborů." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Příspěvek může být později upraven nebo odstraněn." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Náhled" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Poznámka: Tento náhled je lehce stylizovaný." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/><1/> boostnuto" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Nové příspěvky" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Zkuste to znovu" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Připnuté příspěvky" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Vlákno" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtrované</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Automaticky přeloženo z {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Překlad…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Přeložit z {sourceLangText} (detekováno automaticky)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Přeložit z {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Auto ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Překlad se nezdařil" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Odpověď @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Nyní můžete tuto stránku zavřít." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Zavřít okno" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Vyžadováno přihlášení." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Domů" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Příspěvky účtu" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Odpovědi)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Boosty)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Média)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Vymazat filtry" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Vyčistit" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Zobrazení příspěvku s odpovědmi" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Odpovědi" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Zobrazení příspěvků bez boostů" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Boosty" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Zobrazování příspěvků s médii" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Zobrazuji příspěvky označené štítkem #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Zobrazení příspěvků v {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Zatím zde není co vidět." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Nelze načíst příspěvky" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Nelze získat informace o účtu" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Přepnout na instance účtu {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Přepněte na mou instanci (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Měsíc" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Současný" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Výchozí" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Přepněte na tento účet" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Zobrazit profil…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Nastavit jako výchozí" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Odhlásit se <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Odhlásit se…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Přidejte existující účet" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Poznámka: <0>Výchozí</0> účet bude vždy použit pro první načtení. Přepnuté účty budou přetrvávat i během relace." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Zatím nemáte žádné záložky. Přidejte nějakou!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Nelze načíst záložky." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "poslední hodina" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "poslední 2 hodiny" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "poslední 3 hodiny" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "poslední 4 hodiny" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "posledních 5 hodin" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "posledních 6 hodin" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "posledních 7 hodin" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "posledních 8 hodin" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "posledních 9 hodin" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "posledních 10 hodin" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "posledních 11 hodin" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "posledních 12 hodin" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "starší než 12 hodin" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Sledované štítky" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Skupiny" + +#: 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 "Zobrazuji {selectedFilterCategory, select, all {všechny příspěvky} original {původní příspěvky} replies {odpovědi} boosts {bosty} followedTags {sledované štítky} groups {skupiny} filtered {filtrované příspěvky}}, {sortBy, select, createdAt {{sortOrder, select, asc {nejstarší} desc {nejnovější}}} reblogsCount {{sortOrder, select, asc {nejméně bostů} desc {nejvíce bostů}}} favouritesCount {{sortOrder, select, asc {nejméně lajků} desc {nejvíce lajků}}} repliesCount {{sortOrder, select, asc {nejméně odpovědí} desc {nejvíce odpovědí}}} density {{sortOrder, select, asc {nejméně husté} desc {nejhustší}}}} nejprve{groupBy, select, account {, seskupeno podle autorů} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Catch-up <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Nápověda" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Co je tohle?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Catch-up je samostatná časová osa pro sledované uživatele, která nabízí přehledný pohled na příspěvky s jednoduchým rozhraním inspirovaným e-mailem, což umožňuje snadné třídění a filtrování obsahu." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Náhled rozhraní Catch-up" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Rychlá rekapitulace" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Rekapitulace příspěvků od těch, které sledujete." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Zobrazit všechny příspěvky od…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "až do maxima" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Catch up" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Překrývá se s vaší poslední rekapitulací" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Poznámka: Vaše instance může zobrazit maximálně 800 příspěvků na domovské časové ose, bez ohledu na časové rozmezí. Může to být méně nebo více." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Předchozí…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Odstranit tuto rekapitulaci?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Poznámka: Budou uloženy pouze maximálně 3. Zbytek bude automaticky odstraněn." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Načítání příspěvků…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "To může chvíli trvat." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Obnovit filtry" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Nejlepší odkazy" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Sdílel/a {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Vše" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# autor} few {# autoři} many {# autorů} other {# autorů}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Seřadit" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Datum" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Hustota" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autoři" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Žádný" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Zobrazit všechny autory" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Není třeba číst všechno." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "To je vše." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Zpět na začátek" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Odkazy sdílené lidmi, které sledujete, seřazené podle počtu sdílení, boostů a lajků." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Třídit: Hustota" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Příspěvky jsou tříděny podle informační hustoty nebo hloubky. kratší příspěvky jsou \"lehčí\" zatímco delší příspěvky jsou \"těžší\". Příspěvky s fotkami jsou \"těžší\" než příspěvky bez fotografií." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Skupina: Autoři" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Příspěvky jsou seskupeny podle autorů a seřazeny podle počtu příspěvků na autora." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Další autor" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Předchozí autor" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Přejít na začátek" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtrováno: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Nepodařilo se načíst lajky." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Domovská časová osa a seznamy" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Veřejná časová osa" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Konverzace" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profily" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Nikdy" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Nový filtr" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtr} few {# filtry} many {# filtrů} other {# filtrů}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Nepodařilo se načíst filtry." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Zatím žádné filtry." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Přidat filtr" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Upravit filtr" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Nepodařilo se upravit filtr" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Nelze vytvořit filtr" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Název" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Celé slovo" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Žádná klíčová slova. Přidejte jedno." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Přidat klíčové slovo" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# klíčové slovo} few {# klíčová slova} many {# klíčových slov} other {# klíčových slov}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtrovat od…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Zatím není implementováno" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Stav: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Změnit vypršení platnosti" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Vypršení platnosti" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimalizovat" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "skrytý" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Smazat tento filtr?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Nepodařilo se odstranit filtr." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Vypršelo" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Nepodařilo se načíst sledované hashtagy." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Zatím nesledujete žádné hashtagy." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Není zde nic k zobrazení." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Nelze načíst příspěvky." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "S tímto štítkem zatím nikdo nic nepřidal." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Nepodařilo se načíst příspěvky s tímto štítkem" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "#{hashtag} již není sledován" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {} few {#} many {#}other {#}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Přidat hashtag" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Odstranit hashtag" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Přidat do zkratek" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Zadejte novou instanci, např. „mastodon.social“" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Neplatná instance" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Přejít na jinou instanci…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Přejít na moji instanci (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Nemáte účet? Vytvořte si účet!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Soukromé zmínky" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Soukromý" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Nikdo vás nezmínil :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Nepodařilo se načíst odpovědi." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Nesledujete" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Kdo tě nesleduje" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "S novým účtem" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Nastavení oznámení" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Nová oznámení" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Pouze @zmínky" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Dnes" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Včera" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Nelze načíst oznámení" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Nastavení oznámení aktualizováno" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Filtrovat oznámení od lidí:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtr" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignorovat" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Aktualizováno <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Povolit" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Odmítnout" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Místní časová osa ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Federovaná časová osa ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Místní časová osa" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Federovaná časová osa" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Hashtagy" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Zobrazit další účty" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Zobrazit více příspěvků" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Nastavení" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Vzhled" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Velikost textu" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Přeložit do" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Generátor popisu obrázků" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Přispět" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Ochrana osobních údajů" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Verze:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Push notifikace (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Ankety" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Chyba: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Nepodařilo se načíst odpovědi." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Zpět" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/de-DE.po b/src/locales/de-DE.po new file mode 100644 index 00000000..42d3fa0b --- /dev/null +++ b/src/locales/de-DE.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: de\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: German\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Gesperrt" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Posts: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Zuletzt gepostet: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatisiert" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Gruppe" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Befreundet" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Angefragt" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Folgt" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Folgt Ihnen" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# Folgender} other {# Folgende}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Verifiziert" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Beigetreten: <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Für immer" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Konto kann nicht geladen werden." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Zur Kontoseite gehen" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Folgende" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Beiträge" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Mehr" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> hat angegeben, dass sein/ihr neues Konto jetzt ist:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Handle kopiert" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Handle konnte nicht kopiert werden" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Handle kopieren" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Zur ursprünglichen Profilseite gehen" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Profilbild anzeigen" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Profil-Header anzeigen" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Dieser Benutzer hat sich entschieden, diese Informationen nicht verfügbar zu machen." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} Originalbeiträge, {1} Antworten, {2} Boosts" + +#: 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 {Letzter Beitrag des vergangenen Tags} other {Letzter Beitrag der vergangenen {2} Tage}}} other {{3, plural, one {Letzte {4} Beiträge des vergangenen Tags} other {Letzte {5} Beiträge der vergangenen {6} Tage}}}}" + +#: 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 {Letzter Beitrag des vergangenen Jahres} other {Letzter Beitrag der vergangenen {1} Jahre}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Original" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Antworten" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Boosts" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Beitragsstatistiken nicht verfügbar." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Beitragsstatistiken anzeigen" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Letzter Beitrag: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Stumm geschaltet" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Blockiert" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Private Notiz" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Bio übersetzen" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Private Notiz bearbeiten" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Private Notiz hinzufügen" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Benachrichtigungen für Beiträge von @{username} aktiviert." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Benachrichtigungen für Beiträge von @{username} deaktiviert." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Benachrichtigungen deaktivieren" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Benachrichtigungen aktivieren" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Boosts von @{username} aktiviert." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Boosts von @{username} deaktiviert." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Boosts deaktivieren" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Boosts aktivieren" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Hinzufügen/Entfernen aus Listen" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Link kopiert" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Link konnte nicht kopiert werden" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopieren" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Teilen scheint nicht zu funktionieren." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Teilen…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Stummschaltung von @{username} aufgehoben" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} für {0} Stumm geschaltet" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Konnte @{username} nicht stumm schalten" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} von Folgenden entfernt" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Folgenden entfernen…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "@{username} entsperrt" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} blockiert" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "@{username} kann nicht entsperrt werden" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Konnte @{username} nicht blockieren" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Profil bearbeiten" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Folgeanfrage zurückziehen?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "@{0} entfolgen?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Entfolgen…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Zurückziehen…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Folgen" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Schließen" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Übersetzte Bio" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Konnte nicht von der Liste entfernt werden." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Konnte nicht zur Liste hinzugefügt werden." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Listen konnten nicht geladen werden." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Keine Listen." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Neue Liste" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Private Notiz konnte nicht aktualisiert werden." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Abbrechen" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Speichern & schließen" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Profil konnte nicht aktualisiert werden." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Name" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Bio" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Zusätzliche Felder" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Label" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Inhalt" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Speichern" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "Benutzername" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "Server-Domainname" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Cloak-Modus deaktiviert" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Cloak-Modus aktiviert" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Startseite" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Verfassen" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Benutzerdefinierte Emoji hinzufügen" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Umfrage hinzufügen" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Sie haben ungespeicherte Änderungen. Diesen Beitrag verwerfen?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Du kannst höchstens eine Datei anhängen.} other {Du kannst höchstens # Dateien anhängen.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Herauslösen" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimieren" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Es sieht so aus, als ob Sie das übergeordnete Fenster geschlossen hätten." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Es sieht so aus, als ob Sie bereits ein Verfassen-Feld im übergeordneten Fenster geöffnet haben und gerade veröffentlichen. Bitte warten Sie, bis es fertig ist, und versuchen Sie es später erneut." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Es sieht so aus, als hätten Sie bereits ein Verfassen-Feld im übergeordneten Fenster geöffnet. Wenn Sie dieses Fenster einblenden, werden die Änderungen, die Sie im übergeordneten Fenster vorgenommen haben, verworfen. Fortfahren?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Einblenden" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Als Antwort auf den Beitrag von @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Als Antwort auf den Beitrag von @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Quellbeitrag bearbeiten" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Umfrage muss mindestens 2 Optionen enthalten" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Einige Umfrageoptionen sind leer" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Einige Medien haben keine Beschreibungen. Fortfahren?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Anhang #{i} fehlgeschlagen" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Inhaltswarnung" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Inhaltswarnung oder sensible Medien" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Öffentlich" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Lokal" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Nicht gelistet" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Nur für Folgende" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Private Erwähnung" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Antwort veröffentlichen" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Post bearbeiten" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Was machen Sie?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Medien als sensibel markieren" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Hinzufügen" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Antworten" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Aktualisieren" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "GIF wird heruntergeladen…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "GIF konnte nicht heruntergeladen werden" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Mehr…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Hochgeladen" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Bildbeschreibung" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Videobeschreibung" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Audiobeschreibung" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Datei zu groß. Das Hochladen kann Probleme verursachen. Versuche, die Dateigröße von {0} auf {1} oder weniger zu reduzieren." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Auflösung zu groß. Das Hochladen könnte Probleme verursachen. Versuche, das Seitenverhältnis von {0}×{1} px auf {2}×{3} px zu reduzieren." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Bildrate zu hoch. Das Hochladen könnte Probleme verursachen." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Entfernen" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Fehler" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Bildbeschreibung bearbeiten" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Videobeschreibung bearbeiten" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Audiobeschreibung bearbeiten" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Erzeuge Beschreibung. Bitte warten Sie…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Fehler beim Erzeugen der Beschreibung: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Beschreibung konnte nicht erzeugt werden" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Beschreibung erzeugen…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Fehler beim Erzeugen der Beschreibung{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>– experimentell</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Fertig" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Auswahl {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Mehrfache Auswahl" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Dauer" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Umfrage entfernen" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Konten suchen" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Fehler beim Laden der Konten" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Benutzerdefinierte Emojis" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Emoji suchen" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Fehler beim Laden benutzerdefinierter Emojis" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Zuletzt verwendet" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Andere" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} mehr…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "GIFs suchen" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Ermöglicht durch GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Eintippen, um GIFs zu suchen" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Zurück" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Weiter" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Fehler beim Laden der GIFs" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Nicht gesendete Entwürfe" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Es sieht so aus, als hätten Sie noch nicht gesendete Entwürfe. Lass uns dort fortfahren, wo Sie aufgehört haben." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Diesen Entwurf löschen?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Fehler beim Löschen des Entwurfs! Bitte versuchen Sie es erneut." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Löschen…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Fehler beim Abrufen des Antwort-zu-Statuses!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Alle Entwürfe löschen?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Fehler beim Löschen der Entwürfe! Bitte versuchen Sie es erneut." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Alle löschen…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Keine Entwürfe gefunden." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Umfrage" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Medien" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "In neuem Fenster öffnen" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Akzeptieren" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Ablehnen" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Akzeptiert" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Abgelehnt" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Nichts anzuzeigen" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Konten" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Mehr anzeigen…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Das Ende." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Tastenkombinationen" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Hilfe zu Tastenkombinationen" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Nächster Post" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Vorheriger Post" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Karussell zum nächsten Post überspringen" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Umschalt</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Karussell zum vorherigen Post überspringen" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Umschalt</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Neue Posts laden" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Postdetails öffnen" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Eingabe</0> oder <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Inhaltswarnung ausklappen oder<0/>aus-/eingeklappte Unterhaltung umschalten" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Post oder Dialoge schließen" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> oder <1>Löschtaste</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Spalte im mehrspaltigen Modus fokussieren" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> bis <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Neuen Post erstellen" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Neuen Post erstellen (neues Fenster)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Umschalt</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Post senden" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Strg</0> + <1>Eingabe</1> oder <2>⌘</2> + <3>Eingabe</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Suchen" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Antworten (neues Fenster)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Umschalt</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Liken (favorisieren)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> oder <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Boosten" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Umschalt</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Lesezeichen" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Cloak Modus ein/aus" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Umschalt</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Liste bearbeiten" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Liste konnte nicht bearbeitet werden." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Liste konnte nicht erstellt werden." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Antworten auf Listenmitglieder anzeigen" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Antworten auf Personen denen ich folge anzeigen" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Antworten nicht anzeigen" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Erstellen" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Diese Liste löschen?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Liste konnte nicht gelöscht werden." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Medienbeschreibung" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Übersetzen" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Sprechen" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Originalmedien in neuem Fenster öffnen" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Originalmedien öffnen" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Es wird versucht, das Bild zu beschreiben. Bitte warten Sie…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Fehler beim Beschreiben des Bildes" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Beschreibe Bild…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Post anzeigen" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Sensible Medien" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Gefiltert: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Gefiltert" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Post veröffentlicht. Schauen Sie sich ihn an." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Antwort gepostet. Schauen Sie sich sie an." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Post aktualisiert. Schauen Sie sich ihn an." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menü" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Seite jetzt neu laden um zu aktualisieren?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Neues Update verfügbar…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Aufholen" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Erwähnungen" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Neu" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Lesezeichen" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Gefällt mir" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Gefolgte Hashtags" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filter" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Stumm geschaltete Nutzer" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Stumm geschaltete Nutzer…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Blockierte Nutzer" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Blockierte Nutzer…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Konten…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Einloggen" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Angesagt" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Föderiert" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Verknüpfungen / Spalten…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Einstellungen…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Listen" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Alle Listen" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Benachrichtigung" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Diese Benachrichtigung stammt von Ihrem anderen Konto." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Alle Benachrichtigungen anzeigen" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} hat auf Ihren Beitrag mit {emojiObject} reagiert" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} hat einen Post veröffentlicht." + +#: src/components/notification.jsx:85 +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} hat deine Antwort geteilt.} other {{account} hat deinen Beitrag geteilt.}}} other {{account} hat {postsCount} Beiträge von dir geteilt.}}} other {{postType, select, reply {<0><1>{0}</1> Leute</0> haben deine Antwort geteilt.} other {<2><3>{1}</3> Leute</2> haben deinen Beitrag geteilt.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} folgt dir jetzt.} other {<0><1>{0}</1> Leute</0> folgen dir jetzt.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} hat darum gebeten, Ihnen zu folgen." + +#: src/components/notification.jsx:151 +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} hat deine Antwort favorisiert.} other {{account} hat deinen Beitrag favorisiert.}}} other {{account} hat {postsCount} Beiträge von dir favorisiert.}}} other {{postType, select, reply {<0><1>{0}</1> Leute</0> haben deine Antwort favorisiert.} other {<2><3>{1}</3> Leute</2> haben deinen Beitrag favorisiert.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Eine Umfrage hat geendet, an der du teilgenommen oder die du erstellt hast." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Eine von Ihnen erstellte Umfrage wurde beendet." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Eine Umfrage in der Sie teilgenommen haben wurde beendet." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Ein Post, mit dem Sie interagiert haben, wurde bearbeitet." + +#: src/components/notification.jsx:204 +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} hat deine Antwort geteilt & favorisiert.} other {{account} hat deinen Beitrag geteilt & favorisiert.}}} other {{account} hat {postsCount} deiner Beiträge geteilt & favorisiert.}}} other {{postType, select, reply {<0><1>{0}</1> Leute</0> haben deine Antwort geteilt & favorisiert.} other {<2><3>{1}</3> Leute</2> haben deinen Beitrag geteilt & favorisiert.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} registriert." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} hat {targetAccount} gemeldet" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Verbindungen mit <0>{name}</0> verloren." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Moderationswarnung" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Ein Admin von <0>{from}</0> hat <1>{targetName}</1> gesperrt, weshalb du von diesem Profil nichts mehr wirst sehen und mit ihm nicht mehr wirst interagieren können." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Ein Admin von <0>{from}</0> hat <1>{targetName}</1> gesperrt. Betroffene Follower: {followersCount}; Profile, denen er/sie folgt: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Ihr Konto hat eine Moderationswarnung erhalten." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Ihr Konto wurde deaktiviert." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Einige Ihrer Beiträge wurden als sensibel markiert." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Einige Ihrer Beiträge wurden gelöscht." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Ihre Beiträge werden von nun an als sensibel markiert." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Ihr Konto wurde eingeschränkt." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Ihr Konto wurde gesperrt." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Unbekannter Benachrichtigungstyp: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Geteilt/favorisiert von …" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Favorisiert von …" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Geboostet von…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Gefolgt von…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Erfahre mehr <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Mehr lesen →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Abgestimmt" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Ergebnisse ausblenden" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Abstimmen" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Aktualisieren" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Ergebnisse anzeigen" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> Stimme} other {<1>{1}</1> Stimmen}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> Abstimmender} other {<1>{1}</1> Abstimmende}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Beendet <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Beendet" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Endet" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Spam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Bösartige Links, gefälschtes Engagement oder wiederholte Antworten" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Illegal" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Verstößt gegen das Gesetz Ihres oder des Serverlandes" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Verstoß gegen Server-Regeln" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Verstößt gegen bestimmte Server-Regel" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Verstoß" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Andere" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Problem passt nicht zu anderen Kategorien" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Post melden" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Melde @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Ausstehende Prüfung" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Post gemeldet" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Profil gemeldet" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Post konnte nicht gemeldet werden" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Profil konnte nicht gemeldet werden" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Was ist das Problem mit diesem Post?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Was ist das Problem mit diesem Profil?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Zusätzliche Infos" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "An <0>{domain}</0> weiterleiten" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Meldung senden" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "@{username} Stumm geschaltet" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Konnte {username} nicht Stumm schalten" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Meldung absenden <0>+ Profil stumm schalten</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "{username} blockiert" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Konnte {username} nicht blockieren" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Meldung absenden <0>+ Profil blockieren</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>– Konten, Hashtags & Beiträge</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Beiträge mit <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Beiträge mit dem Hashtag <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "<0>{query}</0> nachschlagen" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Konten mit <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Startseite / Folgen" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Öffentlich (Lokal / Föderiert)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Konto" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Hashtag" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "Listen-ID" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Nur Lokal" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instanz" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Optional, z.B. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Suchbegriff" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Optional, außer für Mehrspalten-Modus" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "z.B. PixelArt (max. 5, durch Leerzeichen getrennt)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Nur Medien" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Tastenkürzel" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "Beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Gib eine Liste an mit Verknüpfungen, die erscheinen werden als:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Schwebender Button" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Tab/Menüleiste" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Mehrere Spalten" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Im aktuellen Ansichtsmodus nicht verfügbar" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Nach oben" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Nach unten" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Bearbeiten" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Fügen Sie mehr als eine Verknüpfung/Spalte hinzu, damit dies funktioniert." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Noch keine Spalten. Tippen Sie auf die Hinzufügen Schaltfläche." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Noch keine Verknüpfungen. Tippen Sie auf die Hinzufügen Schaltfläche." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Unentschlossen, was du hinzufügen sollst?<0/>Probier’ es zuerst mit <1>Start / Folgend und Benachrichtigungen</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Höchstens {SHORTCUTS_LIMIT} Spalten" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Höchstens {SHORTCUTS_LIMIT} Verknüpfungen" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Import/Export" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Spalte hinzufügen…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Verknüpfung hinzufügen…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Bestimmte Liste ist optional. Im Mehrspalten-Modus ist eine Liste erforderlich, sonst wird die Spalte nicht angezeigt." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Im Mehrspalten-Modus ist ein Suchbegriff erforderlich, sonst wird die Spalte nicht angezeigt." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Es werden mehrere Hashtags gleichzeitig unterstützt. Separiert mit Leerzeichen." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Verknüpfung bearbeiten" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Verknüpfung hinzufügen" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Timeline" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Liste" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "<0>Verknüpfungen</0> importierten/exportieren" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importieren" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Verknüpfung hier einfügen" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Lade gespeicherte Verknüpfungen von Instanz-Server herunter…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Verknüpfungen konnten nicht heruntergeladen werden" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Verknüpfungen vom Instanz-Server herunterladen" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Existiert in den aktuellen Verknüpfungen" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Liste funktioniert möglicherweise nicht, wenn sie von einem anderen Konto stammt." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Ungültiges Einstellungsformat" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "An aktuelle Verknüpfungen anhängen?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Es werden nur Verknüpfungen angehängt, die in den aktuellen Verknüpfungen nicht vorhanden sind." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Keine neuen Verknüpfungen zum Importieren" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Limit {SHORTCUTS_LIMIT} wurde überschritten, es wurde nur ein Teil der Verknüpfungen importiert." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Verknüpfungen importiert" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importieren & Anhängen…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Aktuelle Verknüpfungen überschreiben?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Verknüpfungen importieren?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "oder überschreiben…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importieren…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exportieren" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Verknüpfungen kopiert" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Konnte Verknüpfungen nicht kopieren" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Verknüpfungseinstellungen kopiert" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Konnte Verknüpfungseinstellungen nicht kopieren" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Teilen" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Verknüpfungen werden auf Instanz-Server gespeichert …" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Verknüpfungen gespeichert" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Verknüpfungen konnten nicht gespeichert werden" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Mit Instanzserver synchronisieren" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# Zeichen} other {# Zeichen}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Rohes Verknüpfungs-JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Einstellungen vom/zum Instanzserver importieren/exportieren (hochgradig experimentell)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>geteilt</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Entschuldigung, deine aktuell verwendete Instanz kann nicht mit diesem von einer anderen Instanz stammenden Beitrag interagieren." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Beitrag von @{0} entfavorisiert" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Beitrag von @{0} favorisiert" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Lesezeichen entfernt für Beitrag von @{0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Lesezeichen erstellt für Beitrag von @{0}" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Nicht mehr teilen" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Zitieren" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Einige Medien haben keine Beschreibungen." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Alter Beitrag (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Teilen des Betrags von @{0} rückgängig gemacht" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Beitrag von @{0} geteilt" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Boost…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Entfavorisieren" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Favorisieren" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Lesezeichen entfernen" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Bearbeitungsverlauf anzeigen" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Bearbeitet: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Beitrag einbetten" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Unterhaltung entstummt" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Unterhaltung stumm geschaltet" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Unterhaltung kann nicht entstummt werden" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Unterhaltung kann nicht stumm geschaltet werden" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Unterhaltung entstummen" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Unterhaltung stumm schalten" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Beitrag vom Profil gelöst" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Beitrag ans Profil angeheftet" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Beitrag kann nicht gelöst werden" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Beitrag kann nicht angeheftet werden" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Vom Profil lösen" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Ans Profil anheften" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Diesen Post löschen?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Post gelöscht" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Post konnte nicht gelöscht werden" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Post melden…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Favorisiert" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Geboostet" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Lesezeichen hinzugefügt" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Angeheftet" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Gelöscht" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# Antwort} other {# Antworten}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Thread{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Weniger anzeigen" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Inhalt anzeigen" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Medien anzeigen" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Bearbeitet" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Kommentare" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Bearbeitungsverlauf" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Fehler beim laden des Verlaufs" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Laden…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML Code" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML Code kopiert" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "HTML-Code konnte nicht kopiert werden" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Medienanhänge:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Account-Emojis:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "Statische URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojis:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notizen:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Dies ist statisch, ungestylt und ohne Skript. Du kannst nach Belieben deine eigenen Styles anwenden und bearbeiten." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Umfragen sind nicht interaktiv, es wird eine Liste mit Stimmanzahlen." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Medienanhänge können Bilder, Videos, Audiodateien oder andere Dateitypen sein." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Beitrag konnte später geändert oder gelöscht werden." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Vorschau" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Notiz: Diese Vorschau ist leicht formiert." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> geteilt" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Neue Posts" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Erneut versuchen" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Thread" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Herausgefiltert</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Automatisch von {sourceLangText} übersetzt" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Übersetze…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Von {sourceLangText} übersetzen (automatisch erkannt)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Von {sourceLangText} übersetzen" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Auto ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Übersetzung fehlgeschlagen" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Quell-Status bearbeiten" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Antworten auf @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Sie können diese Seite jetzt schließen." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Fenster schließen" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Zur Startseite gehen" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Account-Posts" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Antworten)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Boosts)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Medien)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Filter leeren" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Leeren" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Beitrag mit Antworten anzeigen" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Antworten" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Zeige Posts ohne Boosts" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Boosts" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Zeige Posts mit Medien" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Zeige Posts mit #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Zeige Posts in {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Noch nichts zu sehen." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Konnte Posts nicht laden" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Kontoinformationen konnten nicht abgerufen werden" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Zur Kontoinstanz {0} wechseln" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Zu meiner Instanz wechseln (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Monat" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Aktuell" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Standard" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Profil anzeigen…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Als Standard festlegen" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Abmelden…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Bestehendes Konto hinzufügen" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Hinweis: <0>Standard</0>-Konten werden immer zum erstmaligen Laden verwendet werden. Zweitkonten werden während der Sitzung beibehalten werden." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Lesezeichen konnten nicht geladen werden." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "Letzte Stunde" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "Letzte 2 Stunden" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "Letzte 3 Stunden" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "Letzte 4 Stunden" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "Letzte 5 Stunden" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "Letzte 6 Stunden" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "Letzte 7 Stunden" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "Letzte 8 Stunden" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "Letzte 9 Stunden" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "Letzte 10 Stunden" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "Letzte 11 Stunden" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "Letzte 12 Stunden" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "Älter als 12 Stunden" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Gefolgte Hashtags" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Gruppen" + +#: 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 "Zeige {selectedFilterCategory, select, all {alle Beiträge} original {Originalbeiträge} replies {Antworten} boosts {geteilte Beiträge} followedTags {beobachtete Hashtags} groups {Gruppen} filtered {herausgefilterte Beiträge}},{sortBy, select, createdAt {{sortOrder, select, asc {älteste Beiträge} desc {neueste Beiträge}}} reblogsCount {{sortOrder, select, asc {am wenigsten geteilte Beiträge} desc {am meisten geteilte Beiträge}}} favouritesCount {{sortOrder, select, asc {wenigste Favoriten} desc {meiste Favoriten}}} repliesCount {{sortOrder, select, asc {wenigste Antworten} desc {meiste Antworten}}} density {{sortOrder, select, asc {am wenigsten dichte Beiträge} desc {dichteste Beiträge}}}} zuerst{groupBy, select, account {, nach Verfassern gruppiert} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Hilfe" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Was ist das?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "„Aufholen“ ist eine separate Timeline der Leute, denen du folgst. Sie ermöglicht es dir, auf einen Blick zu sehen, was du verpasst hast, mit einer einfachen, an E-Mails erinnernden Oberfläche, um mühelos Beiträge zu sortieren und zu filtern." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Vorschau der Aufholen-Oberfläche" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Jetzt aufholen" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Lass’ uns mit Beiträgen aufholen, deren Verfassern du folgst." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Alle Posts von… anzeigen" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "bis zum Maximum" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Aufholen" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Überlappt mit deinem letzten Aufholen" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Bis zum letzten Aufholen ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Hinweis: Deine Instanz zeigt ggf. höchstens 800 Beiträge in deiner Home-Timeline an, unabhängig vom Zeitrahmen. Könnte variieren." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Zuvor…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# Beitrag} other {# Beiträge}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Dieses Aufholen entfernen?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Hinweis: Höchstens 3 werden gespeichert werden. Der Rest wird automatisch entfernt werden." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Lade Posts…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Dies könnte eine Weile dauern." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Filter zurücksetzen" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Häufigste Links" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Geteilt von {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Alle" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# Autor} other {# Autoren}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Sortieren" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Datum" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Dichte" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autoren" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Keine" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Alle Autoren anzeigen" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Sie müssen nicht alles lesen." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Das ist alles." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Zurück zum Anfang" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Links, die von Leuten geteilt wurden, denen du folgst; sortiert nach Häufigkeit sowie nach Boost- und Favoriten-Anzahlen." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Sortieren: Dichte" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Beiträge werden nach Parametern wie Dichte oder Tiefe sortiert. Kürzere Beiträge sind „leichter“, während längere Beiträge „schwerer“ sind. Außerdem sind Beiträge mit Fotos „schwerer“ als solche ohne Fotos." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Gruppieren: Autoren" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Beiträge werden nach Autoren gruppiert, sortiert nach Anzahl der Beiträge pro Autor." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Nächster Autor" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Vorheriger Autor" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Zum Anfang scrollen" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Gefiltert: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Favoriten können nicht geladen werden." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Startseite und Listen" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Öffentliche Timelines" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Unterhaltungen" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profile" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Nie" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Neuer Filter" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# Filter} other {# Filter}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Filter konnten nicht geladen werden." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Noch keine Filter." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Filter hinzufügen" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Filter bearbeiten" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Filter konnte nicht bearbeitet werden" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Filter konnte nicht erstellt werden" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Titel" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Ganzes Wort" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Keine Schlüsselwörter. Füge eines hinzu." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Schlüsselwort hinzufügen" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# Schlüsselwort} other {# Schlüsselwörter}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtern von…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Noch nicht implementiert" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Status: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Ablaufdatum ändern" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Ablaufdatum" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Gefilterter Post wird…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimiert" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "ausgeblendet" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Diesen Filter löschen?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Filter konnte nicht gelöscht werden." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Abgelaufen" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Läuft ab <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Läuft nie ab" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# Hashtag} other {# Hashtags}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Gefolgte Hashtags konnten nicht geladen werden." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Noch keine Hashtags gefolgt." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Hier gibt es nichts zu sehen." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Konnte Posts nicht laden." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (nur Medien) auf {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} auf {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (nur Medien)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Noch niemand hat etwas mit diesem Tag gepostet." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Konnte Posts mit diesem Tag nicht laden" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "#{hashtag} entfolgt" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "#{hashtag} gefolgt" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Folgt…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Nicht mehr auf Profil vorgestellt" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Nicht möglich, das Vorstellen auf dem Profil rückgängig zu machen" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Auf Profil vorgestellt" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Auf Profil vorstellen" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {}other {Höchstens # Hashtags}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Hashtag hinzufügen" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Hashtag entfernen" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Höchstanzahl (#) an Verknüpfungen erreicht.} other {Höchstanzahl (#) an Verknüpfungen erreicht. Weitere Verknüpfung kann nicht hinzugefügt werden.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Diese Verknüpfung existiert bereits" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Hashtag-Verknüpfung hinzugefügt" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Zu Verknüpfungen hinzufügen" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Geben Sie eine neue Instanz ein, z.B. \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Ungültige Instanz" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Gehe zu einer anderen Instanz…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Zu meiner Instanz (<0>{currentInstance}</0>) gehen" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Benachrichtigungen konnten nicht geladen werden." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Neue</0> <1>Folge-Anfragen</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Alle anzeigen" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Auflösen…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "URL konnte nicht aufgelöst werden" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Noch nichts." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Mitglieder verwalten" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Entferne…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# Filter} other {# Filter}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Noch keine Listen." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "z.B. “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Mit {selectedInstanceText} fortfahren" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Weiter" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Sie haben noch kein Konto? Erstellen Sie eines!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Private Erwähnungen" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privat" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Niemand hat Sie erwähnt :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Erwähnungen konnten nicht geladen werden." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Sie folgen nicht" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Wer Ihnen nicht folgt" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Mit einem neuen Konto" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Wer dich unaufgefordert privat anschreibt" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Wer von Servermoderatoren eingeschränkt wurde" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Benachrichtigungseinstellungen" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Neue Benachrichtigungen" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Bekanntmachung} other {Bekanntmachungen}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Folgeanfragen" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# Folge-Anfrage} other {# Folge-Anfragen}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Benachrichtigungen von # Person herausgefiltert} other {Benachrichtigungen von # Leuten herausgefiltert}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Nur Erwähnungen" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Heute" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Sie sind auf dem neuesten Stand." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Gestern" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Benachrichtigungen konnten nicht geladen werden" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Benachrichtigungseinstellungen aktualisiert" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Benachrichtigungen von Personen ausfiltern:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtern" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignorieren" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Aktualisiert <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Benachrichtigungen von @{0} werden von jetzt an nicht herausgefiltert." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Unmöglich, die Benachrichtigungsanfrage anzunehmen" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Zulassen" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Benachrichtigungen von @{0} werden ab jetzt nicht mehr in gefilterten Benachrichtigungen angezeigt." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Benachrichtigungsanfrage konnte nicht ausgeblendet werden" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Verwerfen" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Verworfen" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Lokale Zeitleiste ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Föderierte Zeitleiste ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Lokale Zeitleiste" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Föderierte Zeitleiste" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Noch niemand hat etwas gepostet." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Zu Föderiert wechseln" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Zu Lokal wechseln" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Suche: {q} (Posts)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Suche: {q} (Konten)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Suche: {q} (Hashtags)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Suche: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Hashtags" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Mehr anzeigen" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Weitere Konten anzeigen" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Keine Konten gefunden." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Mehr Hashtags anzeigen" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Keine Hashtags gefunden." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Mehr Posts anzeigen" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Keine Posts gefunden." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Geben Sie Ihren Suchbegriff ein oder fügen Sie oben eine URL ein, um zu beginnen." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Einstellungen" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Erscheinungsbild" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Hell" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Dunkel" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automatisch" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Textgröße" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Anzeigesprache" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Posten" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Standardsichtbarkeit" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Synchronisiert" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Aktualisieren der Beitragssichtbarkeit fehlgeschlagen" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Mit den Einstellungen deines Instanzservers synchronisiert. <0>Gehe zur Instanz ({instance}) für weitere Einstellungen.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Experimentelle Funktionen" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Zeitleiste automatisch aktualisieren" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Boost Karussell" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Post-Übersetzung" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Übersetze zu" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Systemsprache ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {Verstecke „Übersetzen“-Button für:} other {Verstecke „Übersetzen“-Button für (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Hinweis: Diese Funktion verwendet externe Übersetzungsdienste, ermöglicht durch <0>Lingva-API</0> & <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Automatische Inline-Übersetzung" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Übersetzung für Beiträge automatisch in der Zeitleiste anzeigen. Funktioniert nur für <0>kurze</0> Beiträge ohne Inhaltswarnung, Medien und Umfragen." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "GIF-Wähler für Verfassen-Fenster" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Hinweis: Diese Funktion verwendet einen externen GIF-Suchdienst, ermöglicht durch <0>GIPHY</0>. Angemessen für alle Altersgruppen, Tracking-Parameter werden entfernt, Referrer-Informationen werden bei Anfragen ausgelassen, aber Suchbegriffe und die IP-Adresse werden an deren Server übertragen." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Bildbeschreibungsgenerator" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Nur für neue Bilder beim Erstellen neuer Posts." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Hinweis: Diese Funktion verwendet einen externen KI-Dienst, ermöglicht durch <0>img-alt-api</0>. Könnte durchwachsen funktionieren. Nur für Bilder und nur auf Englisch." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Serverseitig gruppierte Benachrichtigungen" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Alpha-Funktion. Möglicherweise verbessertes Gruppierungsfenster, aber nur grundlegende Gruppierungslogik." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "„Cloud“-Import/-Export für Verknüpfungseinstellungen" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Hochgradig experimentell.<0/>Wird in deinen eigenen Profilnotizen gespeichert. (Private) Profilnotizen werden hauptsächlich für andere Profile verwendet und für das eigene Profil versteckt." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Hinweis: Diese Funktion verwendet die aktuell eingeloggte Instanz-API des Servers." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Cloak Modus <0>(<1>Text</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Text durch Blöcke ersetzen, nützlich für Screenshots, aus Datenschutzgründen." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Über" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Entwickelt</0> von <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Sponsor" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Spenden" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Datenschutzerklärung" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Seite:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Version:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Version kopiert" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Version kann nicht kopiert werden" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Fehler beim Aktualisieren des Abonnements. Bitte versuchen Sie es erneut." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Fehler beim Entfernen des Abonnements. Bitte versuchen Sie es erneut." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Push-Benachrichtigungen (Beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Push-Benachrichtigungen sind blockiert. Bitte aktivieren Sie diese in Ihren Browsereinstellungen." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Von <0>{0}</0> erlauben" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "Jeder" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "Leuten, denen ich folge" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "folgende" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Folgt" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Umfragen" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Post Bearbeitungen" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Push-Berechtigung wurde seit deinem letzten Login nicht erteilt. Sie müssen sich erneut <0><1>Anmelden</1>, um Push-Berechtigungen zu erteilen</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "HINWEIS: Push-Benachrichtigungen funktionieren nur für <0>ein Konto</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Sie sind nicht eingeloggt. Interaktionen (Antworten, Boost usw.) sind nicht möglich." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Dieser Post stammt von einer anderen Instanz (<0>{instance}</0>). Interaktionen (Antworten, Boost, usw.) sind nicht möglich." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Fehler: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Zu meiner Instanz wechseln, um Interaktionen zu ermöglichen" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Antworten konnten nicht geladen werden." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Zurück" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Zum Hauptbeitrag gehen" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} Posts oberhalb ‒ Gehe nach oben" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "In der seitlichen Ansicht linsen" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Zur Vollansicht wechseln" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Alle sensiblen Inhalte anzeigen" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Experimentell" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Wechsel nicht möglich" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Zur Instanz des Posts wechseln ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Zur Instanz des Posts wechseln" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Post konnte nicht geladen werden" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# Antwort} other {<0>{1}</0> Antworten}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# Kommentar} other {<0>{0}</0> Kommentare}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Post mit Antworten anzeigen" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Angesagt ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Angesagte Nachrichten" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Zurück zur Anzeige angesagter Posts" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Zeige Posts in denen <0>{0}</0> erwähnt wird" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Angesagte Posts" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Keine angesagten Posts." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Ein minimalistischer, dogmatischer Mastodon Web-Client." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Mit Mastodon anmelden" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Registrieren" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Verbinden Sie Ihr bestehendes Mastodon/Fediverse Konto.<0/>Ihre Zugangsdaten werden nicht auf diesem Server gespeichert." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Entwickelt</0> von <1>@cheeaun</1>. <2>Datenschutzerklärung</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Bildschirmfoto des Boosts-Karussells" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Boost Karussell" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Originelle Posts und erneut geteilte (geboostete) Posts visuell trennen." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Screenshot von verschachtelten Kommentar-Threads" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Verschachtelte Kommentar-Threads" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Folge Unterhaltungen mühelos. Halb einklappbare Antworten." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Screenshot von gruppierten Benachrichtigungen" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Gruppierte Benachrichtigungen" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Ähnliche Benachrichtigungen werden gruppiert und für mehr Übersichtlichkeit eingeklappt." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Screenshot der mehrspaltigen Benutzeroberfläche" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Einzelne oder mehrere Spalten" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Standardmäßig eine einzelne Spalte für Zen-Modus-Enthusiasten. Konfigurierbares Mehrspalten-Layout für Power-Nutzer." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Bildschirmfoto einer Timeline mehrerer Hashtags mit einem Formular zum Hinzufügen weiterer Hashtags" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Timeline mehrerer Hashtags" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Bis zu 5 Hashtags, kombiniert in eine gemeinsame Timeline." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Anscheinend blockiert Ihr Browser Popups." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Ein Beitragsentwurf ist derzeit minimiert. Posten oder verwerfen Sie ihn, bevor Sie einen neuen erstellen." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Ein Beitrag ist derzeit offen. Posten oder verwerfen Sie ihn, bevor Sie einen neuen erstellen." + diff --git a/src/locales/en.po b/src/locales/en.po new file mode 100644 index 00000000..71c7c12a --- /dev/null +++ b/src/locales/en.po @@ -0,0 +1,3801 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "" + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Following" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "" + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "" + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "" + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "" + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "" + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "" + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Add media" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Add GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 "" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "" + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "" + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:444 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Focus next column in multi-column mode" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Focus previous column in multi-column mode" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Following" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "" + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:264 +msgid "Your {year} #Wrapstodon is here!" +msgstr "Your {year} #Wrapstodon is here!" + +#: src/components/notification.jsx:270 +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." +msgstr "" + +#: src/components/notification.jsx:276 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:282 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:290 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:291 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:294 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:296 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:371 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:440 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:441 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:442 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:514 +#: src/components/notification.jsx:530 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:539 +msgid "View #Wrapstodon" +msgstr "View #Wrapstodon" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# vote} other {# votes}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "More from <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Boost} other {# Boosts}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Pinned posts" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Login required." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:136 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Switch to this account" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Switch in new tab/window" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "No bookmarks yet. Go bookmark something!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Removing Catch-up {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Catch-up {0} removed" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Group" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "" + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "No likes yet. Go like something!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Unfollow #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Failed to register application" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "instance domain" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Volunteer translations" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Donate" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Post" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "By {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" diff --git a/src/locales/eo-UY.po b/src/locales/eo-UY.po new file mode 100644 index 00000000..010046a8 --- /dev/null +++ b/src/locales/eo-UY.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: eo\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 20:36\n" +"Last-Translator: \n" +"Language-Team: Esperanto\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: eo\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Ŝlosita" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Afiŝoj: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Laste afiŝita: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Aŭtomatigita" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Grupo" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Reciproka" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Petita" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Sekvatoj" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Sekvas vin" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# sekvanto} other {# sekvantoj}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Kontrolita" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Aliĝis <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Por ĉiam" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Ne eblas ŝargi konton." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Iri al konta paĝo" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Sekvantoj" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Sekvatoj" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Afiŝoj" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Pli" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> indikis, ke ilia nova konto nun estas:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Identigo kopiita" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Ne eblas kopii la tenilon" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Kopii identigon" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Malfermi la originalan profilpaĝon" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Vidi rolfiguron" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Vidi fonbildon" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "Memore" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Ĉi tiu uzanto elektis ne disponebligi ĉi tiun informon." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} originalaj afiŝoj, {1} respondoj, {2} diskonigoj" + +#: 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 {Lasta afiŝo en la lasta tago} other {Lasta afiŝo en la pasintaj {2} tagoj}}} other {{3, plural, one {Lastaj {4} afiŝoj en la lasta tago} other {Lastaj {5} afiŝoj en la pasintaj {6} tagoj}}}}" + +#: 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 {Lasta afiŝo en la pasinta(j) jaro(j)} other {Lastaj {1} afiŝoj en la pasinta(j) jaro(j)}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Originala" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Respondoj" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Diskonigoj" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Afiŝaj statistikoj ne disponeblaj." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Vidi afiŝo-statistikojn" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Lasta afiŝo: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Silentigita" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Blokita" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Persona noto" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Mencii <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Traduki biografion" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Redakti personan noton" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Aldoni personan noton" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Ŝaltitaj sciigoj por afiŝoj de @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Malŝaltitaj sciigoj por afiŝoj de @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Malŝalti sciigojn" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Ŝalti sciigojn" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Diskonigoj de @{username} ŝaltitaj." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Diskonigoj de @{username} malŝaltitaj." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Malŝalti diskonigojn" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Ŝalti diskonigojn" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Aldoni/Forigi el Listoj" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Ligilo kopiita" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Ne eblas kopii la ligilon" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopii" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Kunhavigo ŝajnas ne funkcii." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Diskonigi…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Nesilentigita @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Ne plu silentigi <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Silentigi <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Silentigita @{username} dum {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Ne eblas silentigi @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Ĉu forigi <0>@{username}</0> el sekvantoj?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} forigita de sekvantoj" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Forigi sekvanton…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Ĉu bloki <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Malbloki @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Blokita @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Ne eblas malbloki @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Ne eblas bloki @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Malbloki <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Bloki <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Raporti <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Redakti la profilon" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Ĉu nuligi peton por sekvado?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Ĉu ĉesi sekvi @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Ĉesi sekvi…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Nuligi…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Sekvi" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Fermi" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Tradukita biografio" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Ne eblas forigi el listo." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Ne eblas aldoni al listo." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Ne eblas ŝargi listojn." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Ne estas listoj." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nova listo" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Personaj notoj pri <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Ne eblas ĝisdatigi la personan noton." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Nuligi" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Konservi kaj fermi" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Ne eblas ĝisdatigi la profilon." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nomo" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Sinprezento" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Profilaj metadatumoj" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etikedo" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Enhavo" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Konservi" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "uzantnomo" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "servila domajna nomo" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Ŝtelreĝimo estis malŝaltita" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Ŝtelreĝimo estis ŝaltita" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Hejmo" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Redakti" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Aldoni plurmedion" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Aldoni propran emoĝion" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Aldoni GIF-movbildon" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Aldoni balotenketon" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Vi havas nekonservitajn ŝanĝojn. Ĉu forĵeti ĉi tiun afiŝon?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {La dosiero {1} ne estas subtenata.} other {La dosieroj {2} ne estas subtenataj.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Vi povas nur kunsendi ĝis 1 dosieron.} other {Vi povas nur kunsendi ĝis # dosierojn.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Foriri" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimumigi" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Ŝajnas, ke vi fermis la patran fenestron." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Ŝajnas, ke vi jam havas redaktan fenestron malfermita en la ĉefa fenestro kaj vi nun publikigas. Bonvolu atendi, ke ĝi estos publikigita kaj provu denove poste." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Ŝajnas, ke vi jam havas redaktan fenestron malfermitan en la ĉefa fenestro. Enirante ĉi tiun fenestron forĵetos la ŝanĝojn kiujn vi faris. Ĉu daŭrigi?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Montri" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Respondante al la afiŝo de @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Respondante al la afiŝo de @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Redaktante la originalan afiŝon" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Balotenketo devas havi almenaŭ 2 eblojn" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Iuj elektoj de balotado estas malplenaj" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Iuj plurmedioj ne havas priskribojn. Ĉu daŭrigi?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Eraro aldonante #{i}" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Enhavaverto" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Enhavaverto aŭ sentema plurmedio" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Publika" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Loka" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Nelistigita" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Nur sekvantoj" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Privata mencio" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Afiŝi vian respondon" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Redakti vian afiŝon" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Kion vi pensas?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Aldoni averton de enhavo" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Aldoni" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Respondi" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Ĝisdatigi" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Afiŝi" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Elŝutante movbildon…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Malsukcesis elŝuti movbildon" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Pli…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Ĝisdatigita" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Priskribo de bildo" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Priskribo de filmeto" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Priskribo de aŭdaĵo" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Dosiergrandeco estas tro granda. Alŝuto eble renkontos problemojn. Provu redukti la dosiergrandecon de {0} al {1} ​​aŭ malpli." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Dimensio estas tro granda. Alŝuto eble renkontos problemojn. Provu redukti dimension de {0}x{1}px al {2}x{3}px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Bildrapido estas tro alta. Alŝuto eble renkontos problemojn." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Forigi" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Eraro" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Redakti bildopriskribon" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Redakti videopriskribon" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Redakti aŭdpriskribon" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Kreante priskribon. Bonvolu atendi…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Malsukcesis krei priskribon: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Malsukcesis krei priskribon" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Krei priskribon…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Malsukcesis krei priskribon{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— eksperimenta</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Farite" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Elekti {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Multoblaj elektoj" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Daŭro" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Forigi balotenketon" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Serĉi kontojn" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Eraro dum ŝargo de kontoj" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Propraj emoĝioj" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Serĉi emoĝion" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Eraro dum ŝarĝo de propraj emoĝioj" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Ofte uzataj" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Aliaj" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} pli…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Serĉi movbildojn" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Funkciigita de GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Tajpi por serĉi movbildojn" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Antaŭa" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Sekva" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Eraro dum ŝargo de movbildoj" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Nesenditaj malnetoj" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Ŝajnas, ke vi havas nesenditajn malnetojn. Ni daŭrigu kie vi ĉesis." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Ĉu forigi ĉi tiun malneton?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Eraro dum forigo de malneto! Bonvolu provi denove." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Forigi…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Eraro ricevi respondan staton!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Ĉu forigi ĉiujn malnetojn?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Eraro dum forigo de malnetoj! Bonvolu provi denove." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Forigi ĉiujn…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Neniuj malnetoj trovitaj." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Balotenketo" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Plurmedio" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Malfermi en nova fenestro" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Akcepti" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Malakcepti" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Akceptita" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Malakceptita" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Nenio por montri" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Kontoj" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Montri pli…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "La fino." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Fulmoklavoj" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Helpo por fulmoklavoj" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Sekva afiŝo" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Antaŭa afiŝo" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Salti karuselon al la sekva afiŝo" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Ŝovo</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Salti karuselon al la antaŭa afiŝo" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Ŝovo</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Ŝargi novajn afiŝojn" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Malfermi detalojn pri afiŝo" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enen-klavo</0> aŭ <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Vastigi enhavaverton aŭ<0/>ŝalti vastigitan/kolapsitan fadenon" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Fermi afiŝon aŭ dialogojn" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc-klavo</0> aŭ <1>Retropaŝo</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Enfokusigu la kolumnon en plurkolumna reĝimo" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> ĝis <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Enfokusigu la sekvan kolumnon en plurkolumna reĝimo" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Enfokusigu la antaŭan kolumnon en plurkolumna reĝimo" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Redakti novan afiŝon" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Redakti novan afiŝon (nova fenestro)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Ŝovo</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Sendi afiŝon" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Stirklavo</0> + <1>Enen-klavo</1> aŭ <2>⌘</2> + <3>Enen-klavo</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Serĉi" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Respondi (nova fenestro)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Ŝovo</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Ŝati (Stemulo)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> aŭ <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Diskonigi" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Ŝovo</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Legosigni" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Baskuligi la ŝtelreĝimon" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Ŝovo</0> + <1>Alt-klavo</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Redakti liston" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Ne eblas redakti liston." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Ne eblas krei liston." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Montri respondoj al listmembroj" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Montri respondojn al homoj, kiujn mi sekvas" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Ne montri respondojn" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Kaŝi afiŝojn en ĉi tiu listo de Hejmo/Sekvatoj" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Krei" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Ĉu forigi ĉi tiun liston?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Ne eblas forigi liston." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Priskribo de plurmedio" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Traduki" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Paroli" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Malfermi originalan plurmedion en nova fenestro" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Malfermi originalan plurmedion" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Provante priskribi bildon. Bonvolu atendi…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Malsukcesis priskribi la bildon" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Priskribi la bildon…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Vidi afiŝon" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Sentema plurmedio" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtrila: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrila" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Afiŝo publikigita. Rigardu." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Respondo publikigita. Rigardu." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Afiŝo ĝisdatigita. Rigardu." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menuo" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Ĉu reŝargi la paĝon nun por ĝisdatigi?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nova ĝisdatigo disponebla…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Sekvatoj" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Aktualiĝi" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Mencioj" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Sciigoj" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Nova" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profilo" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Legosignoj" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Stemuloj" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Sekvataj kradvortoj" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtriloj" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Silentigitaj uzantoj" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Silentigitaj uzantoj…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Blokitaj uzantoj" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Blokitaj uzantoj…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Kontoj…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Ensaluti" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Populara" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Fratara" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Ŝparvojoj / Kolumnoj…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Agordoj…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Listoj" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Ĉiuj listoj" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Sciigo" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Ĉi tiu sciigo estas de via alia konto." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Vidi ĉiujn sciigojn" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} reagis al via afiŝo kun {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} publikigis afiŝon." + +#: src/components/notification.jsx:85 +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} diskonigis vian respondon.} other {{account} diskonigis vian afiŝon.}}} other {{account} diskonigis {postsCount} de viaj afiŝoj.}}} other {{postType, select, reply {<0><1>{0}</1> homoj</0> diskonigis vian respondon.} other {<2><3>{1}</3> homoj</2> diskonigis vian afiŝon.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} sekvis vin.} other {<0><1>{0}</1> homoj</0> sekvis vin.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} petis sekvi vin." + +#: src/components/notification.jsx:151 +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} ŝatis vian respondon.} other {{account} ŝatis vian afiŝon.}}} other {{account} ŝatis {postsCount} de viaj afiŝoj.}}} other {{postType, select, reply {<0><1>{0}</1> homoj</0> ŝatis vian respondon.} other {<2><3>{1}</3> homoj</2> ŝatis vian afiŝon.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Balotenketo, kiun vi voĉdonis aŭ kreis, finiĝis." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Balotenketo, kiun vi kreis, finiĝis." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Balotenketo, pri kiu vi voĉdonis, finiĝis." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Afiŝo, kun kiu vi interagis, estis redaktita." + +#: src/components/notification.jsx:204 +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} diskonigis kaj ŝatis vian respondon.} other {{account} diskonigis kaj ŝatis vian afiŝon.}}} other {{account} diskonigis kaj ŝatis {postsCount} de viaj afiŝoj.}}} other {{postType, select, reply {<0><1>{0}</1> homoj</0> diskonigis kaj ŝatis vian respondon.} other {<2><3>{1}</3> homoj</2> diskonigis kaj ŝatis vian afiŝon.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} aliĝis." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} raportis {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Perditaj konektoj kun <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Moderiga averto" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "Via #Wrapstodon {year} estas ĉi tie!" + +#: src/components/notification.jsx:272 +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." +msgstr "Administranto de <0>{from}</0> malakceptis <1>{targetName}</1>, kio signifas, ke vi ne plu povas ricevi ĝisdatigojn de ili aŭ interagi kun ili." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Administranto de <0>{from}</0> blokis <1>{targetName}</1>. Afektitaj sekvantoj: {followersCount}, Sekvantoj: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Vi blokis <0>{targetName}</0>. Forigitaj sekvantoj: {followersCount}, sekvantoj: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Via konto ricevis moderan averton." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Via konto estas malŝaltita." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Kelkaj el viaj afiŝoj estis markitaj kiel sentemaj." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Kelkaj el viaj afiŝoj estis forigitaj." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Viaj afiŝoj estos markitaj kiel sentemaj ekde nun." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Via konto estis limigita." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Via konto estas malakceptita." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Nekonata tipo de sciigo: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Diskonigita/Ŝatita de…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Ŝatita de…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Diskonigita de…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Sekvita de…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Lerni pli <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "Vidu #Wrapstodon" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Legi pli →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Voĉdonite" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# voĉdono} other {# voĉdonoj}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Kaŝi rezultojn" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Voĉdoni" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Aktualigi" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Montri rezultojn" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> voĉdono} other {<1>{1}</1> voĉdonoj}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> voĉdonanto} other {<1>{1}</1> voĉdonantoj}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Finita <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Finita" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Finante <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Finante" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Trudaĵo" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Trompaj ligiloj, falsa engaĝiĝo aŭ ripetaj respondoj" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Kontraŭleĝa" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Malobservas la leĝon de via aŭ de la servilo lando" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Malobservo de servila regulo" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Malobservas specifajn servilajn regulojn" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Malobservo" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Alia" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "La problemo ne taŭgas en aliaj kategorioj" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Raporti afiŝon" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Raporti @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Atendante revizion" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Afiŝo raportita" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Raportita profilo" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Ne eblas raporti afiŝon" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Ne eblas raporti profilon" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Kio estas la problema kun ĉi tiu afiŝo?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Kio estas la problemo kun ĉi tiu profilo?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Pliaj informoj" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Sendi al <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Sendi Raporton" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Silentigita {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Ne eblas silentigi {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Sendi raporton <0>+ Silentigi profilon</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Blokita {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Ne eblas bloki {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Sendi raporton <0>+ Bloki profilon</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ kontoj, kradvortoj kaj afiŝoj</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Afiŝoj kun <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Afiŝoj etikeditaj kun <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Serĉi <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Kontoj kun <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Hejmo / Sekvatoj" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Publika (Loka / Fratara)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Konto" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Kradvorto" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "Listo ID" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Nur loka" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Nodo" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Nedeviga, ekz. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Serĉi terminon" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Nedeviga, krom se por plurkolumna reĝimo" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "ekz. PixelArt (Maksimumo 5, spac-separata)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Nur plurmedio" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Ŝparvojoj" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Indiki liston de ŝparvojoj, kiuj aperos kiel:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Flosanta butono" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Langetaro/Menubreto" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Plurkolumno" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Ne disponebla en nuna vidoreĝimo" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Moviĝi supren" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Moviĝi malsupren" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Redakti" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Aldoni pli ol unu ŝparvojon/kolumnon por ke ĉi tio funkciu." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Ankoraŭ neniuj kolumnoj. Alklaku la butonon Aldoni kolumnon." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Ankoraŭ neniuj ŝparvojoj. Alklaku la butonon Aldoni ŝparvojon." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Ĉu vi ne certas, kion aldoni? <0/>Provu unue aldoni <1>Hejmo / Sekvatoj kaj Sciigoj</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Maks. {SHORTCUTS_LIMIT} kolumnoj" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Maks. {SHORTCUTS_LIMIT} ŝparvojoj" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importi/eksporti" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Aldoni kolumnon…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Aldoni ŝparvojon…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Specifa listo estas laŭvola. Por plurkolumna reĝimo, listo estas postulata, alie la kolumno ne estos montrata." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Por plurkolumna reĝimo, serĉtermino estas postulata, alie la kolumno ne estos montrata." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Plurkradvortoj estas subtenataj. Spac-separataj." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Redakti ŝparvojon" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Aldoni ŝparvojon" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Templinio" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Listo" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importi/eksporti <0>Ŝparvojoj</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importi" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Alglui ŝparvojojn ĉi tie" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Elŝutante konservitajn ŝparvojojn de nodservilo…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Ne eblas elŝuti ŝparvojojn" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Elŝuti ŝparvojojn de nodservilo" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Ekzistas en nunaj ŝparvojoj" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Listo eble ne funkcias se ĝi venas de malsama konto." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Nevalida agorda formato" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Ĉu aldoni al nunaj ŝparvojoj?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Nur ŝparvojoj kiuj ne ekzistas en la nunaj ŝparvojoj estos aldonitaj." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Ne estas novaj ŝparvojoj por importi" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Ŝparvojoj importitaj. Superita maksimumo {SHORTCUTS_LIMIT}, do la ceteraj ne estas importitaj." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Ŝparvojoj importitaj" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importi kaj aldoni…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Ĉu anstataŭi nunajn ŝparvojojn?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Ĉu importi ŝparvojojn?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "aŭ anstataŭi…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importi…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Eksporti" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Ŝparvojoj kopiitaj" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Ne eblas kopii ŝparvojoj" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Ŝparvojaj agordoj kopiitaj" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Ne eblas kopii ŝparvojajn agordojn" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Diskonigi" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Konservante ŝparvojojn al nodservilo…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Ŝparvojoj konservitaj" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Ne eblas konservi ŝparvojojn" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sinkronigi al nodservilo" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# skribsigno} other {# skribsignoj}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Ne estas plu ŝparvojoj por importi" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importi/eksporti agordojn de/al nodservilo (Tre eksperimenta)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>diskonigita</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Pardonu, la nodo en kiu vi estas ensalutinta ne permesas vin interagi kun ĉi tiu afiŝo de alia nodo." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Ne plu ŝatis la afiŝon de {0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Ŝatis la afiŝon de {0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Ne plu legosignis la afiŝon de @{0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Legosignis la afiŝon de @{0}" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Ne plu diskonigi" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Citaĵo" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Iuj plurmedioj ne havas priskribojn." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Malnova afiŝo (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Ne plu diskonigita la afiŝon de @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Diskonigita la afiŝon de @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Diskonigi…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Ne plu ŝati" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Ŝatata" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Ne plu legosignis" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Vidi afiŝon de <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Montri redaktan historion" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Redaktita: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Enkorpigi afiŝon" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Konversacion nesilentigita" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Konversacion silentigita" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Ne eblas nesilentigi konversacion" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Ne eblas silentigi konversacion" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Nesilentigi konversacion" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Silentigi konversacion" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Afiŝo depinglinta de profilo" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Afiŝo alpinglita al profilo" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Ne eblas depingli afiŝon" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Ne eblas alpingli afiŝon" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Depingli de profilo" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Alpingli al la profilo" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Ĉu forigi ĉi tiun afiŝon?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Afiŝo forigita" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Ne eblas forigi afiŝon" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Raporti afiŝon…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Ŝatita" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Diskonigita" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Legosignita" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Alpinglita" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Forigita" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# respondo} other {# respondoj}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Fadeno{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Montru malpli" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Montru envahon" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Montri plurmedion" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Redaktita" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Komentoj" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Pli de <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Redaktan historion" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Malsukcesis ŝargi historion" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Ŝargante…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML-kodo" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML-kodo kopiita" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Ne eblas kopii HTML-kodon" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Plurmediaj aldonaĵoj:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Emoĝioj de la konto:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "statika URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emoĝioj:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notoj:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Ĉi tio estas senmova, ne stilita kaj senskriba. Vi eble bezonos apliki viajn proprajn stilojn kaj redakti laŭbezone." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Balotenketoj ne estas interagaj kaj estos konvertitaj al listo kun balotkalkuloj." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Plurmediaj aldonaĵoj povas esti bildoj, filmetoj, sonaĵoj aŭ ajnaj dosiertipoj." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Afiŝo povus esti redaktita aŭ forigita poste." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Antaŭrigardo" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Noto: Ĉi tiu antaŭmontro estas malpeze stilita." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> diskonigita" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Novaj afiŝoj" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Provu denove" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Diskonigo} other {# Diskonigoj}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Alpinglitaj afiŝoj" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Fadeno" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtrita</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Aŭtomate tradukita el {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Tradukante…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Traduki el {sourceLangText} (aŭtomate detektita)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Traduki el {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Aŭtomata ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Malsukcesis traduki" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Redaktante la originalan mesaĝon" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Respondi al @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Vi povas fermi ĉi tiun paĝon nun." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Fermi fenestron" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Ensaluto bezonata." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Iru hejmen" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Afiŝoj de la konto" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Respondoj)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Diskonigoj)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Plurmedio)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Malplenigi filtrojn" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Malplenigi" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Montrante afiŝon kun respondoj" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Respondoj" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Montrante afiŝojn sen diskonigoj" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Diskonigoj" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Montrante afiŝojn kun plurmedio" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Montrante afiŝojn etikeditaj kun #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Montrante afiŝojn en {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Nenio vidinda ĉi tie ankoraŭ." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Ne eblas ŝargi afiŝojn" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Ne eblas ricevi informojn pri konto" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Iri al la nodo de la konto {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Iri al mia nodo (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Monato" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Nuna" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Defaŭlto" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Ŝalti al ĉi tiu konto" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Ŝalti en novan langeton/fenestron" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Vidi profilon…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Agordi kiel defaŭltan" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Ĉu elsaluti <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Elsaluti…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Aldoni ekzistantan konton" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Noto: <0>Defaŭlta</0> konto ĉiam estos uzata por la unua ŝarĝo. Ŝanĝitaj kontoj daŭros dum la sesio." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Ankoraŭ neniuj legosignoj. Iru legosigni ion!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Ne eblas ŝargi legosignoj." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "la lasta horo" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "la lastaj 2 horoj" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "la lastaj 3 horoj" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "la lastaj 4 horoj" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "la lastaj 5 horoj" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "la lastaj 6 horoj" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "la lastaj 7 horoj" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "la lastaj 8 horoj" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "la lastaj 9 horoj" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "la lastaj 10 horoj" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "la lastaj 11 horoj" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "la lastaj 12 horoj" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "pli ol 12 horoj" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Sekvataj etikedoj" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Grupoj" + +#: 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 "Montrante {selectedFilterCategory, select, all {ĉiuj afiŝoj} original {originalaj afiŝoj} replies {respondoj} boosts {diskonigoj} followedTags {sekvitaj etikedoj} groups {grupoj} filtered {filtritaj afiŝoj}}, {sortBy, select, createdAt {{sortOrder, select, asc {plej malnova} desc {lastaj}}} reblogsCount {{sortOrder, select, asc {plej malmultaj diskonigoj} desc {plej multaj diskonigoj}}} favouritesCount {{sortOrder, select, asc {plej malmutaj ŝatataj} desc {plej multaj ŝatataj}}} repliesCount {{sortOrder, select, asc {plej malmultaj respondoj} desc {plej multaj respondoj}}} density {{sortOrder, select, asc {malplej densa} desc {plej densa}}}} first{groupBy, select, account {, grupigitaj per aŭtoroj} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Aktualiĝi <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Helpo" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Kio estas ĉi tio?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Aktualiĝi estas aparta templinio por viaj sekvantaroj, ofertante altnivelan vidon je unu ekrigardo, kun simpla, retpoŝta interfaco por senpene ordigi kaj filtri afiŝojn." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Antaŭrigardo de Aktualiĝo UI" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Ni atingu" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Ni atingu la afiŝojn de viaj sekvantoj." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Montri al mi ĉiujn afiŝojn de…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "ĝis la maksimumo" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Atingi" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Interkovri kun via lasta aktualiĝo" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Ĝis la lasta aktualiĝo ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Noto: Via nodo povus nur montri maksimume 800 afiŝojn en la Hejma templinio sendepende de la tempointervalo. Povus esti malpli aŭ pli." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Antaŭe…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# afiŝo} other {# afiŝoj}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Ĉu forigi ĉi tiun aktualiĝon?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Forigante aktualiĝon {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Aktualiĝo {0} forigita" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Noto: Nur maksimume 3 estos konservitaj. La resto estos aŭtomate forigita." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Ricevante afiŝojn…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Ĉi tio eble daŭros iom da tempo." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Restartigi filtrilojn" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Popularaj ligiloj" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Diskonigita de {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Ĉiuj" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# aŭtoro} other {# aŭtoroj}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Ordigi" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Dato" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Denseco" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Filtri" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Aŭtoroj" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Nenio" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Montri ĉiujn aŭtorojn" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Vi ne devas legi ĉion." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Jen ĉio." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Supren" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Ligiloj diskonigitaj per sekvantoj, ordigitaj laŭ komunaj kalkuloj, diskonigoj kaj ŝatoj." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Ordigo: Denseco" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Afiŝoj estas ordigitaj laŭ informa denseco aŭ profundo. Pli mallongaj afiŝoj estas \"pli malpezaj\" dum pli longaj afiŝoj estas \"pli pezaj\". Afiŝoj kun fotoj estas \"pli pezaj\" ol afiŝoj sen fotoj." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Grupo: Aŭtoroj" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Afiŝoj estas grupigitaj laŭ aŭtoroj, ordigitaj laŭ nombro de afiŝoj per aŭtoro." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Sekva aŭtoro" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Antaŭa aŭtoro" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Rulumi supren" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtrita: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Ankoraŭ neniuj stemuloj. Iru, trovu ion por ŝati!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Ne eblas ŝargi stelumojn." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Hejmo kaj listoj" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Publikaj templinioj" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Konversacioj" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profiloj" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Neniam" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Nova filtrilo" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtrilo} other {# filtriloj}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Ne eblas ŝargi filtrilojn." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Ankoraŭ ne estas filtriloj." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Aldoni filtrilon" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Redakti filtrilon" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Ne eblas redakti filtrilon" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Ne eblas krei filtrilon" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Titolo" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Tuta vorto" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Ne estas ŝlosilvortoj. Aldonu unu." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Aldoni ŝlosilvorton" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# ŝlosilvorto} other {# ŝlosilvortoj}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtri de…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Ankoraŭ ne disponigita" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Stato: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Ŝanĝi eksvalidiĝon" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Eksvalidiĝo" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Filtrita afiŝo estos…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimumigita" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "kaŝita" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Ĉu forigi ĉi tiun filtrilon?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Ne eblas forigi filtrilon." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Finiĝita" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Finiĝanta <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Neniam finiĝas" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# kradvorto} other {# kradvortoj}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Ne eblas ŝargi sekvatajn kradvortojn." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Neniuj kradvortoj ankoraŭ sekvis." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Nenio vidinda ĉi tie." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Ne eblas ŝargi afiŝojn." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (Nur plurmedio) en {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} en {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (Nur plurmedio)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Neniu ankoraŭ afiŝis ion kun ĉi tiu kradvorto." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Ne eblas ŝargi afiŝojn kun tiu ĉi kradvorto" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Ĉu ĉesi sekvi #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Nesekvita #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Sekvita #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Sekvatoj…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Nemontrita en profilo" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Ne eblas nemontri en profilo" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Montrita en profilo" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Montri en profilo" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, other {Maks. # kradvortoj}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Aldoni kradvorton" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Forigi kradvorton" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Maks. # ŝparvojo atingita. Ne eblas aldoni ŝparvojon.} other {Maks. # ŝparvojoj atingitaj. Ne eblas aldoni ŝparvojon.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Ĉi tiu ŝparvojo jam ekzistas" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Kradvorto-ŝparvojo aldonita" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Aldoni al ŝparvojoj" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Entajpi novan nodon, ekz. \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Senvalida nodo" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Iri al alia nodo…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Iri al mia nodo (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Ne eblas ŝarĝi sciigojn." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Nova</0> <1>Petoj de sekvado</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Vidi ĉion" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Solvante…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Ne eblas solvi retadreson" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Ankoraŭ nenio." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Administri membrojn" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Ĉu forigi <0>@{0}</0> el listo?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Forigi…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {#listo} other {# listoj}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Ankoraŭ ne estas listoj." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Malsukcesis registri aplikaĵon" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "noda domajno" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "ekz. “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Malsukcesis ensaluti. Bonvolu provi denove aŭ provi alian nodon." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Daŭrigi per {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Daŭrigi" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Ĉu vi ankoraŭ ne havas konton? Kreu unu!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Privataj mencioj" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privata" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Neniu menciis vin :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Ne eblas ŝargi menciojn." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Vi ne sekvas" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Kiuj ne sekvas vin" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Kun nova konto" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Kiu nepetite privata mencias vin" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Kiuj estas limigitaj de servilaj moderigantoj" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Agordoj pri sciigoj" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Novaj sciigoj" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Anonco} other {Anoncoj}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Petoj de sekvado" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# peto de sekvado} other {# petoj de sekvado}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Filtritaj sciigoj de # persono} other {Filtritaj sciigoj de # personoj}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Nur mencioj" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Hodiaŭ" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Vi estas aktualiĝa." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Hieraŭ" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Ne eblas ŝargi sciigojn" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Sciigaj agordoj ĝisdatigitaj" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Filtri sciigojn de homoj:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtrilo" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignori" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Ĝisdatigita <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Vidi sciigojn de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Sciigoj de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Sciigoj de @{0} ne estos filtritaj ekde nun." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Ne eblas akcepti sciigan peton" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Permesi" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Sciigoj de @{0} ne aperos en Filtritaj sciigoj ekde nun." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Ne eblas malakcepti sciigan peton" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Fermi" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Fermita" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Loka templinio ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Fratara templinio ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Loka templinio" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Fratara templinio" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Neniu ankoraŭ afiŝis ion." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Ŝalti al Federacia" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Ŝalti al Loka" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Serĉi: {q} (Afiŝoj)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Serĉi: {q} (Kontoj)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Serĉi: {q} (Kradvortoj)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Serĉi: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Kradvortoj" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Vidi pli" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Vidi pli da kontoj" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Neniuj kontoj trovitaj." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Vidi pli da kradvortoj" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Neniuj kradvortoj trovitaj." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Vidi pli da afiŝoj" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Neniuj afiŝoj trovitaj." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Enigi vian serĉterminon aŭ alglui URL-on supre por komenci." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Agordoj" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Apero" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Hela" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Malhela" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Aŭtomata" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Tekstogrando" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Lingvo de la fasado" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Volontulaj tradukoj" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Afiŝante" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Defaŭlta videblo" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Sinkronigita" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Malsukcesis ĝisdatigi afiŝan privatecon" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Sinkronigita kun la agordoj de via nodservilo. <0>Iru al via nodo ({instance}) por pliaj agordoj.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Eksperimentoj" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Aŭtomate aktualigi templiniajn afiŝojn" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Karuselon de diskonigoj" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Traduko de afiŝoj" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Traduki al" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Sistemlingvo ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {Kaŝi la butonon \"Traduki\" por:} other {Kaŝi la butonon \"Traduki\" por (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Noto: Ĉi tiu funkcio uzas eksterajn tradukservojn, funkciigitajn de <0>Lingva API</0> kaj <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Maŝintradukado" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Aŭtomate montri tradukon por afiŝoj en templinio. Funkcias nur por <0>mallongaj</0> afiŝoj sen enhavaverto, plurmedio kaj balotenketo." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "GIF-Elektilo por redaktado" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Noto: Ĉi tiu funkcio uzas eksteran GIF-serĉan servon, funkciigitan de <0>GIPHY</0>. G-taksita (taŭga por spektado de ĉiuj aĝoj), spuraj parametroj estas nudigitaj, referencaj informoj estas preterlasitaj de petoj, sed serĉdemandoj kaj IP-adresinformoj ankoraŭ atingos iliajn servilojn." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Generilo pri priskribo de bildoj" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Nur por novaj bildoj dum verkado de novaj afiŝoj." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Noto: Ĉi tiu funkcio uzas eksteran AI-servon, funkciigitan de <0>img-alt-api</0>. Eble ne funkcias bone. Nur por bildoj kaj en la angla." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Servil-flankaj grupigitaj sciigoj" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Funkcio en alfa-versio. Eble plibonigita grupigfenestro, sed kun baza grupiglogiko." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "\"Nuba\" importo/eksporto por ŝparvojaj agordoj" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Tre eksperimenta.<0/>Konservita en la notoj de via propra profilo. Profilaj (privataj) notoj estas ĉefe uzataj por aliaj profiloj, kaj kaŝitaj por propra profilo." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Noto: Ĉi tiu funkcio uzas la API de la aktuale ligita nodservilo." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Ŝtelreĝimo <0>(<1>Teksto</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Anstataŭigi tekston kiel blokojn, utilajn kiam oni prenas ekrankopiojn, pro privatecaj kialoj." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Pri" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Konstruita</0> de <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Patroni" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Donaci" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Privateca politiko" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Retejo:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versio:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Versioĉeno kopiita" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Ne eblas kopii versioĉenon" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Malsukcesis ĝisdatigi abonon. Bonvolu provi denove." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Malsukcesis forigi abonon. Bonvolu provi denove." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Puŝaj sciigoj (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Puŝaj sciigoj estas blokitaj. Bonvolu aktivigi ilin en via retumila agordo." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Permesi de <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "iu ajn" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "homoj, kiujn mi sekvas" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "sekvantoj" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Sekvas" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Balotenketoj" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Redaktoj de la afiŝo" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Puŝo-permeso ne estis donita ekde via lasta ensaluto. Vi devos <0><1>ensaluti</1> denove por doni puŝo-permeson</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "NOTO: Puŝaj sciigoj funkcias nur por <0>unu konto</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Afiŝo" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Vi ne estas ensalutinta. Interagoj (respondi, diskonigi, ktp) ne eblas." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Ĉi tiu afiŝo estas de alia nodo (<0>{instance}</0>). Interagoj (respondi, diskonigi, ktp) ne eblas." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Eraro: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Iri al mia nodo por ŝalti interagojn" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Ne eblas ŝargi respondojn." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Reen" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Iri al ĉefa afiŝo" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} afiŝoj supre ‒ Iri supren" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Ŝalti al Flanka Vido" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Ŝalti al Plena Vido" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Montri ĉiujn sentemajn enhavojn" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Eksperimenta" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Ne eblas ŝalti" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Iri al nodo de la afiŝo ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Iri al la nodo de la afiŝo" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Ne eblas ŝargi afiŝon" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# respondo} other {<0>{1}</0> respondoj}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# komento} other {<0>{0}</0> komentoj}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Vidi afiŝon kun siaj respondoj" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Populara ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Popularaj Novaĵoj" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Per {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Reen al montrado de popularaj afiŝoj" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Montrante afiŝojn kiuj mencias <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Popularaj afiŝoj" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Neniuj popularaj afiŝoj." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Minimuma retkliento por Mastodon, kiu faras aferojn laŭ via maniero." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Ensaluti per Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Aliĝi" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Konekti vian ekzistantan Mastodon/Fediverson-konton.<0/>Viaj ensalutiloj ne estas konservitaj en ĉi tiu servilo." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Konstruita</0> de <1>@cheeaun</1>. <2>Regularo pri privateco</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Ekrankopio de Karuselon de diskonigoj" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Karuselon de diskonigoj" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Vide apartigu originalajn afiŝojn kaj redividitajn afiŝojn (diskonigitajn afiŝojn)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Ekrankopio de grupigita komenta fadeno" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Grupigita komenta fadeno" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Sekvi konversaciojn perfekte. Duonfaldeblaj respondoj." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Ekrankopio de grupigitaj sciigoj" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Grupigitaj sciigoj" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Similaj sciigoj estas grupigitaj kaj kolapsitaj por redukti malordon." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Ekrankopio de plurkolumna uzantinterfaco" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Ununuro aŭ plurkolumno" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Defaŭlte, ununura kolumno por serĉantoj de zen-reĝimo. Agordebla plurkolumno por altnivelaj uzantoj." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Ekrankopio de plurkradvorta templinio kun formo por aldoni pliajn kradvortojn" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Plurkradvorta templinio" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Ĝis 5 kradvortoj kombinitaj en ununuran templinion." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Ŝajnas, ke via retumilo blokas ŝprucfenestrojn." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Malneto afiŝo estas nuntempe minimumigita. Afiŝu aŭ forĵetu ĝin antaŭ ol krei novan." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Afiŝo estas nuntempe malfermita. Afiŝu aŭ forĵetu ĝin antaŭ ol krei novan." + diff --git a/src/locales/es-ES.po b/src/locales/es-ES.po new file mode 100644 index 00000000..6231749b --- /dev/null +++ b/src/locales/es-ES.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: es\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 20:36\n" +"Last-Translator: \n" +"Language-Team: Spanish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Bloqueado" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Publicaciones: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Última publicación: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatizado" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Grupo" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Mutuo" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Solicitado" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Seguidos" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Te sigue" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# seguidor} other {# seguidores}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Verificado" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Se unió el <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Siempre" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "No se ha podido cargar la cuenta." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Ir a la página de la cuenta" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Seguidores" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Seguidos" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Publicaciones" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Más" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> ha indicado que su nueva cuenta es:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Identificador copiado" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "No se ha podido copiar el identificador" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Copiar identificador" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Ir a la página de perfil original" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Ver imagen del perfil" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Ver cabecera del perfil" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "Cuenta conmemorativa" + +#: 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 usuario ha optado por no hacer esta información disponible." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} originales, {1} respuestas, {2} impulsos" + +#: 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 publicación en el último día} other {Última publicación en los últimos {2} días}}} other {{3, plural, one {Últimas {4} publicaciones en el último día} other {Últimas {5} publicaciones en los últimos {6} días}}}}" + +#: 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 publicación en el último año(s)} other {Últimas {1} publicaciones en el último año(s)}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Originales" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Respuestas" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Impulsos" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Las estadísticas de las publicaciones no están disponibles." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Ver las estadísticas de las publicaciones" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Última publicación: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Silenciado" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Bloqueado" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Nota privada" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Mencionar a <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Traducir biografía" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Editar nota privada" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Añadir nota privada" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Notificaciones activadas para las publicaciones de @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Notificaciones desactivadas para las publicaciones de @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Desactivar las notificaciones" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Activar las notificaciones" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Impulsos de @{username} activados." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Impulsos de @{username} desactivados." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Desactivar impulsos" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Activar impulsos" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Añadir/eliminar de las listas" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "El enlace ha sido copiado" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "No se ha podido copiar el enlace" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Copiar" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Compartir parece no funcionar." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Compartir…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Se ha dejado de silenciar a @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Dejar de silenciar a <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Silenciar a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Se ha silenciado a @{username} por {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "No se ha podido silenciar a @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "¿Deseas eliminar a <0>@{username}</0> de los seguidores?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} se ha eliminado de los seguidores" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Eliminar seguidor…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "¿Deseas bloquear a <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Se ha desbloqueado a @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Has bloqueado a @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "No se ha podido desbloquear a @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "No se ha podido bloquear a {username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Desbloquear a <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Bloquear a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Reportar a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Editar perfil" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "¿Deseas retirar la solicitud de seguimiento?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "¿Deseas dejar de seguir a @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Dejar de seguir…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Descartar…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Seguir" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Cerrar" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Biografía traducida" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "No se ha podido eliminar de la lista." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "No se ha podido añadir a la lista." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "No se ha podido cargar las listas." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "No hay listas." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nueva lista" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Nota privada acerca de <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "No se ha podido actualizar la nota privada." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Cancelar" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Guardar y cerrar" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "No se ha podido actualizar el perfil." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nombre" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Biografía" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Campos adicionales" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etiqueta" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Contenido" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Guardar" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "nombre de usuario" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "nombre de dominio del servidor" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "El modo oculto ha sido desactivado" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "El modo oculto ha sido activado" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Inicio" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Redactar" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Añadir multimedia" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Insertar emoji personalizado" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Añadir GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Añadir una encuesta" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Tienes cambios sin guardar. ¿Deseas descartar esta publicación?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {El archivo {1} no es compatible.} other {Los archivos {2} no son compatibles.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Solo puedes adjuntar hasta 1 archivo.} other {Solo puedes adjuntar hasta # archivos.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Salir" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimizar" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Parece que has cerrado la ventana principal." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Parece que ya tienes una ventana de edición abierta en la ventana principal y que se está publicando. Por favor, espera a que se publique e inténtalo de nuevo más tarde." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Parece que ya tienes una ventana de redacción abierta en la ventana principal. Entrando en esta ventana se descartarán los cambios que hiciste. ¿Deseas continuar?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Mostrar" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Respondiendo a la publicación de @{0}(<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Respondiendo a la publicación de @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Editando la publicación original" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "La encuesta debe tener al menos 2 opciones" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Algunas opciones de la encuesta están vacías" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Algunos archivos no tienen descripciones. ¿Desear continuar?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Error al adjuntar #{i}" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Advertencia de contenido" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Advertencia de contenido o medio sensible" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Público" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Local" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "No listado" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Solo seguidores" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Mención privada" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Publica tu respuesta" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Edita tu publicación" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "¿En qué estás pensando?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Añadir advertencia de contenido" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Añadir" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Responder" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Actualizar" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Publicar" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Descargando GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Hubo un fallo al descargar el GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Más…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Cargado" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Descripción de la imagen" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Descripción del vídeo" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Descripción del audio" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "El tamaño del archivo es demasiado grande. La carga podría tener problemas. Intenta reducir el tamaño del archivo de {0} a {1} o inferior." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "La dimensión es demasiado grande. La carga podría tener problemas. Intenta reducir la dimensión de {0}×{1}px a {2}×{3}px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Tasa de fotogramas demasiado alta. La carga podría tener problemas." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Eliminar" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Error" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Editar descripción de la imagen" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Editar descripción del vídeo" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Editar descripción del audio" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Generando descripción. Por favor, espera…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "No se ha podido generar la descripción: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "No se ha podido generar la descripción" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Generar descripción…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "No se ha podido generar la descripción{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— experimental</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Hecho" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Opción {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Varias opciones" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Duración" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Eliminar encuesta" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Buscar cuentas" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Error al cargar cuentas" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Emojis personalizados" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Buscar emoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Error al cargar emojis personalizados" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Usado recientemente" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Otros" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} más…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Buscar GIF" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Con tecnología de GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Escribe para buscar un GIF" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Anterior" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Siguiente" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Error al cargar los GIF" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Borradores no enviados" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Parece que tienes borradores sin enviar. Prosigamos donde lo dejaste." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "¿Deseas eliminar este borrador?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "¡Error al eliminar el borrador! Por favor, inténtalo de nuevo." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Eliminar…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "¡Error al obtener el estado de la respuesta!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "¿Deseas eliminar todos los borradores?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "¡Error al eliminar borradores! Por favor, inténtalo de nuevo." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Eliminar todo…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "No se han encontrado borradores." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Encuesta" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Multimedia" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Abrir en una nueva ventana" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Aceptar" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Rechazar" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Aceptado" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Rechazado" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "No hay nada que mostrar" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Cuentas" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Mostrar más…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "El fin." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Atajos de teclado" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Ayuda de los atajos de teclado" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Siguiente publicación" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Anterior publicación" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Saltar carrusel a la siguiente publicación" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Mayús</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Saltar carrusel a la anterior publicación" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Mayús</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Cargar nuevas publicaciones" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Abrir detalles de la publicación" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Intro</0> u <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Expandir advertencia de contenido o<0/>alternar hilo ampliado/colapsado" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Cerrar publicación o diálogos" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> o <1>Retroceso</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Enfocar columna en el modo de múltiples columnas" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> a <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Enfocarse en la siguiente columna en el modo multicolumna" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Enfocarse en la anterior columna en el modo multicolumna" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Redactar nueva publicación" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Redactar nueva publicación (nueva ventana)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Mayús</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Enviar publicación" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Intro</1> o <2>⌘</2> + <3>Intro</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Buscar" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Responder (nueva ventana)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Mayús</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Me gusta (favorito)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> o <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Impulsar" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Mayús</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Añadir marcador" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Activar o desactivar el modo oculto" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Mayús</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Editar lista" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "No se ha podido editar la lista." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "No se ha podido crear la lista." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Mostrar respuestas a la lista de miembros" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Mostrar respuestas a las personas que sigo" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "No mostrar respuestas" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Ocultar publicaciones en esta lista de Inicio/Seguidos" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Crear" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "¿Deseas eliminar esta lista?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "No se ha podido eliminar la lista." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Descripción de la imagen" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Traducir" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Hablar" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Abrir archivo original en una nueva ventana" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Abrir archivo original" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Intentando describir la imagen. Por favor, espera…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "No se ha podido describir la imagen" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Describe la imagen…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Ver publicaciones" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Imagen sensible" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtrado: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrado" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Publicado. Échale un vistazo." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Respuesta publicada. Échale un vistazo." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Publicación actualizada. Échale un vistazo." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menú" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "¿Recargar página ahora para actualizar?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Hay una nueva actualización disponible…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Seguidos" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Ponerse al día" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Menciones" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Notificaciones" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Nuevo" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Perfil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Marcadores" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Me gustan" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Etiquetas seguidas" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtros" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Usuarios silenciados" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Usuarios silenciados…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Usuarios bloqueados" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Usuarios bloqueados…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Cuentas…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Inicia sesión" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Tendencias" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federados" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Atajos / Columnas…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Configuración…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Listas" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Todas las listas" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Notificación" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Esta notificación proviene de tu otra cuenta." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Ver todas las notificaciones" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} reaccionó a tu publicación con {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} ha hecho una publicación." + +#: src/components/notification.jsx:85 +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} impulsó tu respuesta.} other {{account} impulsó tu publicación.}}} other {{account} impulsó {postsCount} de tus publicaciones.}}} other {{postType, select, reply {<0><1>{0}</1> personas</0> impulsaron tu respuesta.} other {<2><3>{1}</3> persona</2> impulsaron tu publicación.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} te comenzó a seguir.} other {<0><1>{0}</1> personas</0> te comenzaron a seguir.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} ha solicitado seguirte." + +#: src/components/notification.jsx:151 +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 {A {account} le gustó tu respuesta.} other {A {account} le gustó tu publicación.}}} other {A {account} le gustó {postsCount} de tus publicaciones.}}} other {{postType, select, reply {A <0><1>{0}</1> personas</0> les gustó tu respuesta.} other {A <2><3>{1}</3> personas</2> les gustó tu publicación.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Una encuesta en la que has votado o creado ha finalizado." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Una encuesta que has creado ha finalizado." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Una encuesta en la que has votado ha finalizado." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Una publicación con la que interactuaste ha sido editada." + +#: src/components/notification.jsx:204 +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} impulsó y le gustó tu respuesta.} other {{account} impulsó y le gustó tu publicación.}}} other {{account} impulsó y le gustó {postsCount} de tus publicaciones.}}} other {{postType, select, reply {<0><1>{0}</1> personas</0> impulsaron y les gustó tu respuesta.} other {<2><3>{1}</3> personas</2> impulsaron y les gustó tu publicación.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} registrado." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} reportó {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Conexiones perdidas con <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Advertencia de moderación" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "¡Tu #Wrapstodon {year} está aquí!" + +#: src/components/notification.jsx:272 +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." +msgstr "Un administrador de <0>{from}</0> ha suspendido <1>{targetName}</1>, lo que significa que ya no puedes recibir actualizaciones de sus cuentas o interactuar con ellas." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Un administrador de <0>{from}</0> ha bloqueado <1>{targetName}</1>. Seguidores afectados: {followersCount}, siguiendo: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Has bloqueado <0>{targetName}</0>. Seguidores eliminados: {followersCount}, siguiendo: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Tu cuenta ha recibido un aviso de moderación." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Tu cuenta ha sido desactivada." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Se han marcado como sensibles algunas de tus publicaciones." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Algunas de tus publicaciones han sido eliminadas." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "De ahora en adelante, todas tus publicaciones se marcarán como sensibles." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Tu cuenta ha sido limitada." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Tu cuenta ha sido suspendida." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Tipo de notificación desconocido: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Impulsado por/Le gustó a…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Le gusta a…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Impulsado por…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Seguido por…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Más información <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "Ver #Wrapstodon" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Leer más →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Votado" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# voto} other {# votos}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Ocultar resultados" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Votar" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Actualizar" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Mostrar resultado" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> voto} other {<1>{1}</1> votos}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> votante} other {<1>{1}</1> votantes}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Terminado <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Terminado" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Terminando <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Terminando" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Spam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Enlaces maliciosos, interacciones falsas o respuestas repetitivas" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Ilegal" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Viola la ley de tu país o del servidor" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Violación de regla del servidor" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Incumple normas específicas del servidor" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Violación" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Otros" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "El problema no encaja en otras categorías" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Reportar esta publicación" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Reportar a @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Revisiones pendientes" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Publicación reportada" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Perfil reportado" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "No se ha podido reportar la publicación" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "No se ha podido reportar el perfil" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "¿Cuál es el problema con esta publicación?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "¿Cuál es el problema con este perfil?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Información adicional" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Enviar a <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Enviar reporte" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Silenciar a {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "No se ha podido silenciar a {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Enviar reporte <0>+ Silenciar perfil</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Bloquear a @{username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "No se ha podido bloquear a {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Enviar reporte <0>+ Bloquear perfil</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ cuentas, etiquetas y publicaciones</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Publicaciones con <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Publicaciones etiquetadas con <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Buscar <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Cuentas con <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Inicio / Seguidos" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Público (Local / Federado)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Cuenta" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Etiqueta" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID de lista" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Solo local" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instancia" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Opcional, por ejemplo, mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Buscar término" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Opcional, excepto para el modo de múltiples columnas" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "p. ej. PixelArt (Max 5, separada por espacios)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Solo multimedia" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Atajos" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "versión beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Especifica una lista de atajos que aparecerán como:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Botón flotante" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Pestaña/Barra de menú" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Múltiples columnas" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "No está disponible en el modo de vista actual" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Subir" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Bajar" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Editar" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Añade más de un atajo/columna para hacer que esto funcione." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "No hay columnas todavía. Pulsa en el botón Añadir columna." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "No hay atajos todavía. Pulsa en el botón Añadir atajo." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "¿No estás seguro de qué añadir?<0/>Prueba a añadir <1>Inicio / Seguidos y Notificaciones</1> primero." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Máx. de columnas {SHORTCUTS_LIMIT}" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Max. de atajos {SHORTCUTS_LIMIT}" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importar/exportar" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Añadir columna…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Añadir atajo…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Especificar una lista es opcional. Para el modo de múltiples columnas, la lista es obligatoria, de lo contrario la columna no se mostrará." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Para el modo de múltiples columnas, es necesario un término de búsqueda; sin él, no se mostrará la columna." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Se permiten múltiples etiquetas, separadas por espacios." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Editar atajo" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Añadir atajo" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Línea de tiempo" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Lista" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importar/Exportar <0>Atajos</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importar" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Pegar atajos aquí" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Descargando atajos guardados desde el servidor de instancia…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "No se han podido descargar los atajos" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Descargando atajos guardados desde el servidor de la instancia" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Existe en los atajos actuales" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "La lista puede no funcionar si es de una cuenta diferente." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Formato de ajustes inválido" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "¿Deseas añadir a los atajos ya existentes?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Solo se agregarán los atajos que no existan en los actuales atajos." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "No hay nuevos atajos para importar" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Los atajos han sido importados. Se ha excedido el máximo {SHORTCUTS_LIMIT}, por lo que el resto no serán importados." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Atajos importados" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importar y añadir…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "¿Deseas anular los atajos actuales?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "¿Deseas importar atajos?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "o sobreescribir…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importar…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exportar" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Los atajos han sido copiados" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "No se ha podido copiar los atajos" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Ajustes de los atajos copiados" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "No se ha podido copiar los ajustes de los atajos" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Compartir" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Guardando atajos a la instancia del servidor…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Los atajos han sido guardados" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "No se ha podido guardar los atajos" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sincronizar al servidor de instancia" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0,plural, one{# carácter} other{# caracteres}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "No hay más atajos que importar" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importar / exportar ajustes del / hacia el servidor de la instancia (En fase muy experimental)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>impulsó</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Lo sentimos, la instancia en la que estás conectado no te permite interactuar con esta publicación de otra instancia." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "No me gustó la publicación de {0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Me gustó la publicación de {0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Dejar de guardar como marcador la publicación de {0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Guardado como marcador la publicación de {0}" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Dejar de impulsar" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Cita" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Algunos archivos no tienen descripciones." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Antiguas publicaciones (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Has dejado de impulsar la publicación de @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Has impulsado la publicación de @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Impulsar…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "No me gusta" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Me gusta" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Quitar marcador" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Ver publicación de <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Mostrar historial de ediciones" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Se editó el: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Insertar publicación" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Has dejado de silenciar la conversación" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Has silenciado la conversación" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "No se ha podido dejar de silenciar la conversación" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "No se ha podido silenciar la conversación" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Dejar de silenciar conversación" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Silenciar conversación" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Publicación no fijada del perfil" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Publicación fijada en el perfil" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "No se ha podido dejar sin fijar la publicación" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "No se ha podido fijar la publicación" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Dejar de fijar del perfil" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Fijar al perfil" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "¿Deseas eliminar esta publicación?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Se ha eliminado la publicación" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "No se ha podido eliminar la publicación" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Reportar publicación…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Me gusta" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Impulsó" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Añadido a marcadores" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Fijada" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Eliminada" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# respuesta} other {# respuestas}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Hilo{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Mostrar menos" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Mostrar contenido" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Mostrar multimedia" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Se editó" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Comentarios" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Más de <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Historial de ediciones" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Error al cargar el historial" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Cargando…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "Código HTML" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Código HTML copiado" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "No se ha podido copiar el código HTML" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Archivos adjuntos:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Emojis de esta cuenta:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL estática" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojis:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notas:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Esto es estático, sin estilos y sin guion. Necesitarás añadir tus propios estilos y edición si lo necesitas." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Las encuestas no son interactivas y se convertirán en una lista con recuento de votos." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Los archivos adjuntos pueden ser imágenes, vídeos, audios o cualquier tipo de archivo." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "La publicación podría ser editada o eliminada más adelante." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Vista previa" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Nota: Esta vista previa está ligeramente definida." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> impulsó" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Nuevas publicaciones" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Inténtalo de nuevo" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Impulso} other {# Impulsos}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Publicaciones fijadas" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Hilo" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtrado</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Traducción automática desde {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Traduciendo…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Traducir desde {sourceLangText} (autodetectado)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Traducir desde el {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Automático ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Error al traducir" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Editando el mensaje original" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Respondiendo a @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Ahora puedes cerrar esta página." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Cerrar la ventana" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Se requiere iniciar sesión." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Ir a la página de inicio" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Publicaciones de la cuenta" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Respuestas)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Impulsos)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Multimedia)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Limpiar filtros" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Limpiar" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Mostrando publicaciones con respuestas" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Respuestas" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Mostrando publicaciones sin impulsos" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Impulsos" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Mostrando publicaciones con archivos" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Mostrando publicaciones etiquetadas con #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Mostrando publicaciones en {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "No hay nada que ver aquí… todavía." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "No se han podido cargar las publicaciones" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "No se ha podido obtener información de la cuenta" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Cambiar a instancia de la cuenta {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Cambiar a mi instancia (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Mes" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Actual" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Predefinida" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Cambiar a esta cuenta" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Cambiar a una nueva pestaña/ventana" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Ver perfil…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Establecer como predefinida" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "¿Deseas cerrar sesión <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Cerrar sesión…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Añadir una cuenta ya existente" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Nota: la cuenta <0>Predefinida</0> se cargará siempre primero. Si cambias de cuenta, esta se mantendrá durante la sesión." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "No hay marcadores todavía. ¡Busca algo que marcar!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "No se han podido cargar los marcadores." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "la última hora" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "las últimas 2 horas" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "las últimas 3 horas" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "las últimas 4 horas" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "las últimas 5 horas" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "las últimas 6 horas" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "las últimas 7 horas" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "las últimas 8 horas" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "las últimas 9 horas" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "las últimas 10 horas" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "las últimas 11 horas" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "las últimas 12 horas" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "después de 12 horas" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Etiquetas seguidas" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Grupos" + +#: 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 "Mostrando {selectedFilterCategory, select, all {todas las publicaciones} original {publicaciones originales} replies {respuestas} boosts {impulsos} followedTags {etiquetas seguidas} groups {grupos} filtered {publicaciones filtradas}}, {sortBy, select, createdAt {{sortOrder, select, asc {más antiguos} desc {más recientes}}} reblogsCount {{sortOrder, select, asc {menos impulsos} desc {más impulsos}}} favouritesCount {{sortOrder, select, asc {menos likes} desc {más likes}}} repliesCount {{sortOrder, select, asc {menos respuestas} desc {más respuestas}}} density {{sortOrder, select, asc {menos denso} desc {más denso}}}} first{groupBy, select, account {, agrupado por autores} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Ponerse al día <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Ayuda" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "¿De qué se trata?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "La puesta al día es una línea de tiempo independiente de tus seguidores, que ofrece una panorámica de alto nivel de un vistazo, con una sencilla interfaz inspirada en el correo electrónico para ordenar y filtrar sin esfuerzo las publicaciones." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Vista previa de la interfaz de puesta al día" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Pongámonos al día" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Pongámonos al día con las publicaciones de las cuentas que sigues." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Mostrarme todas las publicaciones de…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "hasta el máximo" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Ponerse al día" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Superpone tu última puesta al día" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Hasta la última puesta al día ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Nota: Es posible que tu instancia solamente muestre un máximo de 800 publicaciones en la línea temporal de Inicio, independientemente del intervalo de tiempo. Podría ser menos o más." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Anteriormente…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# publicación} other {# publicaciones}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "¿Deseas eliminar esta puesta al día?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Eliminando la puesta al día {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Puesta al día {0} eliminada" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Nota: Solo se almacenarán un máximo de 3. El resto se eliminará automáticamente." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Obteniendo publicaciones…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Esto podría tardar un rato." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Limpiar filtros" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Mejores enlaces" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Compartido por {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Todos" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# autor} other {# autores}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Ordenar" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Fecha" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Densidad" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Filtrar" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autores" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Nada" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Mostrar todos los autores" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "No es necesario leer todo." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Eso es todo." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Volver arriba" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Enlaces compartidos por seguidores, ordenados por recuento de compartidos, impulsos y me gustas." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Ordenar: densidad" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Las publicaciones están ordenadas por densidad de información o profundidad. Las publicaciones más cortas son \"más ligeras\" mientras que las publicaciones más largas son \"más pesadas\". Las publicaciones con fotos son \"más pesadas\" que los mensajes sin fotos." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Grupo: Autores" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Las publicaciones están agrupadas por autores, ordenadas por conteo de publicaciones por autor." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Siguiente autor" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Autor anterior" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Ir arriba" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtrado: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "No hay me gustas todavía. ¡Busca algo que te guste!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "No se pueden cargar los \"me gustas\"." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Inicio y listas" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Cronología pública" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Conversaciones" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Perfiles" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Nunca" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Nuevo filtro" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtro} other {# filtros}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "No se han podido cargar los filtros." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "No hay ningún filtro todavía." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Añadir filtro" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Editar filtro" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "No se ha podido editar el filtro" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "No se ha podido crear el filtro" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Título" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Palabra completa" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "No hay palabras clave. Añade una." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Añadir palabra clave" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# palabra clave} other {# palabras claves}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtrar desde…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Todavía no se ha implementado" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Estado: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Cambiar caducidad" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Caducidad" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "La publicación filtrada será…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimizada" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "escondida" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "¿Deseas eliminar este filtro?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "No se ha podido eliminar el filtro." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Caducado" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Caducando <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Nunca caduca" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# etiqueta} other {# etiquetas}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "No se han podido cargar las etiquetas seguidas." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "No se han seguido etiquetas todavía." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "No hay resultados para mostrar." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "No se han podido cargar las publicaciones." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (solo multimedia) en {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} en {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (solo multimedia)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Nadie ha publicado nada con esta etiqueta todavía." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "No se han podido cargar las publicaciones con esta etiqueta" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "¿Deseas dejar de seguir la etiqueta #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Se ha dejado de seguir la etiqueta #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Se ha comenzado a seguir la etiqueta #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Siguiendo…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "No destacado en el perfil" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "No se ha podido desactivar en el perfil" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Destacado en el perfil" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Destacar en el perfil" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {}other {Máximo # etiquetas}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Añadir etiqueta" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Eliminar etiqueta" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Se ha alcanzado el límite máximo de # atajos. No se ha podido añadir el atajo.} other {Se ha alcanzado el límite máximo de # atajos. No se ha podido añadir el atajo.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Este atajo ya existe" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Atajo de etiqueta añadido" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Añadir a atajos" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Introduce una nueva instancia, por ejemplo \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Instancia inválida" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Ir a otra instancia…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Ir a mi instancia (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "No se han podido cargar las notificaciones." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Nuevas</0> <1>solicitudes de seguimiento</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Ver todo" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Resolviendo…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "No se ha podido determinar la URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Nada aún." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Administrar miembros" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "¿Deseas eliminar a <0>@{0}</0> de la lista?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Eliminar…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# lista} other {# listas}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Aún no hay listas." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "No se pudo registrar la aplicación" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "dominio de la instancia" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "ejemplo \"mastodon.social\"" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Error al iniciar sesión. Por favor, inténtalo de nuevo o usa otra instancia." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Continuar con {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Continuar" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "¿No tienes una cuenta? ¡Crea una!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Menciones privadas" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privado" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Nadie te ha mencionado :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "No se han podido cargar las menciones." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Que tú no sigues" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Que no te siguen" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Con una nueva cuenta" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Que te mencionan de forma no solicitada" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Que están limitadas por los moderadores del servidor" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Configuración de notificaciones" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Nuevas notificaciones" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Anuncio} other {Anuncios}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Solicitudes de seguimiento" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# solicitud de seguimiento} other {# solicitudes de seguimiento}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Notificaciones filtradas de # persona} other {Notificaciones filtradas de # personas}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Solo menciones" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Hoy" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Estás al día." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Ayer" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "No se han podido cargar las notificaciones" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Configuración de las notificaciones actualizada" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Filtrar notificaciones de personas:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtrar" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignorar" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Actualizado <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Mostrar notificaciones de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Notificaciones de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Las notificaciones de @{0} no serán filtradas a partir de ahora." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "No se ha podido aceptar la solicitud de notificación" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Permitir" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Las notificaciones de @{0} no se mostrarán en las notificaciones filtradas a partir de ahora." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "No se ha podido descartar la solicitud de notificación" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Descartar" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Descartado" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Línea de tiempo local ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Línea temporal federada ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Línea de tiempo local" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Línea temporal federada" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Nadie ha publicado nada todavía." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Cambiar a Federado" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Cambiar a Local" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Buscar: {q} (Publicaciones)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Buscar: {q} (Cuentas)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Buscar: {q} (Etiquetas)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Buscar: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Etiquetas" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Ver más" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Ver más cuentas" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "No se encontraron cuentas." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Ver más etiquetas" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "No se han encontrado etiquetas." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Ver más publicaciones" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "No se han encontrado publicaciones." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Introduce un término de búsqueda o pega una URL arriba para empezar." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Ajustes" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Apariencia" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Claro" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Oscuro" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automático" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Tamaño del texto" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Idioma en pantalla" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Traducciones voluntarias" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Publicando" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Visibilidad por defecto" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Sincronizado" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Ha ocurrido un error al actualizar la privacidad de la publicación" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Sincronizado con los ajustes del servidor de tu instancia. <0> Ve a tu instancia ({instance}) para más ajustes.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Experimentos" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Actualizar automáticamente las publicaciones de tu línea de tiempo" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Carrusel de publicaciones impulsadas" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Traducción de publicaciones" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Traducir a" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Idioma del sistema ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural,=0 {Esconder el botón de \"Traducir\" para:} other {Esconder el botón de traducir para (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Nota: Esta función emplea servicios de traducción externos, desarrollados por <0>LingvaAPI</0> y <1>LingvaTranslate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Traducción automática" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Mostrar automáticamente la traducción de las publicaciones en la línea de tiempo. Funciona únicamente en publicaciones <0>cortas</0> sin advertencias de contenido, archivos multimedia o encuestas." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Selector de GIF durante la redacción" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Nota: Esta característica emplea un servicio de búsqueda GIF externo, desarrollado por <0>GIPHY</0>. Estos son adecuados para ser vistos por todas las edades, los parámetros de seguimiento son despojados, la información de referencia se omite de las solicitudes, pero las consultas de búsqueda y la información de direcciones IP seguirán llegando a sus servidores." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Generador de descripción de imagen" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Solo para imágenes nuevas mientras se redactan nuevas publicaciones." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Nota: Esta característica usa un servicio de IA externo, desarrollado por <0>img-alt-api</0>. Puede no funcionar bien. Solamente para imágenes y en inglés." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Notificaciones agrupadas del lado del servidor" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Función en fase alfa. Ventana de agrupación potencialmente mejorada, pero con una lógica de agrupación básica." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Importación/exportación \"en la nube\" para la configuración de atajos" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Muy experimental.<0/>Guardado en las notas de tu propio perfil. Las notas del perfil (privadas) se utilizan principalmente para otros perfiles, y se ocultan para el perfil propio." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Nota: Esta función utiliza la API del servidor de instancias conectado en ese momento." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Modo oculto <0>(<1>Texto</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Reemplazar el texto por bloques, útil al tomar capturas de pantalla, por motivos de privacidad." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Acerca de" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Creado</0> por <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Patrocina" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Dona" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Política de privacidad" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Sitio:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versión:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Versión copiada" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "No se ha podido copiar la versión" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "No se ha podido actualizar la suscripción. Inténtalo de nuevo." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "No se ha podido cancelar la suscripción. Por favor, inténtalo de nuevo." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Notificaciones push (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Las notificaciones push están bloqueadas. Actívalas en los ajustes de tu navegador." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Permitir desde <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "cualquiera" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "personas a las que sigo" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "seguidores" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Seguidos" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Encuestas" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Ediciones de publicaciones" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "No se han permitido notificaciones desde la última vez que te conectaste. Necesitarás <0><1>conectarte de nuevo</1> para permitir las notificaciones. </0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "NOTA: Las notificaciones push solo se permiten para <0>una cuenta</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Publicación" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "No estás conectado. No puedes interactuar (responder, impulsar, etc.)." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Esta publicación es de otra instancia (<0>{instance}</0>). Las interacciones (responder, impulsar, etc.) no son posibles." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Error: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Cambiar a mi instancia para activar interacciones" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "No se han podido cargar las respuestas." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Volver" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Ir a la publicación principal" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} publicaciones arriba - Ir hacia arriba" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Cambiar a vista lateral" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Cambiar a vista completa" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Mostrar todo el contenido sensible" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Experimental" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "No se ha podido cambiar" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Cambiar a la instancia de la publicación ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Cambiar a la instancia de la publicación" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "No se ha podido cargar la publicación" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# respuesta} other {<0>{1}</0> respuestas}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# comentario} other {<0>{0}</0> comentarios}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Ver publicación con sus respuestas" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Tendencias ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Noticias populares" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Por {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Volver a mostrar publicaciones en tendencia" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Mostrando publicaciones que mencionan <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Publicaciones en tendencia" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "No hay publicaciones en tendencia." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Un cliente web minimalista para Mastodon que hace las cosas a su manera." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Inicia sesión con Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Registrarse" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Conecta tu cuenta Mastodon/Fediverse existente.<0/>Tus credenciales no se almacenan en este servidor." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Creado</0> por <1>@cheeaun</1>. <2>Política de privacidad</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Captura de pantalla del carrusel de impulsos" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Carrusel de publicaciones impulsadas" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Separa visualmente las publicaciones originales de las compartidas (publicaciones impulsadas)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Captura de pantalla del hilo de comentarios agrupados" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Hilo de comentarios agrupados" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Sigue las conversaciones sin esfuerzo. Respuestas semi-colapsables." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Captura de pantalla de notificaciones agrupadas" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Notificaciones agrupadas" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Las notificaciones similares se agrupan y contraen para reducir el desorden." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Captura de pantalla de la interfaz de usuario con múltiples columnas" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Una o varias columnas" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Por defecto, una sola columna para los amantes del modo zen. Modo de múltiples columnas configurable para usuarios avanzados." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Captura de pantalla de la línea de tiempo multi-etiqueta con un formulario para añadir más etiquetas" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Línea de tiempo con varias etiquetas" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Hasta 5 etiquetas combinadas en una única línea de tiempo." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Parece que tu navegador está bloqueando ventanas emergentes." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Un borrador de una publicación está minimizado. Publícalo o descártalo antes de crear uno nuevo." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Una publicación está abierta en este momento. Publica o descarta antes de crear una nueva." + diff --git a/src/locales/eu-ES.po b/src/locales/eu-ES.po new file mode 100644 index 00000000..8feaa4bf --- /dev/null +++ b/src/locales/eu-ES.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: eu\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 22:00\n" +"Last-Translator: \n" +"Language-Team: Basque\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: eu\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Babestua" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Bidalketak: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Azken bidalketa: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatizatua" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Taldea" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Batak bestea" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Eskatuta" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Jarraitzen" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Jarraitzen dizu" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {jarraitzaile #} other {# jarraitzaile}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Egiaztatua" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "<0>{0}</0>(e)an batu zen" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Betiko" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Ezin da kontua kargatu." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Joan kontuaren orrira" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "jarraitzaile" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "jarraitzen" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "bidalketa" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Gehiago" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0>(e)k adierazi du kontu berria duela:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Helbidea kopiatu da" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Ezin da helbidea kopiatu" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Kopiatu helbidea" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Joan jatorrizko profilaren orrira" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Ikusi profileko irudia" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Ikusi profileko goiburuko irudia" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "In Memoriam" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Erabiltzaileak informazio hau publiko ez egitea aukeratu du." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} bidalketa original, {1} erantzun, {2} bultzada" + +#: 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 {Azken bidalketa azken egunean} other {Azken bidalketa azken {2} egunetan}}} other {{3, plural, one {Azken {4} bidalketak azken egunean} other {Azken {5} bidalketak azken {6} egunetan}}}}" + +#: 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 {Azken bidalketa azken urte(et)an} other {Azken {1} bidalketak azken urte(et)an}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Originalak" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Erantzunak" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Bultzadak" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Bidalketaren estatistikak ez daude erabilgarri." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Ikusi bidalketen estatistikak" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Azken bidalketa: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Mutututa" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Blokeatuta" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Ohar pribatua" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Aipatu <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Itzuli biografia" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Editatu ohar pribatua" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Gehitu ohar pribatua" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Jakinarazpenak gaitu dira @{username}(r)en bidalketetarako." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Jakinarazpenak ezgaitu dira @{username}(r)en bidalketetarako." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Ezgaitu jakinarazpenak" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Gaitu jakinarazpenak" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "@{username}(r)en bultzadak gaituta daude." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "@{username}(r)en bultzadak ezgaituta daude." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Ezgaitu bultzadak" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Gaitu bultzadak" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Gehitu zerrendara / kendu zerrendatik" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Esteka kopiatu da" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Ezin da esteka kopiatu" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopiatu" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Ez dirudi partekatzea dabilenik." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Partekatu…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "@{username} mututzeari utzi zaio" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Utzi <0>@{username}</0> mututzeari" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Mututu <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} {0}rako mututu da" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Ezin da @{username} mututu" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "<0>@{username}</0> jarraitzaileetatik kendu nahi?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} jarraitzaileetatik kendu da" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Kendu jarraitzailea…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "<0>@{username}</0> blokeatu nahi?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "@{username} blokeatzeari utzi zaio" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} blokeatu da" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Ezin da @{username} blokeatzeari utzi" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Ezin da @{username} blokeatu" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Utzi <0>@{username}</0> blokeatzeari" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Blokeatu <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Salatu <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Editatu profila" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Jarraipen-eskaera atzera bota?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "@{0} jarraitzeari utzi?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Utzi jarraitzeari…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Bota atzera…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Jarraitu" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Itxi" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Itzulitako biografia" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Ezin da zerrendatik kendu." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Ezin da zerrendara gehitu." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Ezin dira zerrendak kargatu." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Zerrendarik ez." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Zerrenda berria" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "<0>@{0}</0>(r)i buruzko ohar pribatua" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Ezin izan da ohar pribatua eguneratu." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Utzi" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Gorde eta itxi" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Ezin da profila eguneratu." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Izena" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Biografia" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Eremu gehigarriak" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etiketa" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Edukia" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Gorde" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "erabiltzaile-izena" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "zerbitzariaren domeinu-izena" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Estalki modua ezgaituta" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Estalki modua gaituta" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Hasiera" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Idatzi" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Gehitu multimedia" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Gehitu emoji pertsonala" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Gehitu GIFa" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Gehitu bozketa" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Gorde gabeko aldaketak dituzu. Bidalketa zokoratu nahi duzu?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {{1} fitxategia ez da bateragarria.} other {{2} fitxategiak ez dira bateragarriak.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Fitxategi bakarra erantsi dezakezu.} other {# fitxategi erantsi ditzakezu gehienez.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Atera" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Ikonotu" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Badirudi leiho nagusia itxi duzula." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Badirudi dagoeneko baduzula editorea irekita leiho nagusian eta zerbait argitaratzen ari zarela. Itxaron bukatu arte eta saiatu berriro geroago." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Badirudi dagoeneko baduzula editorea irekita leiho nagusian. Leiho berri bat ateraz gero, leiho nagusian egindako aldaketak zokoratuko dira. Jarraitu nahi duzu?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Sartu" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "@{0}(r)en bidalketari erantzuten (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "@{0}(r)en bidalketari erantzuten" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Jatorrizko bidalketa editatzen" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Bozketak 2 aukera izan behar ditu gutxienez" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Bozketaren aukeretako batzuk hutsik daude" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Ez dituzu multimedia fitxategi batzuk deskribatu. Jarraitu?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "#{i} eranskinak huts egin du" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Edukiari buruzko abisua" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Edukiari buruzko abisua edo multimedia hunkigarria" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Publikoa" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Lokala" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Zerrendatu gabea" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Jarraitzaileentzat soilik" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Aipamen pribatua" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Argitaratu erantzuna" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Editatu bidalketa" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Zertan zabiltza?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Markatu multimedia hunkigarri gisa" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Gehitu" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Erantzun" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Eguneratu" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Argitaratu" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "GIFa deskargatzen…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Ezin da GIFa deskargatu" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Gehiago…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Igota" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Irudiaren deskribapena" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Bideoaren deskribapena" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Audioaren deskribapena" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +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." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Neurria handiegia da. Igoerak arazoak izan ditzake. Saiatu neurria {0}×{1}px-etik {2}×{3}px edo gutxiagora murrizten." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Fotograma-tasa (frame rate) altuegia da. Igoerak arazoak izan ditzake." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Kendu" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Errorea" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Editatu irudiaren deskribapena" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Editatu bideoaren deskribapena" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Editatu audioaren deskribapena" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Deskribapena sortzen. Itxaron…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Ezin da deskribapena sortu: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Ezin da deskribapena sortu" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Sortu deskribapena…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Ezin izan da deskribapena sortu{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— esperimentala</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Eginda" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "{0}. aukera" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Hainbat aukera" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Iraupena" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Kendu bozketa" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Bilatu kontuak" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Errorea kontuak kargatzean" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Instantziako emojiak" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Bilatu emojia" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Errorea emoji pertsonalizatua kargatzean" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Oraintsu erabilita" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Besteak" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} gehiago…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Bilatu GIFak" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "GIPHYri esker" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Idatzi GIFak bilatzeko" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Aurrekoa" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Hurrengoa" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Errorea GIFak kargatzean" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Bidali gabeko zirriborroak" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Badirudi bidali gabeko zirriborroak dituzula. Jarrai ezazu utzi zenuen tokian." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Zirriborroa ezabatu nahi duzu?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Errorea zirriborroa ezabatzean! Saiatu berriro." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Ezabatu…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Errorea erantzuten ari zaion egoera eskuratzean!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Zirriborro guztiak ezabatu?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Errorea zirriborroak ezabatzean! Saiatu berriro." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Ezabatu guztia…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Ez dago zirriborrorik." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Bozketa" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Multimedia" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Ireki leiho berrian" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Onartu" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Ukatu" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Onartuta" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Ukatuta" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Ezertxo ere ez" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Kontuak" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Erakutsi gehiago…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Amaiera." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Laster-teklak" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Teklatuko laster-teklen laguntza" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Hurrengo bidalketa" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Aurreko bidalketa" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Biratu karrusela hurrengora" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Biratu karrusela aurrekora" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Kargatu bidalketa berriak" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Ireki bidalketaren xehetasunak" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> or <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Hedatu edukiaren abisua edo<0/>hedatu / tolestu haria" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Itxi bidalketa edo leihoa" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> or <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Fokatu zutabea zutabe anitzeko antolaketan" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> to <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Fokatu hurrengo zutabean zutabe anitzeko antolaketan" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Fokatu aurreko zutabean zutabe anitzeko antolaketan" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Idatzi bidalketa berria" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Idatzi bidalketa berria (leiho berria)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Bidali" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Bilatu" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Erantzun (leiho berria)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Egin gogoko" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> edo <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Bultzatu" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Jarri laster-marka" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Estalki modua bai/ez" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Editatu zerrenda" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Ezin da zerrenda editatu." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Ezin da zerrenda sortu." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Erakutsi zerrandako kideen erantzunak" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Erakutsi erantzunak jarraitzen diedan pertsonei" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Ez erakutsi erantzunik" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Ezkutatu Hasiera / Jarraitzen -etik zerrenda honetako bidalketak" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Sortu" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Zerrenda ezabatu nahi duzu?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Ezin da zerrenda ezabatu." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Fitxategiaren deskribapena" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Itzuli" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Irakurri ozenki" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Ireki jatorrizko multimedia fitxategia leiho berrian" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Ireki jatorrizko multimedia fitxategia" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Irudia deskribatzen saiatzen. Itxaron…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Ezin da irudia deskribatu" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Deskribatu irudia…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Ikusi bidalketa" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Multimedia fitxategi hunkigarria" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Iragazita: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Iragazita" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Bidalketa argitaratu da. Ikus ezazu." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Erantzuna argitaratu da. Ikus ezazu." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Bidalketa eguneratu da. Ikus ezazu." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menua" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Birkargatu orria orain eguneratzeko?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Eguneraketa eskuragarri…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Jarraitzen ditu" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Zer berri?" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Aipamenak" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Jakinarazpenak" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Berria" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profila" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Laster-markak" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Gogokoak" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Jarraitutako traolak" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Iragazkiak" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Mutututako erabiltzaileak" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Mutututakoak…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Blokeatutako erabiltzaileak" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Blokeatutakoak…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Kontuak…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Hasi saioa" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Joerak" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federatua" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Lasterbideak / Zutabeak…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Ezarpenak…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Zerrendak" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Zerrenda guztiak" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Jakinarazpenak" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Jakinarazpena zure beste kontuarena da." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Ikusi jakinarazpen guztiak" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account}(e)k zure bidalketari {emojiObject}rekin erantzun dio" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account}(e)k bidalketa bat argitaratu du" + +#: src/components/notification.jsx:85 +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}(e)k zure erantzuna bultzatu du.} other {{account}(e)k zure bidalketa bultzatu du.}}} other {{account}(e)k zure {postsCount} bidalketa bultzatu ditu.}}} other {{postType, select, reply {<0><1>{0}</1> pertsonak</0> zure erantzuna bultzatu dute.} other {<2><3>{1}</3> pertsonak</2> zure bidalketa bultzatu dute.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, one {}=1 {{account}(e)k jarraitu dizu.} other {<0><1>{0}</1> pertsonak</0> jarraitu dizute.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account}(e)k jarraitzeko eskaera egin dizu." + +#: src/components/notification.jsx:151 +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}(e)k zure erantzuna gogoko du.} other {{account}(e)k zure bidalketa gogoko du.}}} other {{account}(e)k zure {postsCount} bidalketa gogoko ditu.}}} other {{postType, select, reply {<0><1>{0}</1> pertsonak</0> zure erantzuna gogoko dute.} other {<2><3>{1}</3> pertsonak</2> zure bidalketa gogoko dute.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Sortu edo boza eman zenuen bozketa bat amaitu da." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Sortu zenuen bozketa bat amaitu da." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Boza eman zenuen bozketa bat amaitu da." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Interaktuatu zenuen bidalketa bat editatu dute." + +#: src/components/notification.jsx:204 +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}(e)ek zure erantzuna gogoko egin eta bultzatu du.} other {{account}(e)ek zure bidalketa gogoko egin eta bultzatu du.}}} other {{account}(e)k (e)ek zure {postsCount} bidalketa gogoko egin eta bultzatu ditu.}}} other {{postType, select, reply {<0><1>{0}</1> pertsonak</0> erantzuna gogoko egin eta bultzatu dute.} other {<2><3>{1}</3> pertsonak</2> zure bidalketa gogoko egin eta bultzatu dute.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account}(e)k izena eman du." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account}(e)k {targetAccount} salatu du" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "<0>{name}</0>(r)ekin harremana galdu da." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Moderazio-ohartarazpena" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "Hemen da {year}ko #Wrapstodon!" + +#: src/components/notification.jsx:272 +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." +msgstr "<0>{from}</0>(e)ko administratzaile batek <1>{targetName}</1> bertan behera utzi du, eta horrek esan nahi du aurrerantzean ezingo duzula harekin harremanik izan." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "<0>{from}</0>(e)ko administratzaile batek <1>{targetName}</1> blokeatu du. Eragina du jarraitzen dizuten {followersCount} eta jarraitzen dituzun {followingCount} -engan." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "<0>{targetName}</0> blokeatu duzu. Jarraitzen zizuten {followersCount} eta jarraitzen zenituen {followingCount} kendu dira." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Zure kontuak moderazio-ohartarazpen bat jaso du." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Zure kontua ezgaitu da." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Zure bidalketa batzuk hunkigarri gisa markatu dira." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Zure bidalketa batzuk ezabatu dira." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Aurrerantzean zure bidalketak hunkigarri gisa markatuko dira." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Zure kontuari mugak jarri zaizkio." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Zure kontua bertan behera utzi da." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Jakinarazpen mota ezezaguna: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Bultzatu/Gogoko du(te)…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Gogoko du…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Bultzatu du…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Jarraitzen dizu…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Ikasi gehiago <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "Ikusi #Wrapstodon" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Irakurri gehiago →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Bozkatu duzu" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {boto #} other {# boto}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Ezkutatu emaitzak" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Bozkatu" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Freskatu" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Erakutsi emaitzak" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {boto <0>{0}</0>} other {<1>{1}</1> boto}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {hautesle <0>{0}</0>} other {<1>{1}</1> hautesle}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "<0/>(e)an amaitu zen" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Amaitu da" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "<0/>(e)an amaituko da" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Amaiera-data" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Mezu baztergarria" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Esteka maltzurrak, gezurrezko elkarrekintzak edo erantzun errepikakorrak" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Legez kanpokoa" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Zure edo zerbitzariaren herrialdeko legedia urratzen du" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Zerbitzariaren arauen urraketa" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Zerbitzariaren arau jakinak urratzen ditu" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Urraketa" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Beste zerbait" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Arazoa ez dator bat beste kategoriekin" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Salatu bidalketa" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Salatu @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Berrikusketeke" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Bidalketa salatu da" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Profila salatu da" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Ezin da bidalketa salatu" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Ezin da profila salatu" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Zein da bidalketaren arazoa?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Zein da profilaren arazoa?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Informazio gehigarria" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Birbidali <0>{domain}</0>(e)ra" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Bidali salaketa" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "{username} mutututa" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Ezin da {username} mututu" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Bidali salaketa <0>+ Mututu profila</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "{username} blokeatuta" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Ezin da {username} blokeatu" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Bidali salaketa <0>+ Blokeatu profila</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ kontuak, traolak eta bidalketak</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "<0>{query}</0> duten bidalketak" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "<0>#{0}</0>(r)ekin etiketatutako bidalketak" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Bilatu <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "<0>{query}</0> duten kontuak" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Hasiera / Jarraitzen" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Publikoa (Lokala / Federatua)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Kontua" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Traolak" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "Zerrendaren IDa" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Lokala bakarrik" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instantzia" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Aukerakoa, adib. mastodon.eus" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Bilatzeko terminoa" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Aukerakoa, zutabe anitzeko antolaketa erabili ezean" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "adib. PixelArt (5 gehienez, espazioen bidez bereizita)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Multimedia bakarrik" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Lasterbideak" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Zehaztu lasterbideen zerrenda bat honela agertzeko:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Botoi mugikorra" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Erlaitz- / Menu-barra" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Zutabe anitz" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Ez dago erabilgarri uneko ikuspegian" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Mugitu gora" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Mugitu behera" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Editatu" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Gehitu lasterbide / zutabe bat baino gehiago erabili ahal izateko." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Oraindik ez dago zutaberik. Egin tap Gehitu zutabea botoian." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Oraindik ez dago lasterbiderik. Egin tap Gehitu lasterbidea botoian." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Ez dakizu zer gehitu?<0/>Probatu <1>Hasiera / Jarraitzen eta Jakinarazpenak</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "{SHORTCUTS_LIMIT} zutabe gehienez" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "{SHORTCUTS_LIMIT} lasterbide gehienez" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Inportatu / esportatu" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Gehitu zutabea…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Gehitu lasterbidea…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Zerrenda zehatza aukerakoa da. Zutabe anitzeko antolaketan zerrenda beharrezkoa da, bestela zutabea ez da erakutsiko." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Zutabe anitzeko antolaketan bilatzeko terminoa beharrezkoa da, bestela zutabea ez da erakutsiko." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Traola bat baino gehiago onartzen dira. Espazioen bidez bereizita." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Editatu lasterbidea" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Gehitu lasterbidea" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Denbora-lerroa" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Zerrenda" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Inportatu / Esportatu <0>Lasterbideak</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Inportatu" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Itsatsi lasterbideak hemen" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Gordetako lasterbideak zerbitzaritik deskargatzen…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Ezin dira lasterbideak deskargatu" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Deskargatu lasterbideak zerbitzaritik" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Lasterbidea badago lehendik ere" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Litekeena da zerrendak ezin erabiltzea beste kontu batekoak badira." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Ezarpenen formatu baliogabea" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Gehitu uneko lasterbideei?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Uneko lasterbideetan ez daudenak gehituko dira soilik." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Ez dago inportatzeko lasterbide berririk" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Lasterbideak inportatu dira. {SHORTCUTS_LIMIT} muga gainditu da, gainerakoak ez dira inportatuko." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Lasterbideak inportatu dira" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Inportatu eta gehitu…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Uneko lasterbideak gainidatzi?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Lasterbideak inportatu?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "edo gainidatzi…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Inportatu…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Esportatu" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Lasterbideak kopiatu dira" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Ezin dira lasterbideak kopiatu" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Lasterbideen ezarpenak kopiatu dira" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Ezin dira lasterbideen ezarpenak kopiatu" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Partekatu" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Lasterbideak zerbitzarian gordetzen…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Lasterbideak gorde dira" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Ezin dira lasterbideak gorde" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sinkronizatu zerbitzariarekin" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {karaktere #} other {# karaktere}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Lasterbideen JSON gordina" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Inportatu / Esportatu ezarpenak zerbitzarira / zerbitzaritik (oso esperimentala)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/>(e)k <1>bultzatua</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Barka baina saioa hasita duzun zerbitzariak ezin du interaktuatu beste instantzia batekoa den bidalketa honekin." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "@{0}(r)en bidalketa gogoko izateari utzi diozu" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "@{0}(r)en bidalketa gogoko egin duzu" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "@{0}(r)en bidalketari laster-marka kendu diozu" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "@{0}(r)en bidalketari laster-marka jarri diozu" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Kendu bultzada" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Aipatu" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Multimedia fitxategi batzuek ez dute deskribapenik." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Bidalketa zaharra (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "@{0}(r)en bidalketari bultzada kendu zaio" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "@{0}(r)en bidalketa bultzatu da/diozu" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Bultzatu…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Utzi gogoko egiteari" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Gogoko egin" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Kendu laster-marka" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Ikusi <0>@{0}</0>(r)en bidalketa" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Erakutsi edizio-historia" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Editatuta: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Txertatu bidalketa" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Elkarrizketa mututzeari utzi zaio" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Elkarrizketa mututu da" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Ezin da elkarrizketa mututzeari utzi" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Ezin da elkarrizketa mututu" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Utzi elkarrizketa mututzeari" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Mututu elkarrizketa" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Bidalketa profilean finkatzeari utzi zaio" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Profilean finkatutako bidalketa" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Ezin da bidalketa finkatzeari utzi" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Ezin da bidalketa finkatu" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Utzi profilean finkatzeari" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Finkatu profilean" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Bidalketa ezabatu nahi duzu?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Bidalketa ezabatu da" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Ezin da bidalketa ezabatu" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Salatu bidalketa…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Gogoko egina" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Bultzatua" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Laster-marka jarria" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Finkatua" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Ezabatua" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {erantzun #} other {# erantzun}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Haria{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Ezkutatu edukia" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Erakutsi edukia" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Erakutsi multimedia fitxategiak" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Editatuta" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Iruzkinak" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "<0/>(r)en gehiago" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Edizio-historia" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Ezin da historia kargatu" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Kargatzen…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML kodea" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML kodea kopiatu da" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Ezin da HTML kodea kopiatu" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Multimedia eranskinak:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Kontuaren emojiak:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL estatikoa" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojiak:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Oharrak:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Hau estatikoa da, diseinurik eta scriptik gabekoa. Litekeena da zure estiloak aplikatu eta editatu behar izatea." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Bozketak ez dira interaktiboak, zerrendak bilakatzen dira boto-zenbaketan." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Multimedia eranskinak irudiak, bideoak, audioak edo edozein fitxategi mota izan daitezke." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Bidalketa editatu edo ezabatu daiteke geroago." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Aurrebista" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Oharra: aurrebista honi estilo arin bat aplikatu zaio." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/>(e)k <1/> bultzatu du" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Bidalketa berriak" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Saiatu berriro" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {Bultzada #} other {# bultzada}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Finkatutako bidalketak" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Haria" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Iragazita</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "{sourceLangText} automatikoki itzultzen" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Itzultzen…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Itzuli {sourceLangText} (automatikoki antzemanda)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Itzuli {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Automatikoa ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Ezin da itzuli" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Jatorrizko egoera editatzen" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "@{0}(r)i erantzuten" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Orria itxi dezakezu." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Itxi leihoa" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Saioa hasi behar da." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Joan orri nagusira" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Kontuaren bidalketak" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Erantzunak)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Bultzadak)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Multimedia)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Garbitu iragazkiak" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Garbitu" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Erantzunak dituzten bidalketak erakusten" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Erantzunak" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Bultzadarik ez duten bidalketak erakusten" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Bultzadak" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Multimedia fitxategiak dituzten bidalketak erakusten" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "#{0} traola duten bidalketak erakusten" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "{0}(e)ko bidalketak erakusten" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Ez dago ikusteko ezer." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Ezin dira bidalketak kargatu" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Ezin da kontuaren informazioa eskuratu" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Aldatu kontuko instantziara {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Aldatu nire instantziara (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Hilabetea" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Unean" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Lehenetsia" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Aldatu kontu honetara" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Aldatu fitxa / leiho berrian" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Ikusi profila…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Ezarri lehenetsi gisa" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "<0>@{0}</0> saioa amaitu nahi?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Amaitu saioa…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Gehitu lehendik dudan kontu bat" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Oharra: <0>Lehenetsitako</0> kontua erabiliko da beti hasieran. Gainerako kontuek saioa irekita mantendu bitartean iraungo dute." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Ez duzu laster-markarik. Zoaz gordetzea merezi duen zerbait aurkitzera!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Ezin dira laster-markak kargatu." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "azken orduko bidalketak" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "azken 2 ordutako bidalketak" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "azken 3 ordutako bidalketak" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "azken 4 ordutako bidalketak" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "azken 5 ordutako bidalketak" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "azken 6 ordutako bidalketak" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "azken 7 ordutako bidalketak" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "azken 8 ordutako bidalketak" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "azken 9 ordutako bidalketak" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "azken 10 ordutako bidalketak" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "azken 11 ordutako bidalketak" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "azken 12 ordutako bidalketak" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "12 ordu baino haratagoko bidalketak" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Jarraitutako traolak" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Taldeak" + +#: 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 "{selectedFilterCategory, select, all {Bidalketa guztiak} original {Bidalketa originalak} replies {Erantzunak} boosts {Bultzadak} followedTags {Jarraitutako traolak} groups {Taldeak} filtered {Iragazitako bidalketak}} erakusten, {sortBy, select, createdAt {{sortOrder, select, asc {zaharrena} desc {berriena}}} reblogsCount {{sortOrder, select, asc {bultzada gutxien dituena} desc {bultzada gehien dituena}}} favouritesCount {{sortOrder, select, asc {gogoko gutxien dituena} desc {gogoko gehien dituena}}} repliesCount {{sortOrder, select, asc {erantzun gutxien dituena} desc {erantzun gehien dituena}}} density {{sortOrder, select, asc {dentsitate txikiena duena} desc {dentsitate handiena duena}}}}ren arabera sailkatuta lehenengo{groupBy, select, account {, egilearen arabera aldekatuta} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Zer berri? <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Laguntza" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Zer da hau?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Zer berri? denbora-lerro bereizi bat da jarraitzen dituzunekin; goi-mailako ikuspegi bat eskaintzen du begirada batean, posta elektronikoan oinarritutako interfaze erraz batekin, mezuak ordenatzea eta iragaztea ahalbidetzen duena." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Zer berri? interfazearen aurrebista" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Jar gaitezen egunean" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Jarri egunean jarraitzen diezunen bidalketekin." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Erakutsidazu…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "gehienez ere" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Jarri egunean" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Azken eguneraketarekin gainjartzen da" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Azken eguneraketara arte ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Oharra: litekeena da instantziak gehienez (gutxi gorabehera) 800 bidalketa erakustea hasierako denbora-lerroan, denbora tartea izaten dena izaten dela." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Lehenago…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {bidalketa #} other {# bidalketa}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Eguneraketa kendu?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "{0} eguneraketa kentzen" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "{0} eguneraketa kendu da" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Oharra: gehienez 3 gordeko dira. Gainerakoak automatikoki kenduko dira." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Bidalketak eskuratzen…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Litekeena da donbora behar izatea." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Berrezarri iragazkiak" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Gori-gorian dauden estekak" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "{0}(e)k partekatua" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Guztia" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {egile #} other {# egile}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Sailkatu" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Data" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Dentsitatea" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Iragazi" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Egileak" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Bat ere ez" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Erakutsi egile guztiak" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Ez duzu zertan guztia irakurri." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Hori da guztia." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Itzuli gora" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Jarraitzen dituzunek partekatutako estekak, partekatutako, bultzatutako eta gogoko egindako zenbakiagatik sailkatuta." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Sailkatu: dentsitatea" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Bidalketak informazioaren dentsitatearen edo sakoneraren arabera sailkatzen dira. Postu motzenak \"arinagoak\" dira, eta luzeenak, berriz, \"astunagoak\". Argazkidun bidalketak argazkirik gabekoak baino \"astunagoak\" dira." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Taldekatu: egileak" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Bidalketak egilearen arabera taldekatzen dira, egilearen bidalketen kopuruaren arabera sailkatuta." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Hurrengo egilea" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Aurreko egilea" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Korritu gora" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Iragazita: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Ez dugu gogokorik. Zoaz gogoko zerbait aurkitzera!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Ezin dira gogokoak kargatu." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Hasiera eta zerrendak" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Denbora-lerro publikoak" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Elkarrizketak" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profilak" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Inoiz ez" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Iragazki berria" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {Iragazki #} other {# iragazki}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Ezin dira iragazkiak kargatu." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Oraindik ez dago iragazkirik." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Gehitu iragazkia" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Editatu iragazkia" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Ezin da iragazkia editatu" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Ezin da iragazkia sortu" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Izenburua" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Hitz osoa" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Ez dago hitz-gakorik." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Gehitu hitz-gakoa" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {hitz-gako #} other {# hitz-gako}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Iragazi…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Inplementatzeke" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Egoera: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Aldatu iraungitzea" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Iraungitzea" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Iragazitako bidalketak…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "txikituko dira" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "ezkutatuko dira" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Iragazkia ezabatu nahi duzu?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Ezin da iragazkia ezabatu." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Iraungi da" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "<0/>(e)an iraungiko da" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Ez da inoiz iraungiko" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {traola #} other {# traola}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Ezin dira jarraitutako traolak kargatu." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Oraindik ez duzu traolarik jarraitzen." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Ez dago ikusteko ezer." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Ezin dira bidalketak kargatu." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (multimedia fitxategiak bakarrik) {instance}(e)n" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} {instance}(e)n" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (multimedia fitxategiak bakarrik)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Oraindik ez du inork traola hau erabili." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Ezin dira etiketa hau duten bidalketak kargatu" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "#{hashtag} jarraitzeari utzi?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "#{hashtag} jarraitzeari utzi diozu" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "#{hashtag} jarraitzen ari zara" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Jarraitzen…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Utzi profilean nabarmentzeari" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Ezin da profilean nabarmentzen uzteari utzi" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Profilean nabarmentzen" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Nabarmendu profilean" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {}other {Gehienez # traola}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Gehitu traola" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Kendu traola" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Gehienezko lasterbidera (#) iritsi zara. Ezin da lasterbidea gehitu.} other {Gehienezko # lasterbideetara iritsi zara. Ezin da lasterbidea gehitu.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Lasterbidea badago lehendik ere" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Traolaren lasterbidea gehitu da" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Gehitu lasterbideetara" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Sartu instantzia berria, adib. \"mastodon.eus\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Instantzia baliogabea" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Joan beste instantzia batera…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Joan nire instantziara (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Ezin dira jakinarazpenak eskuratu." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<1>Jarraipen-eskaera</1> <0>berria</0>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Ikusi guztia" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Ebazten…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Ezin da URLa ebatzi" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Oraindik ezer ez." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Kudeatu kideak" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "<0>@{0}</0> zerrendatik kendu nahi?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Kendu…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {zerrenda #} other {zerrenda #}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Oraindik ez dago zerrendarik." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Aplikazioa erregistratzeak huts egin du" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "instantziaren domeinua" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "adib. \"mastodon.eus\"" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Ezin da saioa hasi. Saiatu berriro edo saiatu beste instantzia batean." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Jarraitu {selectedInstanceText}(r)ekin" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Jarraitu" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Oraindik ez duzu konturik? Sortu ezazu!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Aipamen pribatuak" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Pribatua" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Ez zaitu inork aipatu :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Ezin dira aipamenak kargatu." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Jarraitzen ez ditudanenak" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Jarraitzen ez nautenenak" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Kontu berria dutenenak" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Nik nahi gabe era pribatuan aipatu nautenenak" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Zerbitzariko moderatzaileek muga jarri dietenak" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Jakinarazpenen ezarpenak" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Jakinarazpen berriak" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Iragarpena} other {Iragarpenak}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Jarraipen-eskaerak" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {Jarraipen-eskaera #} other {# jarraipen-eskaera}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Pertsona #en iragazitako jakinarazpenak} other {# pertsonaren iragazitako jakinarazpenak}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Aipamenak soilik" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Gaur" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Zaharrak berri." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Atzo" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Ezin dira jakinarazpenak kargatu" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Jakinarazpenen ezarpenak eguneratu dira" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Ez erakutsi hauen jakinarazpenak:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Iragazi" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ez hartu kontuan" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "<0>{0}</0>(e)an eguneratu zen" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Ikusi <0>@{0}</0>(r)en jakinarazpenak" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "<0>@{0}</0>(r)en jakinarazpenak" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Aurrerantzean ez dira @{0}(r)en jakinarazpenak iragaziko." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Ezin da jakinarazpen-eskaera onartu" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Baimendu" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Aurrerantzean ez dira @{0}(r)en jakinarazpenak erakutsiko iragazitako jakinarazpenean." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Ezin da jakinarazpen-eskaera zokoratu" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Baztertu" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Baztertuta" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Denbora-lerro lokala ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Denbora-lerro federatua ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Denbora-lerro lokala" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Denbora-lerro federatua" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Oraindik inork ez du ezer argitaratu." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Aldatu federatura" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Aldatu lokalera" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Bilatu: {q} (Bidalketak)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Bilatu: {q} (Kontuak)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Bilatu: {q} (Traolak)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Bilatu: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Traolak" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Ikusi gehiago" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Ikusi kontu gehiago" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Ez da konturik aurkitu." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Ikusi traola gehiago" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Ez da traolarik aurkitu." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Ikusi bidalketa gehiago" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Ez da bidalketarik aurkitu." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Sartu bilatzeko terminoa edo itsatsi URLa gainean." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Ezarpenak" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Itxura" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Argia" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Iluna" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automatikoa" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Testuaren tamaina" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Pantaila-hizkuntza" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Eskaini burua itzultzeko" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Argitaratzean" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Ikusgaitasuna, defektuz" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Sinkronizatuta" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Ezin da bidalketaren pribatutasuna eguneratu" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Zure zerbitzariko ezarpenekin sinkronizatu da. <0>Joan zure instantziara ({instance}) ezarpen gehiagorako.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Esperimentuak" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Automatikoki freskatu denbora-lerroko bidalketak" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Bultzaden karrusela" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Bidalketen itzulpena" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Itzuli…" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Sistemak darabilena ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, one {}=0 {Ezkutatu \"Itzuli\" botoia honentzat:} other {Ezkutatu \"Itzuli\" botoia (#) hauentzat:}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Oharra: ezaugarri honek hirugarrenen itzulpen-zerbitzuak darabiltza, <0>Lingva API</0>k eta <1>Lingva Translate</1>k eskainiak." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Itzulpen automatikoa bidalketan bertan" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Erakutsi automatikoki bidalketen itzulpena denbora-lerroaren baitan. Bidalketa <0>labur</0>retarako balio du bakarrik, eta ezin dute edukiari buruzko oharrik, multimedia fitxategirik edo bozketarik izan." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "GIF hautatzailea" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Oharra: ezaugarri honek hirugarrenen zerbitzua darabil GIFen bilaketarako, <0>GIPHY</0>k eskainia. Adin guztietarako egokia da, jarraipen parametroak ezabatu egiten dira, jatorriaren informazioa eskarietatik kanpo uzten da, baina bilaketa-kontsultek eta IP helbidearen informazioak bere zerbitzarietara iristen jarraituko dute." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Irudien deskribapen-sortzailea" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Soilik irudi berrientzat bidalketa berriak idaztean." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Oharra: ezaugarri honek hirugarrenen AA zerbitzua darabil, <0>img-alt-api</0>k eskainia. Litekeena da erabat ondo ez egitea. Soilik irudientzat eta soilik ingelesez." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Zerbitzariak taldekatutako jakinarazpenak" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Alpha fasean dagoen ezaugarria. Taldekatzea hobetu lezake, baina oinarrizko logika erabiliz." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Lasterbideen hodeiko inportazio / esportazio ezarpenak" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Oso esperimentala.<0/>Zure profileko oharretan gordetzen da. Profileko oharrak (pribatuak) beste profil batzuei buruzko oharretarako erabiltzen dira nagusiki, eta norberaren profilean ezkutatuta daude." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Oharra: ezaugarri honek saio hasita duzun zerbitzariaren APIa darabil." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Eskalki modua <0>(<1>Testua</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Testua blokeekin ordezkatzen du, pantaila-argazkiak egitean aproposa pribatutasun arrazoiengatik." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Honi buruz" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<1>@cheeaun</1>ek <0>sortua</0>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Eman babesa" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Egin dohaintza" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Pribatutasun politika" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Gunea:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Bertsioa:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Bertsioaren haria kopiatuta" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Ezin da bertsioaren haria kopiatu" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Ezin da harpidetza eguneratu. Saiatu berriro." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Ezin da harpidetza kendu. Saiatu berriro." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Push jakinarazpenak (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Push jakinarazpenak blokeatuta daude. Gaitu itzazu nabigatzaileko ezarpenetan." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Baimendu <0>{0}</0>(r)en" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "edonor" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "jarraitzen diodan jendea" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "jarraitzaile" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Jarraitzen die" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Bozketak" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Bidalketen edizioak" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Ez da push baimenik eman saioa azkenekoz hasi zenuenetik. <0><1>Hasi saioa</1> berriro baimentzeko</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "Oharra: push jakinarazpenak <0>kontu bakarrarentzat</0> dabiltza." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Bidalketa" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Ez duzu saiorik hasi. Ezin duzu interaktuatu (erantzun, bultzatu...)" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Bidalketa hau beste instantzia batekoa da (<0>{instance}</0>). Interakzioak (erantzunak, bultzadak, etab.) ez dira posible." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Errorea: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Aldatu nire instantziara interakzioak gaitzeko" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Ezin dira erantzunak kargatu." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Atzera" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Joan bidalketa nagusira" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} bidalketa goian ‒ Joan gora" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Aldatu gainbegirada bistara" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Aldatu bista osora" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Erakutsi eduki hunkigarri guztia" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Esperimentala" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Ezin da aldatu" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Aldatu bidalketaren instantziara ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Aldatu bidalketaren instantziara" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Ezin da bidalketa kargatu" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {erantzun #} other {<0>{1}</0> erantzun}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {iruzkin #} other {<0>{0}</0> iruzkin}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Ikusi bidalketa eta erantzunak" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Joerak ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Pil-pilean dauden albisteak" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "{0}(r)en eskutik" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Itzuli bogan dauden bidalketetara" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "<0>{0}</0> aipatzen duten bidalketak erakusten" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Bogan dauden bidalketak" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Ez dago bogadn dagoen joerarik." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Mastodon erabiltzeko web-bezero minimalista eta aparta." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Hasi saioa Mastodon-ekin" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Eman izena" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Konektatu zure Mastodon / Fedibertsoko kontua.<0/>Zure egiaztagiriak ez dira zerbitzari honetan gordetzen." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<1>@cheeaun</1>ek <0>sortua</0>. <2>Pribatutasun politika</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Bultzaden karruselaren pantaila-argazkia" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Bultzaden karrusela" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Bereizi bisualki bidalketa originalak eta partekatutakoak (bultzadak)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Habiratutako iruzkinen hariaren pantaila-argazkia" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Habiratutako iruzkinen haria" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Jarraitu elkarrizketak arazorik gabe. Erantzunak tolesten dira." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Taldekatutako jakinarazpenen pantaila-argazkia" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Taldekatutako jakinarazpenak" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Antzeko jakinarazpenak taldekatzen eta tolesten dira anabasa gutxitzeko." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Zutabe anitzeko interfazearen pantaila-argazkia" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Nahi beste zutabe" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Defektuz, zutabe bakarra ZEN antolaketa nahi dutenentzako. Zutabe gehiago konfiguratu daitezke erabilera aurreraturako." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Traola anitzeko denbora-lerroaren pantaila-argazkia, traola gehiago gehitzeko inprimakiarekin" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Traola anitzeko denbora-lerroa" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Denbora-lerro bakarrean 5 traola ere batu daitezke." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Badirudi nabigatzailea laster-leihoak blokeatzen ari dela." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Zirriborro bat ikonotuta dago. Argitaratu edo zokoratu berri bat sortu baino lehen." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Bidalketa bat irekita dago. Argitaratu edo zokoratu berri bat sortu baino lehen." + diff --git a/src/locales/fa-IR.po b/src/locales/fa-IR.po new file mode 100644 index 00000000..60559713 --- /dev/null +++ b/src/locales/fa-IR.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: fa\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Persian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: fa\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "قفل شده" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "فرسته‌ها: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "آخرین فرسته‌ها: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "خودکارشده" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "گروه" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "متقابل" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "درخواست‌شده" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "پی‌گرفته" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "شما را پی میگیرد" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural,one {# پی‌گرفته} other {# پی‌گرفته‌ها}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "تاییدشده" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "عضو شده<0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "برای همیشه" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "ناتوان در بارگذاری حساب کاربری." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "برو به صفحهٔ حساب کاربری" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "پی‌گیرنده" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "فرسته" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "بیشتر" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "برو به صفحهٔ اصلی نمایه" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "نمایش تصویر نمایه" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "نمایش سرآیند نمایه" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "در یادبود" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "این کاربر انتخاب کرده که این اطلاعات در دسترس نباشد." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} فرسته‌های اصلی، {1} پاسخ‌ها، {2} تقویت‌ها" + +#: 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 {۱ فرستهٔ آخر در ۱ روز گذشته} other {۱ فرستهٔ آخر در {2} روز گذشته}}} other {{3, plural, one {{4} فرستهٔ آخر در ۱ روز گذشته} other {{5} فرستهٔ آخر در {6} روز گذشته}}}}" + +#: 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 {۱ فرستهٔ آخر در سال گذشته} other {{1} فرستهٔ آخر در سال گذشته}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "اصلی" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "پاسخ‌ها" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "تقویت‌ها" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "اطلاعات فرسته غیرقابل دسترسی." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "نمایش اطلاعات فرسته" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "آخرین فرسته: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "خموشانده" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "مسدودشده" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "یادداشت خصوصی" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "اشاره به <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "ترجمهٔ شرح حال" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "ویرایش یادداشت خصوصی" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "افزودن یادداشت خصوصی" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "آگاهی‌ها برای فرسته‌های @{username} فعال شدند." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "آگاهی‌ها برای فرسته‌های @{username} غیرفعال شدند." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "غیرفعال کردن آگاهی‌ها" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "فعال‌سازی آگاهی‌ها" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "تقویت‌های @{username} فعال شدند." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "تقویت‌های @{username} غیرفعال شدند." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "غیرفعال کردن تقویت‌ها" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "فعال کردن تقویت‌ها" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "افزودن/حذف کردن از سیاهه‌ها" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "پیوند رونوشت شد" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "ناتوان در رونوشت برداشتن از پیوند" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "رونوشت" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "انگار همرسانی کار نمیکند." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "همرسانی…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "ناخموشیده @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "ناخموشاندن <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "خموشاندن <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} برای {0} خموشیده" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "ناتوانی در خموشاندن @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "<0>@{username}</0> را از پی‌گرفتگان حذف میکنید؟" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} از پی‌گیرنده حذف شد" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "حذف کردن پی‌گرفته…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "<0>@{username}</0> را مسدود میکنید؟" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "نامسدود کردن @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} مسدود شد" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "ناتوانی در نامسدود کردن @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "ناتوانی در مسدود کردن @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "نامسدود کردن <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "مسدود کردن <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "گزارش دادن <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "ویرایش نمایه" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "برگرداندن درخواست پی‌گیری؟" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "پی نگرفتن @{0}؟" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "پی نگرفتن…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "برگرداندن…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "پی گرفتن" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "بستن" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "شرح حال ترجمه شد" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "ناتوانی در حذف از سیاهه." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "ناتوانی در افزودن به سیاهه." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "ناتوانی در بارگذاری سیاهه‌ها." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "سیاهه‌ای نیست." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "سیاهه جدید" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "یادداشت خصوصی دربارهٔ <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "ناتوانی در بروزرسانی یادداشت خصوصی." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "لغو" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "ذخیره و بستن" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "ناتوانی در بروزرسانی نمایه." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "نام" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "شرح حال" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "مورد اضافی" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "برچسب" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "محتوا" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "ذخیره" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "نام کاربری" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "سامانهٔ نام دامنه" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "حالت پوشش غیرفعال شد" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "حالت پوشش فعال شد" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "خانه" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "ترکیب" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "افزودن شکلک شخصی‌سازی‌شده" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "افزودن نظرسنجی" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "شما تغییرات ذخیره‌نشده دارید. این فرسته را رها میکنید؟" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {فقط میتوانید تا ۱ پرونده الصاق کنید.} other {فقط میتوانید تا # پرونده الصاق کنید.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "کوچک‌کردن" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "انگار شما پنجرهٔ اصلی را بستید." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "انگار شما در حال حاضر یک زمینهٔ نوشتن در پنجرهٔ مادر دارید که در حال حاضر درحال انتشار است. لطفا صبر کنید تا تمام شود و بعدا دوباره تلاش کنید." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "انگار شما در حال حاضر یک زمینهٔ نوشتن در پنجرهٔ مادر دارید. وارد شدن به این پنجره تغییراتی که در پنجرهٔ مادر انجام داده‌اید را رها میکند. ادامه میدهید؟" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "درحال پاسخ دادن به فرستهٔ @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "درحال پاسخ دادن به فرستهٔ @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "ویرایش فرستهٔ منبع" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "نظرسنجی حداقل باید ۲ گزینه داشته باشد" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "بعضی گزینه‌های نظرسنجی خالی هستند" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "بعضی از رسانه‌ها شرح ندارند. ادامه میدهید؟" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "پیوست #{i} شکست خورد" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "هشدار محتوا" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "هشدار محتوا یا رسانهٔ حساس" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "همگانی" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "محلی" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "فهرست‌نشده" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "فقط پی‌گیرنده" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "اشارهٔ خصوصی" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "پاسختان را بفرستید" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "فرسته‌تان را ویرایش کنید" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "چکار میکنید؟" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "علامت‌گذاری رسانه به عنوان حساس" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "افزودن" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "پاسخ دادن" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "بروزرسانی" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "ارسال" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "بارگیری جیف…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "بارگیری جیف ناموفق بود" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "بیشتر…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "بارگذاری شد" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "شرح تصویر" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "شرح ویدئو" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "شرح صدا" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "اندازهٔ پرونده خیلی بزرگ است. بارگذاری ممکن است با مشکل مواجه شود. کم کردن اندازهٔ پرونده از {0} به {1} یا پایین‌تر را امتحان کنید." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "ترخ نوسازی بسیار زیاد است. بارگذاری ممکن است با مشکل موجه شود." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "حذف کردن" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "خطا" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "ویرایش کردن شرح تصویر" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "ویرایش کردن شرح ویدئو" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "ویرایش کردن شرح صدا" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "تولید شرح. لطفا صبر کنید…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "شکست در تولید شرح: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "شکست در تولید شرح" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "تولید شرح…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "شکست در تولید شرح{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— آزمایشگاهی</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "اتمام" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "گزینه {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "گزینه‌های چندگانه" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "طول" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "حذف نظرسنجی" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "جستجوی حساب‌ها" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "خطا در بارگذاری حساب‌ها" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "شکلک‌های شخصی‌سازی‌شده" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "جستجوی شکلک" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "خطا در بارگذاری شکلک‌های شخصی‌سازی‌شده" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "اخیرا استفاده‌شده" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "دیگران" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} بیشتر…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "جستجوی جیف‌ها" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "قدرت‌گرفته از GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "برای جستجوی جیف‌ها بنویسید" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "پیشین" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "پسین" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "خطا در بارگذاری جیف‌ها" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "پیش‌نویس‌های ارسال‌نشده" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "انگار پیش‌نویس‌های ارسال‌نشده دارید. بیایید از جایی که رها کرده‌اید ادامه دهیم." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "این پیش‌نویس را حذف میکنید؟" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "خطا در حذف پیش‌نویس! لطفا دوباره تلاش کنید." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "حذف…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "حذف کل پیش‌نویس‌ها؟" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "خطا در حذف پیش‌نویس‌ها! لطفا دوباره تلاش کنید." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "حذف همه…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "پیش‌نویسی یافت نشد." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "نظرسنجی" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "رسانه" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "باز کردن در پنجره‌ای جدید" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "قبول کردن" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "رد کردن" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "قبول شده" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "رد شده" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "چیزی برای نمایش نیست" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "حساب‌های کاربری" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "نمایش بیشتر…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "آخر." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "میانبرهای صفحه کلید" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "راهنمای میانبرهای صفحه کلید" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "فرستهٔ پسین" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "فرستهٔ پیشین" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>تبدیل</0> + <1>ت</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>تبدیل</0> + <1>ن</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "بارگذاری فرسته‌های جدید" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "باز کردن اطلاعات فرسته" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>ورود</0> یا <1>خ</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "گسترش دادن هشدار محتوا یا<0/>تغییر حالت رشتهٔ گسترده/بسته" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "بستن فرسته یا پنجره" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>فرار</0> یا <1>پس‌بر</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "ستون متمرکز در حالت چندستونه" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>۱</0> تا <1>۹</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "نوشتن فرستهٔ جدید" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "نوشتن فرستهٔ جدید (پنجرهٔ جدید)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>تبدیل</0> + <1>ز</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "ارسال فرسته" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>مهار</0> + <1>ورود</1> یا <2>⌘</2> + <3>ورود</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "جستجو" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "پاسخ دادن (پنجرهٔ جدید)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>تبدیل</0> + <1>ق</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "پسندیدن (مورد علاقه)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>م</0> یا <1>ب</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "تقویت" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>تبدیل</0> + <1>ذ</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "نشانک‌گذاری" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "تغییر وضعیت حالت پوشش" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>تبدیل</0> + <1>دگرساز</1> + <2>ن</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "ویرایش سیاهه" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "ناتوان در ویرایش سیاهه." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "ناتوان در ایجاد سیاهه." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "نمایش پاسخ‌ها به سیاههٔ اعضا" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "نمایش پاسخ‌ها به افرادی که پی میگیرم" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "پاسخ‌ها را نمایش نده" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "پنهان کردن فرسته‌ها در این سیاهه از خانه/پی‌گرفته" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "ایجاد" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "این سیاهه را حذف میکنید؟" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "ناتوان در حذف سیاهه." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "شرح رسانه" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "ترجمه" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "حرف زدن" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "باز کردن رسانهٔ اصلی در پنجرهٔ جدید" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "باز کردن رسانهٔ اصلی" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "تلاش برای شرح دادن تصویر. لطفا صبر کنید…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "شکست در شرح دادن تصویر" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "شرح دادن تصویر…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "نمایش فرسته" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "رسانهٔ حساس" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "پالایش‌شده: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "پالایش‌شده" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "فرسته منتشر شد. آن را ببینید." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "پاسخ ارسال شد. آن را ببینید." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "فرسته بروزرسانی شد. آن را ببینید." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "فهرست" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "صفحه را برای بروزرسانی بارگذاری مجدد میکنید؟" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "بروزرسانی جدید در دسترس است…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "اشاره‌ها" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "آگاهی‌ها" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "جدید" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "نمایه" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "نشانک‌گذاری‌ها" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "برگزیده‌ها" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "برچسب‌های پی‌گرفته‌شده" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "پالایه‌ها" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "کاربران خموشیده‌شده" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "کاربران خموشیده‌شده…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "کاربران مسدودشده" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "کاربران مسدودشده…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "حساب‌ها…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "ورود" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "داغ" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "خودگردان" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "میانبرها / ستون‌ها…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "تنظیمات…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "سیاهه‌ها" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "همهٔ سیاهه‌ها" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "آگاهی" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "این آگاهی از حساب دیگر شماست." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "نمایش همهٔ آگاهی‌ها" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} روی فرستهٔ شما با {emojiObject} بازخورد داد" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} یک فرسته منتشر کرد." + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} درخواست کرد شما را پی‌گیری کند." + +#: src/components/notification.jsx:151 +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} پاسختان را پسندید.} other {{account} فرسته‌تان را پسندید.}}} other {{account} {postsCount} فرسته از فرسته‌هایتان را پسندید.}}} other {{postType, select, reply {<0><1>{0}</1> نفر</0> پاسختان را پسندیدند.} other {<2><3>{1}</3> نفر</2> فرسته‌تان را پسندیدند.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "یک نظرسنجی که در آن رأی داده‌اید یا آن را ایجاد کرده‌اید پایان یافته است." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "یک نظرسنجی که شما ایجاد کرده‌اید پایان یافته است." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "یک نظرسنجی که شما در آن رأی داده‌اید پایان یافته است." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "یک فرسته که شما با آن تعامل داشته‌اید تغییر یافته است." + +#: src/components/notification.jsx:204 +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} پاسختان را تقویت کرد و پسندید.} other {{account} فرسته‌تان را تقویت کرد و پسندید.}}} other {{account} {postsCount} فرسته از فرسته‌هایتان را تقویت کرد و پسندید.}}} other {{postType, select,reply {<0><1>{0}</1> نفر</0> پاسختان را تقویت کردند و پسندیدند.} other {<2><3>{1}</3> نفر</2> فرسته‌تان را تقویت کردند و پسندیدند.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} ثبت‌نام شد." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} {targetAccount} را گزارش کرد" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "اتصال از دست رفته با <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "یک مدیر از <0>{from}</0> <1>{targetName}</1> را تعلیق کرده است، معنی‌اش این است که شما دیگر نمیتوانید بروزرسانی‌هایی از آنها دریافت کنید یا با آنها تعامل کنید." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "یک مدیر از <0>{from}</0> <1>{targetName}</1> را مسدود کرده است. پی‌گیرنده‌های تأثیرپذیرفته: {followersCount}، پی‌گرفته‌های تأثیرپذیرفته: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "شما <0>{targetName}</0> را مسدود کرده‌اید. پی‌گیرنده حذف‌شده: {followersCount}، پی‌گرفته‌های حذف‌شده: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "حساب کاربری شما غیرفعال شده است." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "بعضی از فرسته‌های شما به عنوان حساس نشانه‌گذاری شده‌اند." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "بعضی از فرسته‌های شما حذف شده‌اند." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "از این به بعد فرسته‌های شما به عنوان حساس نشانه‌گذاری خواهند شد." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "حساب کاربری شما محدود شده است." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "حساب کاربری شما تعلیق شده است." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[نوع ناشناختهٔ آگاهی: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "تقویت‌شده/برگزیده‌شده توسط…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "برگزیده‌شده توسط…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "تقویت‌شده توسط…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "پی‌گرفته‌شده توسط…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "بیشتر بدانید <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "بیشتر خوانید ←" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "رأی داده شده" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "پنهان کردن نتایج" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "رأی دادن" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "بارگذاری مجدد" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "نمایش نتایج" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "پایان یافته <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "پایان‌یافته" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "در حال اتمام <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "در حال اتمام" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}ث" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}د" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}س" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "قوانین خاص کارساز را نقض میکند" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "دیگر" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "گزارش دادن فرسته" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "گزارش دادن @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "فرسته گزارش شد" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "نمایه گزارش شد" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "ناتوان در گزارش دادن فرسته" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "ناتوان در گزارش دادن نمایه" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "مشکل این فرسته چیست؟" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "مشکل این نمایه چیست؟" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "اطلاعات اضافی" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "هدایت کرد نبه <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "ارسال کردن گزارش" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "خموشیده {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ حساب‌های کاربری، برچسب‌ها و فرسته‌ها</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "فرسته‌هایی با <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "فرسته‌هایی که با <0>#{0}</0> برچسب‌گذاری شده‌اند" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "بررسی کردن <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "حساب‌های کاربری با <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "خانه/پی‌گرفته" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "همگانی (محلی/نامتمرکز)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "حساب کاربری" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "برچسب" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "شناسهٔ سیاهه" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "فقط محلی" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "نمونه" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "پیشنهادی، مثلا mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "مثلا PixelArt (حداکثر ۵، جدا شده با فاصله)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "فقط رسانه" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "میانبرها" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "بتا" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "تعیین کردن سیاهه‌ای از میانبرهایی که به عنوان ظاهر میشوند:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "دکمهٔ شناور" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "نوار برگه/فهرست" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "چندستونه" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "غیرقابل دسترسی در حالت نمایش کنونی" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "حرکت به بالا" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "حرکت به پایین" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "ویرایش" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "یک میانبر/ستون دیگر اضافه کنید تا این کار کند." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "هنوز ستونی وجود ندارد. روی دکمهٔ افزودن ستون بزنید." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "هنوز میانبری وجود ندارد. روی دکمهٔ افزودن میانبر بزنید." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "هنوز مطمئن نیستید چه چیزی اضافه کنید؟ اول<0/>اضافه کردن <1>خانه/پی‌گرفته و آگاهی‌ها</1> را امتحان کنید." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "بیشترین {SHORTCUTS_LIMIT} ستون" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "بیشترین {SHORTCUTS_LIMIT} میانبر" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "ورود/صدور" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "افزودن ستون…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "افزودن میانبر…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "سیاههٔ مخصوص پیشنهادی است. برای حالت چندستونه، سیاهه ضروری است، در غیر این صورت این ستون میتواند نمایش داده نشود." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "چندبرچسب پشتیبانی میشود. جداشده با فاصله." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "ویرایش میانبر" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "افزودن میانبر" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "خط زمانی" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "سیاهه" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "ورود/صدور <0>میانبرها</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "ورود" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "چسباندن میانبرها اینجا" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "بارگیری میانبرهای ذخیره‌شده از کارساز نمونه…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "ناتوان در بارگیری میانبرها" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "بارگیری میانبرها از کارساز نمونه" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "بازنویسی کردن…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "وارد کردن…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "صادر کردن" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "میانبرها رونوشت شدند" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "ناتوان در رونویسی از میانبرها" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "میانبرهای تنظیمات رونوشت شدند" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "ناتوان در رونویسی از میانبرهای تنظیمات" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "همرسانی" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "ذخیره کردن میانبرها در کارساز نمونه…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "میانبرها ذخیره شدند" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "ناتوان در ذخیره کردن میانبرها" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "همگام‌سازی با کارساز نمونه" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural,one {# نویسه} other {# نویسه‌ها}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "جیسون خالص میانبرها" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "ورود/صدور تنظیمات از/به کارساز نمونه (خیلی آزمایشی)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>تقویت کرد</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "متأسفانه نمونه‌ای که شما در آن وارد شده‌اید نمیتواند با این فرسته از یک نمونهٔ دیگر تعامل داشته باشد." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "فرستهٔ @{0} نابرگزیده شد" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "فرستهٔ @{0} برگزیده شد" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "فرستهٔ @{0} نانشانک‌گذاری شد" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "فرستهٔ @{0} نشانک‌گذاری شد" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "ناتقویت" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "نقل قول" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "بعضی از رسانه‌ها شرح ندارند." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "فرستهٔ قدیمی (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "فرستهٔ @{0} ناتقویت شد" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "فرستهٔ @{0} تقویت شد" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "تقویت…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "نابرگزیدن" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "برگزیدن" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "نانشانک‌گذاری" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "نمایش تاریخچهٔ ویرایش" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "ویرایش‌شده: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "فرستهٔ جاسازی‌شده" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "گفتگو ناخموشیده شد" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "گفتگو خموشیده شد" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "ناتوان در ناخموشاندن گفتگو" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "ناتوان در خموشاندن گفتگو" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "ناخموشاندن گفتگو" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "خموشاندن گفتگو" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "سنجاق فرسته از نمایه برداشته شد" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "فرسته به نمایه سنجاق شد" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "ناتوان در برداشتن سنجاق فرسته" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "ناتوان در سنجاق کردن فرسته" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "برداشتن سنجاق " + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "سنجاق کردن به نمایه" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "این فرسته را حذف میکنید؟" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "گزارش دادن فرسته…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "فرسته بعدا میتواند ویرایش یا حذف شود." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "پیش‌نمایش" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "نکته: این پیش‌نمایش بصورت طراحی سبک است." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> تقویت‌شده" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "فرسته‌های جدید" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "تلاش مجدد" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "رشته" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>پالایش‌شده</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "ترجمهٔ خودکار از {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "درحال ترجمه…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "ترجمه از {sourceLangText} (تشخیص خودکار)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "ترجمه از {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "خودکار ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "شکست در ترجمه" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "ویرایش وضعیت منبع" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "درحال پاسخ دادن به @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "احتمالا باید این صفحه را الآن ببندید." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "بستن پنجره" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "نیاز به ورود." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "رفتن به خانه" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "فرسته‌های حساب کاربری" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ پاسخ‌ها)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- تقویت‌ها)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (رسانه)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "پاک کردن پالایه‌ها" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "پاک کردن" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "نمایش فرسته با پاسخ‌ها" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ پاسخ‌ها" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "نمایش فرسته‌ها بدون تقویت‌ها" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- تقویت‌ها" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "نمایش فرسته‌های دارای رسانه" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "نمایش فرسته‌هایی که با #{0} برچسب‌گذاری شده‌اند" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "نمایش فرسته‌ها در {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "اینجا چیزی برای دیدن نیست." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "ناتوان در بارگذاری فرسته‌ها" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "انتقال به نمونهٔ حساب کاربری {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "انتقال به نمونهٔ من (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "ماه" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "کنونی" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "پیش‌گزیده" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "تعویض کردن به این حساب کاربری" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "نمایش نمایه…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "تنظیم به عنوان پیش‌گزیده" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "از <0>@{0}</0> خارج میشوید؟" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "خروج…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "افزودن یک حساب کاربری موجود" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "هنوز نشانکی نیست. برو چیزهایی را نشانک‌گذاری کن!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "ناتوان در بارگذاری نشانک‌ها." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "۱ ساعت گذشته" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "۲ ساعت گذشته" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "۳ ساعت گذشته" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "۴ ساعت گذشته" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "۵ ساعت گذشته" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "۶ ساعت گذشته" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "۷ ساعت گذشته" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "۸ ساعت گذشته" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "۹ ساعت گذشته" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "۱۰ ساعت گذشته" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "۱۱ ساعت گذشته" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "۱۲ ساعت گذشته" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "برچسب‌های پی‌گرفته‌شده" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "گروه‌ها" + +#: 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 "نمایش دادن {selectedFilterCategory, select, all {همهٔ فرسته‌ها} original {فرسته‌های اصلی} replies {پاسخ‌ها} boosts {تقویت‌ها} followedTags {برچسب‌های پیگرفته} groups {گروه‌ها} filtered {فرسته‌های پالایش‌شده}}، {sortBy, select,createdAt {{sortOrder, select, asc {قدیمی‌ترین} desc {آخرین}}} reblogsCount {{sortOrder, select, asc {کمترین تقویت‌ها} desc {بیشترین تقویت‌ها}}} favouritesCount {{sortOrder, select, asc {کمترین پسندیده‌ها} desc {بیشترین پسندیده‌ها}}} repliesCount {{sortOrder, select, asc {کمترین پاسخ‌ها} desc {بیشترین پاسخ‌ها}}} density {{sortOrder, select, asc {کمترین تراکم} desc {بیشترین تراکم}}}} اولین{groupBy, select, account {، گروه‌بندی‌شده توسط نویسنده‌ها} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "راهنما" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "اين چيست؟" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "تمام فرسته‌های… را به من نشان بده" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "تا بیشترین" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "نکته: نمونهٔ شما فقط میتواند حداکثر ۸۰۰ فرسته بدون توجه به زمان در خط زمانی نمایش دهد. میتواند کمتر یا بیشتر باشد." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "قبلا…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural,one {# فرسته} other {# فرسته‌ها}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "این کمی زمانبر است." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "تنظیم مجدد پالایه‌ها" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "همرسانی‌شده توسط {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "همه" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural,one {# نویسنده} other {# نویسنده‌ها}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "مرتب‌سازی" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "تاریخ" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "تراکم" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "نویسنده‌ها" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "هیچ‌کدام" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "نمایش همهٔ نویسنده‌ها" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "نیازی نیست همه چیز را بخوانید." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "کافیست." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "برگشتن به بالا" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "پیوندهایی که توسط پی‌گرفته‌ها همرسانی شده‌اند، مرتب‌شده طبق شمارش همرسانی‌شده، تقویت‌ها و برگزیده‌ها." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "مرتب‌سازی: تراکم" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "فرسته‌ها با تراکم یا عمق اطلاعات مرتب‌شده‌اند. فرسته‌های کوتاه‌تر «سبک‌تر» هستند درحالیکه فرسته‌های طولانی‌تر «سنگین‌تر» هستند. فرسته‌هایی با تصاویر از فرسته‌های بدون تصویر «سنگین‌تر» هستند." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "گروه: نویسندگان" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "فرسته‌ها طبق نویسنده‌ها دسته‌بندی شده‌اند، طبق فرسته بر حسب نویسنده مرتب شده‌اند." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "نویسندهٔ پسین" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "نویسندهٔ پیشین" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "پیمایش به بالا" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "پالایش‌شده: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "ناتوان در بارگذاری برگزیده‌ها." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "خانه و سیاهه‌ها" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "خط زمانی همگانی" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "گفتگوها" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "نمایه‌ها" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "هرگز" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "پالایهٔ جدید" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural,one {# پالایه} other {# پالایه‌ها}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "ناتوان در بارگذاری پالایه‌ها." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "هنوز پالایه‌ای نیست." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "اصافه کردن پالایه" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "ویرایش پالایه" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "ناتوان در ویرایش پالایه" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "ناتوان در ایحاد پالایه" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "عنوان" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "تمام واژه" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "کلیدواژهای نیست. یکی اضافه کنید." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "افزودن کلیدواژه" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "این پالایه را حذف میکنید؟" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "هرگز منقضی نمیشود" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# برچسب} other {# برچسب‌ها}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "ناتوان در بارگذاری برچسب‌های پی‌گرفته." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "هنوز برچسبی پی‌گرفته نشده." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "اینجا چیزی برای دیدن وجود ندارد." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "ناتوان در بارگذاری فرسته‌ها." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (فقط رسانه) در {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} در {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (فقط رسانه)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "هنوز کسی با این برچسب چیزی نفرستاده است." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "ناتوان در بارگذاری فرسته‌ها با این برچسب" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "#{hashtag} ناپی‌گرفته شد" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "#{hashtag} پی‌گرفته شد" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "درحال پی‌گیری…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, other {بیشترین # برچسب‌ها}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "افزودن برچسب" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "حذف کردن برچسب" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "این میانبر درحال حاضر موجود است" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "میانبر برچسب اضافه شد" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "افزودن به میانبرها" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "یک نمونهٔ جدید وارد کنید مثل \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "نمونهٔ نامعتبر" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "رفتن به یک نمونهٔ دیگر…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "رفتن به نمونهٔ من (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>جدید</0> <1>درخواست‌های پی‌گیری</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "دیدن همه" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "هنوز چیزی نیست." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "مدیریت کردن اعضا" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "<0>@{0}</0> را از سیاهه حذف میکنید؟" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "حذف کردن…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# سیاهه} other {# سیاهه‌ها}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "هنوز سیاهه‌ای نیست." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "مثلا \"mastodon.social\"" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "ادامه دادن با {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "ادامه" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "حساب کاربری ندارید؟ یکی بسازید!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "اشاره‌های خصوصی" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "خصوصی" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "کسی به شما اشاره نکرده :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "شما پی نمیگیرید" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "کسی که شما را دنبال نمیکند" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "با یک حساب کاربری جدید" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "کسی که بصورت ناخواسته به شما اشارهٔ خصوصی کرده" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "کسی که توسط ناظم‌های کارساز محدود شده است" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "تنظیمات آگهی‌ها" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "درخواست‌های پی‌گیری" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# درخواست پی‌گیری} other {# درخواست پیگیری}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {آگاهی‌های پالایش‌شده از شخص #} other {آگاهی‌های پالایش‌شده از شخص #}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "فقط اشاره‌ها" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "امروز" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "دیروز" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "ناتوان در بارگذاری آگاهی‌ها" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "تنظیمات آگاهی‌ها بارگذاری شدند" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "پالایش کردن آگاهی‌ها از افراد:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "پالایش کردن" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "نادیده گرفتن" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "بروزشده <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "نمایش آگاهی‌ها از <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "آگاهی‌ها از <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "آگاهی‌ها از @{0} از الآن پالایش نخواهند شد." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "ناتوان در قبول کردن درخواست آگاهی" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "اجازه دادن" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "آگاهی‌ها از @{0} از الآن در آگاهی‌های پالایش‌شده نمایش داده نخواهند شد." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "ناتوان در رد کردن درخواست آگاهی" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "رد کردن" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "رد شد" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "خط زمانی محلی ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "خط زمانی نامتمرکز ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "خط زمانی محلی" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "خط زمانی نامتمرکز" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "هنوز کسی چیزی ارسال نکرده است." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "تعویض کردن به نامتمرکز" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "تعویض کردن به محلی" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "جستجو: {q} (فرسته‌ها)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "جستجو: {q} (حساب‌های کاربری)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "جستجو: {q} (برچسب‌ها)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "جستجو: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "برچسب‌ها" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "بیشتر ببینید" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "حساب‌های کاربری بیشتری را ببینید" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "حسابی یافت نشد." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "دیدن برچسب‌های بیشتر" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "برچسبی پیدا نشد." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "دیدن فرسته‌های بیشتر" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "فرسته‌ای پیدا نشد." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "مورد جستجوی خود را وارد کنید یا " + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "تنظیمات" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "ظاهر" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "روشن" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "تاریک" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "خودکار" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "اندازهٔ نوشته" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "الف" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "نمایش زبان" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "ترجمه‌های داوطلبانه" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "درحال ارسال" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "دید پیش‌گزیده" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "همگام‌سازی شد" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "با تنظیمات کارساز نمونهٔ شما همگام‌سازی شد. <0> برای تنظیمات بیشتر به نمونهٔ خود ({instance}) بروید.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "آزمایش‌ها" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "بارگذاری مجدد خودکار فرسته‌های خط زمانی" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "ترجمهٔ فرسته" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "ترجمه به" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "زبان سامانه ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {مخفی کردن دکمهٔ «ترجمه» برای:} other {مخفی کردن دکمهٔ «ترجمه» برای (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "نکته: این قابلیت از خدمات ترجمهٔ خارجی، قدرت گرفته از <0>Lingva API</0> و <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "ترجمهٔ خودکار درخط" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "بصورت خودکار ترجمه را برای فرسته‌ها در خط زمانی نمایش میدهد. فقط برای فرسته‌های <0>کوتاه</0> بدون هشدار محتوا، رسانه یا نظرسنجی کار میکند." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "انتخاب‌کنندهٔ جیف برای نویسنده" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "نکته: این قابلیت از یک خدمت خراجی جستجوی جیف، قدرت‌گرفته از <0>جیفی</0>، استفاده میکند. رده‌بندی سنی عمومی (مناسب برای مشاهدهٔ همهٔ سنین)، ویژگی‌های دنبال‌کننده سلب شده‌اند، اطلاعات درخواست‌کننده از درخواست‌ها حذف شده‌اند، ولی درخواست جستجو و نشانی آی‌پی همچنان به کارساز آنها خواهند رسید." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "فقط برای تصاویر جدید در زمان نوشتن فرسته‌های جدید." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "نکته: این قابلیت از یک خدمت هوش مصنوعی خارجی، قدرت گرفته از <0>img-alt-api</0>، استفاده میکند. شاید خوب کار نکند. فقط برای تصاویر و به زبان انگلیسی است." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "آگهی‌های گروه‌بندی‌شدهٔ سمت کارساز" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "ورود/صدور «ابری» برای تنظیمات میانبرها" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ بسیار آزمایشی.<0/>در یادداشت‌های نمایهٔ خود شما ذخیره میشود. یادداشت‌های (خصوصی) نمایه در اصل برای بقیهٔ نمایه‌ها استفاده میشوند، و برای نمایهٔ خود پنهان هستند." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "نکته: این قابلیت از API کارساز نمونه‌ای که اکنون وارد شده‌اید استفاده میکند." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "حالت پوشش<0>(<1>متن</1> ← <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "درباره" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>ساخته‌شده</0> توسط <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>وبگاه:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>نگارش:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "رشتهٔ نگارش رونوشت شد" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "ناتوان در رونوشت رشتهٔ نگارش" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "آگاهی ارسالی (بتا)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "آگاهی‌های ارسالی مسدود شده‌اند. لطفا آنها را در تنظیمات مرورگر خود فعال کنید." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "اجازه دادن از <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "هرکس" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "اجازهٔ ارسال از زمان آخرین ورود شما داده نشده. شما باید دوباره <0><1>وارد شوید</1> و اجازهٔ ارسال را بدهید</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "نکته: آگاهی‌های ارسالی فقط برای <0>یک حساب کاربری</0> کار میکنند." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "تعویض به حالت نمایش کامل" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "نمایش همهٔ محتوای حساس" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "آزمایشی" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "تعویض به نمونهٔ فرسته ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "تعویض به نمونهٔ فرسته" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>ساخته‌شده</0> توسط <1>@cheeaun</1>. <2>حریم خصوصی</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/fi-FI.po b/src/locales/fi-FI.po new file mode 100644 index 00000000..3bb1501e --- /dev/null +++ b/src/locales/fi-FI.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: fi\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 22:00\n" +"Last-Translator: \n" +"Language-Team: Finnish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: fi\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Lukittu" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Julkaisut: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Julkaissut viimeksi: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Botti" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Ryhmä" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Seuraatte toisianne" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Pyydetty" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Seurataan" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Seuraa sinua" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# seuraaja} other {# seuraajaa}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Vahvistettu" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Liittynyt <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Ikuisesti" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Tiliä ei voitu ladata." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Siirry tilisivulle" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Seuraajat" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Seuratut" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Julkaisut" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Lisää" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> on ilmoittanut, että hänen uusi tilinsä on nyt:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Käyttäjätunnus kopioitu" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Käyttäjätunnusta ei voitu kopioida" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Kopioi käyttäjätunnus" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Siirry alkuperäiselle profiilisivulle" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Näytä profiilikuva" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Näytä profiilin otsake" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "Muistoissamme" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Käyttäjä on päättänyt pitää nämä tiedot yksityisinä." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} alkuperäistä julkaisua, {1} vastausta, {2} tehostusta" + +#: 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 {Viimeisin julkaisu viime päivänä} other {Viimeisin julkaisu viimeisenä {2} päivänä}}} other {{3, plural, one {Viimeiset {4} julkaisua viime päivänä} other {Viimeiset {5} julkaisua viimeisenä {6} päivänä}}}}" + +#: 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 {Viimeisen julkaisu viime vuosina} other {Viimeiset {1} julkaisua viime vuosina}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Alkuperäiset" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Vastaukset" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Tehostukset" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Julkaisutilastoja ei saatavilla." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Näytä julkaisutilastot" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Edellinen julkaisu: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Mykistetty" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Estetty" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Yksityinen merkintä" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Mainitse <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Käännä elämäkerta" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Muokkaa yksityistä merkintää" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Lisää yksityinen merkintä" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Ilmoitukset käyttäjän @{username} julkaisuista otettu käyttöön." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Ilmoitukset käyttäjän @{username} julkaisuista poistettu käytöstä." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Poista ilmoitukset käytöstä" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Ota ilmoitukset käyttöön" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Käyttäjän @{username} tehostukset otettu käyttöön." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Käyttäjän @{username} tehostukset poistettu käytöstä." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Poista tehostukset käytöstä" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Ota tehostukset käyttöön" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Lisää/poista listoista" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Linkki kopioitu" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Linkkiä ei voitu kopioida" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopioi" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Jako ei näytä toimivan." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Jaa…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Kumottu käyttäjän @{username} mykistys" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Kumoa käyttäjän <0>@{username}</0> mykistys" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Mykistä <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Mykistetty @{username}, kestona {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Käyttäjää @{username} ei voitu mykistää" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Poistetaanko <0>@{username}</0> seuraajista?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} poistettu seuraajista" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Poista seuraaja…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Estetäänkö <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Kumottu käyttäjän @{username} esto" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Estetty @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Käyttäjän @{username} mykistystä ei voitu kumota" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Käyttäjää @{username} ei voitu estää" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Kumoa käyttäjän <0>@{username}</0> esto" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Estä <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Raportoi <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Muokkaa profiilia" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Perutaanko seurauspyyntö?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Lopetetaanko käyttäjän @{0} seuraaminen?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Älä seuraa…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Peru…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Seuraa" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Sulje" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Käännetty elämäkerta" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Listasta ei voitu poistaa." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Listaan ei voitu lisätä." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Listoja ei voitu ladata." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Ei listoja." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Uusi lista" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Yksityinen merkintä käyttäjästä <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Yksityistä merkintää ei voitu päivittää." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Peruuta" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Tallenna ja sulje" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Profiilia ei voitu päivitää." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nimi" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Elämäkerta" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Lisäkentät" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Nimike" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Sisältö" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Tallenna" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "käyttäjänimi" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "palvelimen verkkotunnus" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Peittotila poistettu käytöstä" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Peittotila otettu käyttöön" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Koti" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Luo" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Lisää mediaa" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Lisää mukautettu emoji" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Lisää GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Lisää äänestys" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Sinulla on tallentamattomia muutoksia. Hylätäänkö julkaisu?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {Tiedostoa {1} ei tueta.} other {Tiedostoja {2} ei tueta.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Voit liittää enintään 1 tiedoston.} other {Voit liittää enintään # tiedostoa.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Ponnauta ulos" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Pienennä" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Näytät sulkeneesi pääikkunan." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Luontikenttä näyttää olevan sinulla avoinna pääikkunassa ja julkaiseminen meneillään. Odota, että se on valmis, ja yritä myöhemmin uudelleen." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Luontikenttä näyttää olevan sinulla avoinna pääikkunassa. Tämän ikkunan sisään ponnauttaminen hävittää pääikkunassa tekemäsi muutokset. Jatketaanko?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Ponnauta sisään" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Vastataan käyttäjän @{0} julkaisuun (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Vastataan käyttäjän @{0} julkaisuun" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Muokataan lähdejulkaisua" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Äänestyksessä pitää olla vähintään 2 vastausvaihtoehtoa" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Osa vaihtoehdoista on tyhjiä" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Osalta mediasta puuttuu kuvaus. Jatketaanko?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Liite #{i} epäonnistui" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Sisältövaroitus" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Sisältövaroitus tai arkaluonteinen media" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Julkinen" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Paikallinen" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Listaamaton" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Vain seuraajat" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Yksityismaininta" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Julkaise vastauksesi" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Muokkaa julkaisuasi" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Mitä teet?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Merkitse media arkaluonteiseksi" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Lisää" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Vastaa" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Päivitä" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Julkaise" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Ladataan GIF-kuvaa…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "GIF-kuvan lataus epäonnistui" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Lisää…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Ladattu" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Kuvan kuvaus" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Videon kuvaus" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Äänen kuvaus" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Liian suuri tiedostokoko. Lataaminen saattaa aiheuttaa ongelmia. Kokeile pienentää koosta {0} kokoon {1} tai pienemmäksi." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Liian suuret mitat. Lataaminen saattaa aiheuttaa ongelmia. Kokeile pienentää mitoista {0}×{1} px mittoihin {2}×{3} px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Liian suuri kuvataajuus. Lataaminen saattaa aiheuttaa ongelmia." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Poista" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Virhe" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Muokkaa kuvan kuvausta" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Muokkaa videon kuvausta" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Muokkaa äänen kuvausta" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Luodaan kuvausta. Odota hetki…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Kuvauksen luonti epäonnistui: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Kuvauksen luonti epäonnistui" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Luo kuvaus…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Kuvauksen luonti epäonnistui{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— kokeellinen</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Valmis" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Vaihtoehto {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Monivalinta" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Kesto" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Poista äänestys" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Hae tilejä" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Virhe ladattaessa tilejä" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Mukautetut emojit" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Hae emojia" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Virhe ladattaessa mukautettuja emojeita" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Viimeaikaiset" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Muut" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} lisää…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Hae GIF-kuvia" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Palvelun tarjoaa GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Hae GIF-kuvia kirjoittamalla" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Edellinen" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Seuraava" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Virhe ladattaessa GIF-kuvia" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Lähettämättömät luonnokset" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Sinulla näyttää olevan lähettämättömiä luonnoksia. Jatketaan siitä, mihin jäit." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Poistetaanko tämä luonnos?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Virhe poistettaessa luonnosta! Yritä uudelleen." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Poista…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Virhe haettaessa vastauksellisuuden tilaa!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Poistetaanko kaikki luonnokset?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Virhe poistettaessa luonnoksia! Yritä uudelleen." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Poista kaikki…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Luonnoksia ei ole." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Äänestys" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Media" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Avaa uuteen ikkunaan" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Hyväksy" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Hylkää" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Hyväksytty" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Hylätty" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Ei mitään näytettävää" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Tilit" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Näytä lisää…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Loppu." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Pikanäppäimet" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Pikanäppäinten ohje" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Seuraava julkaisu" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Edellinen julkaisu" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Siirrä karuselli seuraavaan julkaisuun" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Vaihto</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Siirrä karuselli edelliseen julkaisuun" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Vaihto</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Lataa lisää julkaisuja" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Avaa julkaisun lisätiedot" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> tai <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Laajenna sisältövaroitus tai<0/>laajenna/supista keskusteluketju" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Sulje julkaisu tai valintaikkunat" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> tai <1>askelpalautin</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Kohdista sarakkeeseen usean sarakkeen tilassa" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0>–<1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Kohdista edelliseen sarakkeeseen usean sarakkeen tilassa" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Kohdista seuraavaan sarakkeeseen usean sarakkeen tilassa" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Luo uusi julkaisu" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Luo uusi julkaisu (uusi ikkuna)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Vaihto</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Lähetä julkaisu" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> tai <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Haku" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Vastaa (uusi ikkuna)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Vaihto</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Tykkää (lisää suosikkeihin)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> tai <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Tehosta" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Vaihto</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Lisää kirjanmerkkeihin" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Ota peittotila käyttöön tai pois käytöstä" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Vaihto</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Muokkaa listaa" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Listaa ei voitu muokata." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Listaa ei voitu luoda." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Näytä vastaukset listan jäsenille" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Näytä vastaukset seuraamilleni käyttäjille" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Älä näytä vastauksia" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Piilota julkaisut koti-/seurattavien aikajanalta" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Luo" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Poistetaanko tämä lista?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Listaa ei voitu poistaa." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Median kuvaus" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Käännä" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Puhu" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Avaa alkuperäinen media uuteen ikkunaan" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Avaa alkuperäinen media" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Koetetaan kuvailla kuvaa. Odota hetki…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Kuvan kuvailu epäonnistui" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Kuvaile kuvaa…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Näytä julkaisu" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Arkaluonteinen media" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Suodatettu: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Suodatettu" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Julkaisu lähetetty. Tarkista se." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Vastaus julkaistu. Tarkista se." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Julkaisu päivitetty. Tarkista se." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Valikko" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Päivitetäänkö lataamalla sivu uudelleen nyt?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Uusi päivitys saatavilla…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Seuratut" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Kiinnikuronta" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Maininnat" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Ilmoitukset" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Uusi" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profiili" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Kirjanmerkit" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Tykkäykset" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Seuratut aihetunnisteet" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Suodattimet" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Mykistetyt käyttäjät" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Mykistetyt käyttäjät…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Estetyt käyttäjät" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Estetyt käyttäjät…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Tilit…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Kirjaudu sisään" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Suositut" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federoitu" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Pikavalinnat / Sarakkeet…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Asetukset…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Listat" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Kaikki listat" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Ilmoitus" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Tämä ilmoitus on toiselta tililtäsi." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Näytä kaikki ilmoitukset" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} reagoi julkaisuusi emojilla {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} julkaisi." + +#: src/components/notification.jsx:85 +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} tehosti vastaustasi.} other {{account} tehosti julkaisuasi.}}} other {{account} tehosti {postsCount} julkaisuasi.}}} other {{postType, select, reply {<0><1>{0}</1> käyttäjää</0> tehosti vastaustasi.} other {<2><3>{1}</3> käyttäjää</2> tehosti julkaisuasi.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, one {}=1 {{account} seurasi sinua.} other {<0><1>{0}</1> käyttäjää</0> seurasi sinua.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} pyysi saada seurata sinua." + +#: src/components/notification.jsx:151 +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} tykkäsi vastauksestasi.} other {{account} tykkäsi julkaisustasi.}}} other {{account} tykkäsi {postsCount} julkaisustasi.}}} other {{postType, select, reply {<0><1>{0}</1> käyttäjää</0> tykkäsi vastauksestasi.} other {<2><3>{1}</3> käyttäjää</2> tykkäsi julkaisustasi.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Äänestys, johon olet osallistunut tai jonka olet luonut, on päättynyt." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Äänestys, jonka olet luonut, on päättynyt." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Äänestys, johon olet osallistunut, on päättynyt." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Julkaisua, jonka kanssa olet ollut vuorovaikutuksessa, on päivitetty." + +#: src/components/notification.jsx:204 +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} tehosti ja tykkäsi vastauksestasi.} other {{account} tehosti ja tykkäsi julkaisustasi.}}} other {{account} tehosti ja tykkäsi {postsCount} julkaisustasi.}}} other {{postType, select, reply {<0><1>{0}</1> käyttäjää</0> tehosti ja tykkäsi vastauksestasi.} other {<2><3>{1}</3> käyttäjää</2> tehosti ja tykkäsi julkaisustasi.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} rekisteröityi." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} raportoi käyttäjän {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Menetettiin yhteydet kohteeseen <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Moderointivaroitus" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "Vuotesi {year} #Wrapstodon on täällä!" + +#: src/components/notification.jsx:272 +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." +msgstr "Palvelimen <0>{from}</0> ylläpitäjä on jäädyttänyt käyttäjän <1>{targetName}</1>, minkä takia et saa enää hänen päivityksiään etkä voi olla vuorovaikutuksessa hänen kanssaan." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Palvelimen <0>{from}</0> ylläpitäjä on estänyt palvelimen <1>{targetName}</1>. Vaikutettuja seuraajia {followersCount}, seurattuja {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Olet estänyt palvelimen <0>{targetName}</0>. Poistettuja seuraajia {followersCount}, seurattuja {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Tilisi on saanut moderointivaroituksen." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Tilisi on poistettu käytöstä." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Julkaisujasi on merkitty arkaluonteisiksi." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Julkaisujasi on poistettu." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Tästä lähtien julkaisusi merkitään arkaluonteisiksi." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Tiliäsi on rajoitettu." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Tilisi on jäädytetty." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Tuntematon ilmoitustyyppi: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Tehostaneet/tykänneet…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Tykänneet…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Tehostanut…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Seurannut…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Lue lisää <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "Näytä #Wrapstodon" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Lue lisää →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Äänestetty" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# ääni} other {# ääntä}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Piilota tulokset" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Äänestä" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Päivitä" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Näytä tulokset" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> ääni} other {<1>{1}</1> ääntä}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> äänestäjä} other {<1>{1}</1> äänestäjää}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Päättynyt <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Päättynyt" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Päättyy <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Päättyy" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0} s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0} min" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0} t" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Roskaposti" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Haitalliset linkit, valeaktiivisuus tai toisteiset vastaukset" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Laittomuus" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Rikkoo maasi tai palvelimen sijaintimaan lakia" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Palvelimen sääntöjen rikkomus" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Rikkoo tietyn palvelimen sääntöjä" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Rikkomus" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Muu" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Ongelma ei sovi muihin luokkiin" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Raportoi julkaisu" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Raportoi @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Odottaa arviota" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Julkaisu raportoitu" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Profiili raportoitu" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Julkaisua ei voitu raportoida" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Profiilia ei voitu raportoida" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Mikä ongelma on tässä julkaisussa?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Mikä ongelma on tässä profiilissa?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Lisätiedot" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Välitä palvelimelle <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Lähetä raportti" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Mykistetty {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Käyttäjää {username} ei voitu mykistää" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Lähetä raportti <0>+ mykistä profiili</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Estetty {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Käyttäjää {username} ei voitu estää" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Lähetä raportti <0>+ estä profiili</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ tilit, aihetunnisteet ja julkaisut</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Julkaisut haulla <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Julkaisut aihetunnisteella <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Hae <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Tilit haulla <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Koti / Seuratut" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Julkinen (paikallinen / federoitu)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Tili" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Aihetunniste" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "Listan tunnus" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Vain paikalliset" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instanssi" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Valinnainen, esim. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Hakutermi" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Valinnainen, paitsi usean sarakkeen tilassa" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "esim. PixelArt (enintään 5, välilyönnein eroteltuina)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Vain media" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Pikavalinnat" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beeta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Määritä luettelo pikavalintoja, jotka näkyvät seuraavasti:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Kelluva painike" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Välilehti-/valikkopalkki" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Useampi sarake" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Ei saatavilla nykyisessä näkymätilassa" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Siirrä ylöspäin" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Siirrä alaspäin" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Muokkaa" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Lisää useampi pikavalinta/sarake, jotta tämä toimisi." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Ei vielä sarakkeita. Napauta Lisää sarake -painiketta." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Ei vielä pikavalintoja. Napauta Lisää pikavalinta -painiketta." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Etkö ole varma, mitä lisätä?<0/>Kokeile lisätä ensin <1>Koti / Seuratut tai Ilmoitukset</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Enintään {SHORTCUTS_LIMIT} saraketta" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Enintään {SHORTCUTS_LIMIT} pikavalintaa" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Tuo/vie" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Lisää sarake…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Lisää pikavalinta…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Tietty lista on valinnainen. Usean sarakkeen tilassa lista tarvitaan, tai saraketta ei näytetä." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Usean sarakkeen tilassa tarvitaan hakutermi, tai muuten saraketta ei näytetä." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Useaa aihetunnistetta tuetaan. Erottele välilyönnein." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Muokkaa pikavalintaa" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Lisää pikavalinta" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Aikajana" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Lista" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Tuo/vie <0>pikavalinnat</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Tuo" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Liitä pikavalinnat tähän" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Ladataan tallennetut pikavalinnat instanssipalvelimelta…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Pikavalintoja ei voitu ladata" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Lataa pikavalinnat instanssipalvelimelta" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Kuuluu nykyisiin pikavalintoihin" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Lista ei välttämättä toimi, jos se on eri tililtä." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Virheellinen asetusformaatti" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Lisätäänkö nykyisiin pikavalintoihin?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Lisätään vain pikavalinnat, joita ei ole nykyisissä pikavalinnoissa." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Ei uusia pikavalintoja tuotavaksi" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Pikavalinnat tuotu. Enimmäismäärä {SHORTCUTS_LIMIT} ylittyi, joten loppuja ei tuotu." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Pikavalinnat tuotu" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Tuo ja lisää…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Korvataanko nykyiset pikavalinnat?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Tuodaanko pikavalinnat?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "tai korvaa…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Tuo…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Vie" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Pikavalinnat kopioitu" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Pikavalintoja ei voitu kopioida" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Pikavalintojen asetukset kopioitu" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Pikavalintojen asetuksia ei voitu kopioida" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Jaa" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Tallennetaan pikavalinnat instanssipalvelimelle…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Pikavalinnat tallennettu" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Pikavalintoja ei voitu tallentaa" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Synkronoi instanssipalvelimelle" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# merkki} other {# merkkiä}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Pikavalintojen raaka-JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Tuo/vie asetukset instanssipalvelimelta/-palvelimelle (erittäin kokeellinen)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>tehosti</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Valitettavasti parhaillaan kirjautuneena oleva instanssi ei voi olla vuorovaikutuksessa tämän toiselta instanssilta peräisin olevan julkaisun kanssa." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Kumottu käyttäjän @{0} julkaisun tykkäys" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Tykätty käyttäjän @{0} julkaisusta" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Käyttäjän @{0} julkaisu poistettu kirjanmerkeistä" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Käyttäjän @{0} julkaisu lisätty kirjanmerkkeihin" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Kumoa tehostus" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Lainaa" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Osalta mediasta puuttuu kuvaus." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Vanha julkaisu (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Kumottu käyttäjän @{0} julkaisun tehostus" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Tehostettu käyttäjän @{0} julkaisua" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Tehosta…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Kumoa tykkäys" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Tykkää" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Poista kirjanmerkeistä" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Näytä käyttäjän <0>@{0}</0> julkaisu" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Näytä muokkaushistoria" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Muokattu: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Upota julkaisu" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Keskustelun mykistys kumottu" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Keskustelu mykistetty" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Keskustelun mykistystä ei voitu kumota" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Keskustelua ei voitu mykistää" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Kumoa keskustelun mykistys" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Mykistä keskustelu" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Julkaisu irrotettu profiilista" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Julkaisu kiinnitetty profiiliin" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Julkaisua ei voitu irrottaa" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Julkaisua ei voitu kiinnittää" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Irrota profiilista" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Kiinnitä profiiliin" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Poistetaanko tämä julkaisu?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Julkaisu poistettu" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Julkaisua ei voitu poistaa" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Raportoi julkaisu…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Tykätty" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Tehostettu" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Lisätty kirjanmerkkeihin" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Kiinnitetty" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Poistettu" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# vastaus} other {# vastausta}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Ketju{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Näytä vähemmän" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Näytä sisältö" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Näytä media" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Muokattu" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Kommentit" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Lisää tekijältä <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Muokkaushistoria" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Historian lataus epäonnistui" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Ladataan…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML-koodi" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML-koodi kopioitu" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "HTML-koodia ei voitu kopioida" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Medialiitteet:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Tilin emojit:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "staattinen URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojit:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Huomiot:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Tämä on staattinen, tyylittelemätön ja skriptitön. Saatat joutua käyttämään omia tyylejäsi ja muokkaamaan koodia tarpeen mukaan." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Äänestykset eivät ole vuorovaikutteisia, vaan niistä tulee luettelo äänimääristä." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Medialiitteet voivat olla kuvia, videoita, ääniä tai mitä tahansa muita tiedostotyyppejä." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Julkaisua voi muokata tai sen voi poistaa myöhemmin." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Esikatselu" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Huomaa: Tämä esikatselu on kevyesti tyylitelty." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> tehosti" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Uudet julkaisut" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Yritä uudelleen" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# tehostus} other {# tehostusta}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Kiinnitetyt julkaisut" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Ketju" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Suodatettu</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Käännetty automaattisesti kielestä {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Käännetään…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Käännä kielestä {sourceLangText} (tunnistettu automaattisesti)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Käännä kielestä {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Automaattinen ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Kääntäminen epäonnistui" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Muokataan lähdepäivitystä" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Vastataan käyttäjälle @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Voit nyt sulkea tämän sivun." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Sulje ikkuna" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Kirjautuminen vaaditaan." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Siirry etusivulle" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Tilin julkaisut" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Vastaukset)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Tehostukset)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Media)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Tyhjennä suodattimet" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Tyhjennä" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Näytetään julkaisut vastaukset mukaan lukien" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Vastaukset" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Näytetään julkaisut tehostukset pois lukien" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Tehostukset" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Näytetään julkaisut, joissa on mediaa" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Näytetään julkaisut aihetunnisteella #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Näytetään julkaisut ajalta {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Täällä ei ole vielä mitään nähtävää." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Julkaisua ei voitu ladata" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Tilitietoja ei voitu hakea" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Vaihda tilin instanssiin {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Vaihda omaan instanssiin (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Kuukausi" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Nykyinen" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Oletus" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Vaihda tähän tiliin" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Vaihda uuteen välilehteen/ikkunaan" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Näytä profiili…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Aseta oletukseksi" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Kirjataanko <0>@{0}</0> ulos?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Kirjaa ulos…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Lisää olemassa oleva tili" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Huomaa: Ensimmäiseen lataukseen käytetään aina <0>oletustiliä</0>. Vaihtoehtoiset tilit säilyvät istunnon ajan." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Ei vielä kirjanmerkkejä. Mene ja lisää jokin kirjanmerkkeihin!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Kirjanmerkkejä ei voitu ladata." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "viimeiseltä tunnilta" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "viimeiseltä 2 tunnilta" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "viimeiseltä 3 tunnilta" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "viimeiseltä 4 tunnilta" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "viimeiseltä 5 tunnilta" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "viimeiseltä 6 tunnilta" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "viimeiseltä 7 tunnilta" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "viimeiseltä 8 tunnilta" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "viimeiseltä 9 tunnilta" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "viimeiseltä 10 tunnilta" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "viimeiseltä 11 tunnilta" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "viimeiseltä 12 tunnilta" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "ennen viimeistä 12 tuntia" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Seuratut tunnisteet" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Ryhmät" + +#: 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 "Näytetään {selectedFilterCategory, select, all {kaikki julkaisut} original {alkuperäiset julkaisut} replies {vastaukset} boosts {tehostukset} followedTags {seuratut aihetunnisteet} groups {ryhmät} filtered {suodatetut julkaisut}}, {sortBy, select, createdAt {{sortOrder, select, asc {vanhimmat} desc {uusimmat}}} reblogsCount {{sortOrder, select, asc {vähiten tehostetut} desc {eniten tehostetut}}} favouritesCount {{sortOrder, select, asc {vähiten tykätyt} desc {eniten tykätyt}}} repliesCount {{sortOrder, select, asc {vähiten vastauksia saaneet} desc {eniten vastauksia saanteet}}} density {{sortOrder, select, asc {vähiten tiheät} desc {tiheimmät}}}} ensin{groupBy, select, account {, tekijöittäin ryhmiteltynä} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Kiinnikuronta <0>beeta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Ohje" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Mikä tämä on?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Kiinnikuronta on erillinen aikajana, joka tarjoaa ylätason näkymän seurattuihisi yhdellä silmäyksellä. Yksinkertainen, sähköpostin innoittama käyttöliittymä, jossa voit vaivattomasti järjestellä ja suodattaa julkaisuja." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Kiinnikuronnan käyttöliittymän esikatselu" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Kurotaanpa kiinni" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Kurotaanpa seurattusi julkaisut kiinni." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Näytä kaikki julkaisut…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "enimmäisaikaan asti" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Kuro kiinni" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Menee edellisen kiinnikurontasi päälle" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Edelliseen kiinnikurontaasi asti ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Huomaa: Instanssisi saattaa näyttää kotiaikajanalla enintään vain 800 julkaisua riippumatta valitusta aikavälistä. Määrä voi olla pienempi tai suurempi." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Aiemmin…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# julkaisu} other {# julkaisua}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Poistetaanko tämä kiinnikuronta?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Poistetaan kiinnikuronta {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Kiinnikuronta {0} poistettu" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Huomaa: Vain enintään 3 tallennetaan. Loput poistetaan automaattisesti." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Haetaan julkaisuja…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Tämä saattaa kestää hetken." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Palauta suodattimet" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Suosituimmat linkit" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Jakanut {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Kaikki" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# tekijä} other {# tekijää}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Järjestys" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Päiväys" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Tiheys" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Ryhmä" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Tekijät" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Ei mikään" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Näytä kaikki tekijät" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Sinun ei tarvitse lukea kaikkea." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Siinä kaikki." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Takaisin ylös" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Seurattujen jakamat linkit järjestettynä jakomäärän mukaan, tehostukset ja tykkäykset." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Järjestys: Tiheys" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Julkaisut järjestetään informaatiotiheyden tai -syvyyden mukaan. Lyhyemmät julkaisut ovat ”kevyempiä”, pidemmät taas ”painavampia”. Kuvan sisältävät julkaisut ovat ”paivavampia” kuin kuvattomat." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Ryhmä: Tekijät" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Julkaisut ryhmitellään tekijän mukaan ja järjestellään tekijäkohtaisen julkaisumäärän perusteella." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Seuraava tekijä" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Edellinen tekijä" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Vieritä ylös" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Suodatettu: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Ei vielä tykkäyksiä. Mene ja tykkää jostakin!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Tykkäyksiä ei voitu ladata." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Koti ja listat" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Julkiset aikajanat" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Keskustelut" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profiilit" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Ei koskaan" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Uusi suodatin" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# suodatin} other {# suodatinta}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Suodattimia ei voitu ladata." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Ei vielä suodattimia." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Lisää suodatin" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Muokkaa suodatinta" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Suodatinta ei voitu muokata" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Suodatinta ei voitu luoda" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Nimi" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Koko sana" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Ei avainsanoja. Lisää sellainen." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Lisää avainsana" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# avainsana} other {# avainsanaa}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Suodata kohteesta…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Ei vielä toteutettu" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Tila: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Muuta vanhentumista" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Vanhentuminen" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Suodatetut julkaisut…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "pienennetään" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "piilotetaan" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Poistetaanko tämä suodatin?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Suodatinta ei voitu poistaa." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Vanhentunut" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Vanhenee <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Ei vanhene koskaan" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# aihetunniste} other {# aihetunnistetta}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Seurattuja aihetunnisteita ei voitu ladata." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Ei vielä seurattuja aihetunnisteita." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Täällä ei ole mitään nähtävää." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Julkaisuja ei voitu ladata." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (vain media) instansissa {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} instanssissa {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (vain media)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Kukaan ei ole julkaissut vielä mitään tällä aihetunnisteella." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Julkaisuja tällä aihetunnisteella ei voitu ladata" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Lopetetaanko aihetunnisteen #{hashtag} seuraaminen?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Lopetettu tunnisteen #{hashtag} seuraaminen" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Seurattu tunnistetta #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Seurataan…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Poistettu esiltä profiilista" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Ei voitu poistaa esiltä profiilista" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Nostettu esille profiiliin" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Nosta esille profiiliin" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, other {Enintään # tunnistetta}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Lisää aihetunniste" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Poista aihetunniste" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Pikavalintojen enimmäismäärä # ylitetty. Pikavalintaa ei voitu lisätä.} other {Pikavalintojen enimmäismäärä # ylitetty. Pikavalintaa ei voitu lisätä.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Tämä pikavalinta on jo olemassa" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Aihetunnisteen pikavalinta lisätty" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Lisää pikatoimintoihin" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Anna uusi instanssi, esim. ”mastodon.social”" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Virheellinen instanssi" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Siirry toiseen instanssiin…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Siirry omalle instanssille (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Ilmoituksia ei voitu hakea." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Uudet</0> <1>seurantapyynnöt</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Katso kaikki" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Resolvoidaan…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "URL-osoitetta ei voitu resolvoida" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Ei vielä mitään." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Hallitse jäseniä" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Poistetaanko <0>@{0}</0> listasta?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Poista…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# lista} other {# listaa}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Ei vielä listoja." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Sovelluksen rekisteröinti epäonnistui" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "instanssin verkkotunnus" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "esim. ”mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Sisäänkirjautuminen epäonnistui. Yritä uudelleen tai kokeile toista instanssia." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Jatka instanssilla {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Jatka" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Eikö sinulla ole tiliä? Luo sellainen!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Yksityismaininnat" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Yksityiset" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Kukaan ei ole maininnut sinua :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Mainintoja ei voitu ladata." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Joita et seuraa" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Jotka eivät seuraa sinua" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Joilla on uusi tili" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Jotka pyytämättä mainitsevat sinut yksityisesti" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Joita palvelimen moderaattorit ovat rajoittaneet" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Ilmoitusasetukset" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Uudet ilmoitukset" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Tiedote} other {Tiedotteet}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Seurauspyynnöt" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# seurauspyyntö} other {# seurauspyyntöä}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Suodatettu ilmoitukset # käyttäjältä} other {Suodatettu ilmoitukset # käyttäjältä}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Vain maininnat" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Tänään" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Olet ajan tasalla." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Eilen" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Ilmoituksia ei voitu ladata" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Päivitetty ilmoitusasetukset" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Suodata ilmoitukset pois käyttäjiltä:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Suodata" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Sivuuta" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Päivitetty <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Näytä ilmoitukset käyttäjältä <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Ilmoitukset käyttäjältä <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Ilmoituksia käyttäjältä @{0} ei enää tästä lähtien suodateta." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Ilmoituspyyntöä ei voitu hyväksyä" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Salli" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Ilmoitukset käyttäjältä @{0} eivät näy suodatetuissa ilmoituksissa tästä lähtien." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Ilmoituspyyntöä ei voitu hylätä" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Hylkää" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Hylätty" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Paikallinen aikajana ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Federoitu aikajana ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Paikallinen aikajana" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Federoitu aikajana" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Kukaan ei ole vielä julkaissut mitään." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Vaihda federoituun" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Vaihda paikalliseen" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Haku: {q} (julkaisut)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Haku: {q} (tilit)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Haku: {q} (aihetunnisteet)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Haku: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Aihetunnisteet" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Katso lisää" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Katso lisää tilejä" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Tilejä ei löytynyt." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Katso lisää aihetunnisteita" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Aihetunnisteita ei löytynyt." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Katso lisää julkaisuja" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Julkaisuja ei löytynyt." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Aloita kirjoittamalla hakutermi tai liittämällä URL-osoite yläpuolelle." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Asetukset" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Ulkoasu" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Tumma" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Vaalea" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Autom." + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Tekstin koko" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Näyttökieli" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Vapaaehtoisten käännökset" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Julkaiseminen" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Oletusnäkyvyys" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Synkronoituva" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Julkaisujen näkyvyyden päivitys epäonnistui" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Synkronoituu palvelimesi asetuksiin. <0>Siirry instanssiisi ({instance}), jos tarvitset lisäasetuksia.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Kokeelliset ominaisuudet" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Päivitä aikajanan julkaisut automaattisesti" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Tehostuskaruselli" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Julkaisujen kääntäminen" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Käännä kielelle" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Järjestelmän kieli ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, one {}=0 {Piilota Käännä-painike kieliltä:} other {Piilota Käännä-painike kieliltä (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Huomaa: Tämä ominaisuus käyttää ulkoisia käännöspalveluita, jotka tarjoaa <0>Lingva API</0> ja <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Automaattinen käännös tekstin paikalla" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Näytä julkaisujen käännökset automaattisesti aikajanalla. Toimii vain <0>lyhyille</0> julkaisuille, joissa ei ole sisältövaroitusta, mediaa eikä äänestystä." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "GIF-valitsin luontikentässä" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Huomaa: Tämä ominaisuus käyttää ulkoista GIF-hakupalvelua, jonka tarjoaa <0>GIPHY</0>. Se on G-luokiteltu (katselu sopii kaikenikäisille), seurantaparametrit poistetaan ja viittaustieto jätetään pois pyynnöistä, mutta hakukyselyt ja tieto IP-osoitteesta päätyy silti palvelun palvelimille." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Kuvan kuvausgeneraattori" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Vain uusille kuville, uutta julkaisua luotaessa." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Huomaa: Tämä ominaisuus käyttää ulkoista tekoälypalvelua, jonka tarjoaa <0>img-alt-api</0>. Ei välttämättä toimi hyvin. Vain kuville ja englanniksi." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Palvelimen puolella ryhmitellyt ilmoitukset" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Alfavaiheen ominaisuus. Mahdollisesti parempi ryhmittelyikkuna, mutta perustason ryhmittelylogiikka." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Pikavalintojen asetusten tuonti/vienti ”pilven” kautta" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Erittäin kokeellinen.<0/>Tallennetaan oman profiilisi merkintään. Profiilien (yksityisiä) merkintöjä käytetään enimmäkseen muille profiileille, ja omassa profiilissa ne ovat piilossa." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Huomaa: Tämä ominaisuus käyttää parhaillaan kirjautuneena olevan instanssin ohjelmointirajapintaa." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Peittotila <0>(<1>Teksti</1> → <2>██████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Korvaa tekstin lohkoilla, hyödyllinen näyttökuvia otettaessa, yksityisyyssyistä." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Tietoja" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Kehittänyt</0> <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Sponsoroi" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Lahjoita" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Tietosuojakäytäntö" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Sivusto:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versio:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Version merkkijono kopioitu" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Version merkkijonoa ei voitu kopioida" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Tilauksen päivitys epäonnistui. Yritä uudelleen." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Tilauksen poisto epäonnistui. Yritä uudelleen." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Puskuilmoitukset (beeta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Puskuilmoitukset on estetty. Ota ne käyttöön selaimesi asetuksissa." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Salli <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "keneltä tahansa" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "käyttäjiltä, joita seuraan" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "seuraajilta" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Uudet seuraajat" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Äänestykset" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Julkaisujen muokkaukset" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Puskulupaa ei myönnetty viimeisen kirjautumisesi jälkeen. Sinun täytyy <0><1>kirjautua sisään</1> uudelleen myönteeksesi puskuluvan</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "HUOMAA: Puskuilmoitukset toimivat vain <0>yhdellä tilillä</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Julkaisu" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Et ole kirjautuneena sisään. Vuorovaikutus (vastaaminen, tehostaminen jne.) ei ole mahdollista." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Tämä julkaisu on toisesta instanssista (<0>{instance}</0>). Vuorovaikutus (vastaaminen, tehostaminen jne.) ei ole mahdollista." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Virhe: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Vaihda omaan instanssiin, niin saat vuorovaikutuksen käyttöön" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Vastauksia ei voitu ladata." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Takaisin" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Siirry pääjulkaisuun" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} julkaisua yläpuolella – Siitty ylös" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Vaihda sivupaneelinäkymään" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Vaihda täyteen näkymään" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Näytä kaikki arkaluonteinen sisältö" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Kokeellinen" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Ei voitu vaihtaa" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Vaihda julkaisun instanssiin ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Vaihda julkaisun instanssiin" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Julkaisua ei voitu ladata" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# vastaus} other {<0>{1}</0> vastausta}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# kommentti} other {<0>{0}</0> kommenttia}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Näytä julkaisu vastauksineen" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Suositut ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Suositut uutiset" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Tehnyt {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Takaisin katsomaan suosittuja julkaisuja" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Näytetään julkaisut, joissa mainitaan <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Suositut julkaisut" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Ei suosittuja julkaisuja." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Minimalistinen, omintakeinen Mastodon-selainsovellus." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Kirjaudu sisään Mastodon-tilillä" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Rekisteröidy" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Yhdistä olemassa oleva Mastodon- tai fediversumin tilisi.<0/>Kirjautumistietojasi ei tallenneta tälle palvelimelle." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Kehittänyt</0> <1>@cheeaun</1>. <2>Tietosuojakäytäntö</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Näyttökuva tehostuskarusellista" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Tehostuskaruselli" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Erottele alkuperäiset julkaisut visuaalisesti uudelleenjaetuista (tehostetuista) julkaisuista." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Näyttökuva sisäkkäisten kommenttien ketjusta" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Sisäkkäisten kommenttien ketju" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Seuraa keskusteluja vaivatta. Osittain kutistettavat vastaukset." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Näyttökuva ryhmitellyistä ilmoituksista" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Ryhmitellyt ilmoitukset" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Samankaltaiset ilmoitukset ryhmitellään ja supistetaan sekavuuden vähentämiseksi." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Näyttökuva usean sarakkeen käyttöliittymästä" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Yksi tai useampi sarake" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Oletuksena yksi sarake zen-tilan hakijoille. Määritettävissä usean sarakkeen tila tehokäyttäjille." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Näyttökuva usean aihetunnisteen aikajanasta, jossa on lomake uusien aihetunnisteiden lisäämiseksi" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Usean aihetunnisteen aikajana" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Enintään 5 aihetunnistetta yhdistettynä yhdelle aikajanalle." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Selaimesi näyttää estävän ponnahdusikkunat." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Julkaisuluonnos on parhaillaan pienennettynä. Julkaise tai hylkää se ennen kuin luot uuden." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Julkaisu on parhaillaan avoinna. Julkaise tai hylkää se ennen kuin luot uuden." + diff --git a/src/locales/fr-FR.po b/src/locales/fr-FR.po new file mode 100644 index 00000000..14242d8f --- /dev/null +++ b/src/locales/fr-FR.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: fr\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: French\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Verrouillé" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Messages : {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Dernier message : {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatisé" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Groupe" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Suivi mutuel" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Demandé" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Abonnements" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Vous suit" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# abonné⋅e} other {# abonné⋅es}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Vérifié" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Inscrit·e depuis le <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Pour toujours" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Le compte n’a pas pu être chargé." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Aller à la page du compte" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Abonné⋅e·s" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Messages" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Plus" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> a désormais le nouveau compte suivant :" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Identifiant copié" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "L’identifiant n’a pas pu être copié." + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Copier l’identifiant" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Visiter la page de profil originale" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Afficher l’image de profil" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Afficher la bannière de profil" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "In memoriam" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Cette personne ne souhaite pas partager cette information." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} messages, {1} réponses, {2} partages" + +#: 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 {Dernier message aujourd’hui} other {Dernier message ces {2} derniers jours}}} other {{3, plural, one {{4} messages les plus récents aujourd’hui} other {{5} messages les plus récents ces {6} derniers jours}}}}" + +#: 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 {Dernier 1 message dans les dernières années} other {Derniers {1} messages dans les dernières années}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Messages" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Réponses" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Partages" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Les statistiques de ce message ne sont pas disponibles." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Afficher les statistiques du message" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Dernier message : <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Masqué⋅e" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Bloqué⋅e" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Note personnelle" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Mentionner <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Traduire la bio" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Modifier les notes personnelles" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Ajouter une note personnelle" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Notifications activées pour les messages de @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Notifications désactivées pour les messages de @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Désactiver les notifications" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Activer les notifications" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Partages affichés pour @{username}." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Partages masqués pour @{username}." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Masquer les partages" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Afficher les partages" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Ajouter ou retirer des listes" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Lien copié" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Le lien n’a pas pu être copié." + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Copier" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Le partage ne paraît pas possible." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Partager…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "@{username} n’est plus masqué⋅e" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Ne plus masquer <0>@{username}></0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Masquer <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} masqué⋅e pendant {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Impossible de masquer @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Retirer <0>@{username}</0> de vos abonné⋅e·s ?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} retiré⋅e de vos abonné⋅es" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Retirer de vos abonné⋅es…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Bloquer <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "@{username} débloqué⋅e" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} bloqué⋅e" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Impossible de débloquer @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Impossible de bloquer @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Débloquer <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Bloquer <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Signaler <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Modifier votre profil" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Annuler la demande de suivi ?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Ne plus suivre @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Ne plus suivre…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Annuler…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Suivre" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Fermer" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Bio traduite" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Impossible de retirer de la liste." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Impossible d’ajouter à la liste." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Les listes n’ont pas pu être chargées." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Aucune liste." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nouvelle liste" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Note personnelle à propos de <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Les notes personnelles n’ont pas pu être enregistrées." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Annuler" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Enregistrer et quitter" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Le profil n’a pas pu être enregistré." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nom" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Bio" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Champs personnalisés" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Titre" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Contenu" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Enregistrer" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "identifiant" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "nom de domaine" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Mode camouflage désactivé" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Mode camouflage activé" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Accueil" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Rédiger" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Insérer un émoji personnalisé" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Insérer un sondage" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Le message n’est pas sauvegardé. Annuler sa rédaction ?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Vous ne pouvez joindre qu’un seul fichier.} other {Vous pouvez joindre jusqu’à # fichiers.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Ouvrir dans une nouvelle fenêtre" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimiser" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Il semblerait que vous ayez fermé la fenêtre d’origine." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Il semblerait que vous ayez déjà un message en cours de publication ouvert dans la fenêtre d’origine. Merci de réessayer une fois ce message publié." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Il semblerait que vous ayez déjà un message en cours de rédaction dans la fenêtre d’origine. Restaurer cette fenêtre annulera la rédaction du message de la fenêtre d’origine sans sauvegarder. Continuer ?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Restaurer dans la fenêtre d’origine" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "En réponse au message de @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "En réponse au message de @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Modification du message d’origine" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Au moins deux choix sont nécessaires pour un sondage" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Tous les choix du sondage ne sont pas renseignés" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Les médias n’ont pas tous de descriptions renseignées. Continuer ?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "#{i} n’a pas pu être joint au message" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Avertissement de contenu" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Avertissement de contenu ou média délicat" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Public" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Local" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Non-listé" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Abonné⋅es seulement" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Mention privée" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Publier votre réponse" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Modifier votre message" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Quoi de neuf ?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Marquer le média comme délicat" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Insérer" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Répondre" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Mettre à jour" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Publier" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Téléchargement du GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Le GIF n’a pas pu être téléchargé." + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Plus…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Chargé" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Description de l’image" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Description de la vidéo" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Description de l’audio" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Ce fichier est trop lourd. Son chargement pourrait échouer. Essayez de réduire son poids de {0} à {1} ou moins." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Ce média est trop grand. Son chargement pourrait échouer. Essayez de réduire sa taille de {0}×{1} px à {2}×{3} px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Ce média a une fréquence trop élevée. Son chargement pourrait échouer." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Supprimer" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Erreur" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Modifier la description de l’image" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Modifier la description de la vidéo" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Modifier la description de l’audio" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Description en cours de génération. Merci de patienter…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Échec lors de la génération d’une description : {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Échec lors de la génération d’une description" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Générer une description…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Échec lors de la génération d’une description{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— expérimental</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Enregistrer" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Choix {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Choix multiples" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Durée" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Supprimer le sondage" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Chercher des comptes" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Les comptes n’ont pas pu être chargés" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Émojis personnalisés" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Chercher un émoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Les émojis personnalisés n’ont pas pu être chargés" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Récemment insérés" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Autres" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} de plus…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Chercher des GIFs" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Propulsé par GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Entrez votre recherche pour trouver des GIFs" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Précédent" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Suivant" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Erreur lors du chargement des GIFs" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Brouillons non envoyés" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "On dirait que vous avez des brouillons non envoyés. Continuons là où vous l'avez laissé." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Supprimer ce brouillon ?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Erreur lors de la suppression du brouillon. Veuillez réessayer." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Supprimer…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Erreur lors de la récupération du statut de la réponse !" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Supprimer tous les brouillons ?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Erreur lors de la suppression des brouillons ! Veuillez réessayer." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Tout supprimer…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Pas de brouillon trouvé." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Sondage" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Média" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Ouvrir dans une nouvelle fenêtre" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Accepter" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Rejeter" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Acceptée" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Rejetée" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Rien à afficher" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Comptes" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Voir plus…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "C'est fini." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Raccourcis clavier" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Aide pour les raccourcis clavier" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Message suivant" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Message précédent" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Passer le carrousel au message suivant" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Maj</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Passer le carrousel au message précédent" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Maj</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Charger de nouveaux messages" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Ouvrir les détails du message" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Entrée</0> ou <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Développer l'avertissement de contenu ou<0/>activer/désactiver le fil étendu/réduit" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Fermer le message ou les boîtes de dialogue" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Échap</0> ou <1>Retour arrière</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Focus colonne en mode multi-colonnes" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> à <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Rédiger un nouveau message" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Rédiger un nouveau message (nouvelle fenêtre)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Maj</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Publier message" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Entrée</1> ou <2>⌘</2> + <3>Entrée</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Recherche" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Répondre (nouvelle fenêtre)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Maj</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Ajouter en favori" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> ou <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Partager" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Maj</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Ajouter aux signets" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Activer/Désactiver le mode camouflage" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Maj</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Modifier la liste" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "La liste n’a pas pu être modifiée." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "La liste n’a pas pu être créée." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Afficher les réponses aux membres de la liste" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Afficher les réponses aux personnes que je suis" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Ne pas afficher les réponses" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Masquer les messages de cette liste sur l'Accueil/Abonnements" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Créer" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Supprimer cette liste ?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "La liste n’a pas pu être supprimée." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Description du média" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Traduire" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Prononcer" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Ouvrir le média d'origine dans une nouvelle fenêtre" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Ouvrir le média d'origine" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Tentative de description de l'image. Veuillez patienter…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "La description de l'image a échoué" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Décrivez l'image…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Voir le message" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Média délicat" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtré : {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtré" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Message publié. Voir le message." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Réponse publiée. Consultez-la." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Message mis à jour. Voir le message." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menu" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Recharger la page maintenant pour la mettre à jour ?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nouvelle mise à jour disponible…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Rattrapage" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Mentions" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Notifications" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Nouveau" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Signets" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Favoris" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Hashtags suivis" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtres" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Comptes masqués" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Comptes masqués…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Compte bloqués" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Comptes bloqués…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Comptes…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Connexion" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Tendances" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Fédéré" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Raccourcis / Colonnes…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Préférences…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Listes" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Toutes les listes" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Notification" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Cette notification provient de votre autre compte." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Voir toutes les notifications" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} a réagi à votre message avec {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} a publié un message." + +#: src/components/notification.jsx:85 +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} a partagé votre réponse.} other {{account} a partagé votre message.}}} other {{account} a partagé {postsCount} de vos messages.}}} other {{postType, select, reply {<0><1>{0}</1> personnes </0> ont partagé votre réponse.} other {<2><3>{1}</3> personnes</2> ont partagé votre message.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, one {}=1 {{account} vous a suivi.} other {<0><1>{0}</1> personnes</0> vous ont suivi.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} a demandé à vous suivre." + +#: src/components/notification.jsx:151 +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} a aimé votre réponse.} other {{account} a aimé votre message.}}} other {{account} a aimé {postsCount} de vos messages.}}} other {{postType, select, reply {<0><1>{0}</1> personnes </0> ont aimé votre réponse.} other {<2><3>{1}</3> personnes</2> ont aimé votre message.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Un sondage que vous avez créé ou auquel vous avez répondu est terminé." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Un sondage que vous avez créé est terminé." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Un sondage auquel vous avez répondu est maintenant terminé." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Un message auquel vous avez réagi a été modifié." + +#: src/components/notification.jsx:204 +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} a boosté et aimé votre réponse.} other {{account} a boosté et aimé votre message.}}} other {{account} a boosté et aimé {postsCount} de vos messages.}}} other {{postType, select, reply {<0><1>{0}</1> personnes </0> ont boosté et aimé votre réponse.} other {<2><3>{1}</3> personnes</2> ont boosté et aimé votre message.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} s'est inscrit·e." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} a signalé {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Connexions perdues avec <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Avertissement de modération" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Un·e administrateur·rice de <0>{from}</0> a suspendu <1>{targetName}</1>, ce qui signifie que vous ne pourrez plus recevoir ses mises à jour ou interagir avec lui." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "L’administration de <0>{from}</0> a bloqué <1>{targetName}</1>. Le blocage concerne {followersCount} de vos abonné⋅es et {followingCount} de vos abonnements." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Vous avez bloqué <0>{targetName}</0>. Le blocage concerne {followersCount} de vos abonné⋅es et {followingCount} de vos abonnements." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Votre compte a reçu un avertissement de modération." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Votre compte a été désactivé." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Certains de vos messages ont été marqués comme délicats." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Certaines de vos messages ont été supprimés." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Vos messages seront dorénavant marqués comme délicats." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Votre compte est restreint." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Votre compte a été suspendu." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Notification de type inconnu : {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Partagée par / Aimée par …" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Aimée par…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Partagé par…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Suivi par…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "En savoir plus <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Lire la suite →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "A voté" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# vote} other {# votes}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Masquer les résultats" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Voter" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Actualiser" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Montrer les résultats" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> votant} other {<1>{1}</1> votants}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Est clôturé <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Est clos" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Se termine <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Sera clos" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Spam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Liens malveillants, faux engagement ou réponses répétitives" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Illégal" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Viole la loi de votre pays ou celui du serveur" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Violation de règle du serveur" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Viole des règles spécifiques du serveur" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Infraction" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Autre" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Le problème ne correspond pas aux autres catégories" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Signaler le message" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Signaler @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "En attente de révision" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Message signalé" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Profil signalé" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Le message n’a pas pu être signalé" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Le profil n’a pas pu être signalé." + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Quel est le problème avec ce message ?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Quel est le problème avec ce profil ?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Informations complémentaires" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Transférer vers <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Envoyer le rapport" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Compte {username} masqué" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "{username} n’a pas pu être masqué." + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Signaler <0>+ Masquer le profil</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Compte {username} bloqué" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "{username} n’a pas pu être bloqué." + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Signaler <0>+ Bloquer le profil</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ comptes, hashtags et messages</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Messages avec <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Messages avec le mot-clé <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Rechercher <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Comptes avec <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Accueil / Abonnements" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Public (local / fédéré)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Compte" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Hashtag" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID de la liste" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Local uniquement" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instance" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Facultatif, par exemple “mastodon.social”" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Terme de recherche" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Facultatif, sauf pour le mode multicolonnes" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "ex : PixelArt (max 5, séparés par des espaces)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Média uniquement" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Raccourcis" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "bêta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Spécifiez une liste de raccourcis qui apparaîtront comme :" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Bouton flottant" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Onglet/Barre de menu" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Multi-colonnes" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Non disponible dans le mode d'affichage actuel" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Déplacer vers le haut" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Déplacer vers le bas" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Modifier" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Ajouter plus d'un raccourci/colonne pour que ceci puisse fonctionner." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Aucune colonne pour l'instant. Appuyez sur le bouton Ajouter." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Aucun raccourci pour le moment. Appuyez sur le bouton Ajouter un raccourci." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Vous ne savez pas quoi ajouter ?<0/>Essayez d'abord d'ajouter <1>Accueil / Abonnements et Notifications</1> ." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Maximum de colonnes {SHORTCUTS_LIMIT}" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Maximum de raccourcis {SHORTCUTS_LIMIT}" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importer/Exporter" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Ajouter une colonne…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Ajouter un raccourci…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "La liste spécifique est facultative. La liste est obligatoire pour le mode multi-colonnes, sinon la colonne ne sera pas affichée." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Pour le mode multi-colonnes, le terme de recherche est obligatoire, sinon la colonne ne sera pas affichée." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Plusieurs hashtags sont pris en charge. Séparés par des espaces." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Modifier le raccourci" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Ajouter un raccourci" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Fil d’actualité" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Liste" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importer/Exporter des <0>raccourcis</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importer" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Coller les raccourcis ici" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Chargement des raccourcis depuis votre instance…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Les raccourcis n’ont pas pu être chargés." + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Charger les raccourcis depuis votre instance" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Existe dans les raccourcis actuels" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "La liste pourrait ne pas fonctionner si elle provient d'un autre compte." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Format de paramètres non valide" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Remplacer les raccourcis actuels ?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Seuls les raccourcis qui n'existent pas dans les raccourcis actuels seront ajoutés." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Aucun nouveau raccourci à importer" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Raccourcis importés. Dépassement du maximum {SHORTCUTS_LIMIT}, donc les autres ne sont pas importés." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Raccourcis importés" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importer et ajouter…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Remplacer les raccourcis actuels ?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Importer les raccourcis ?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "ou remplacer…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importer…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exporter" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Raccourcis copiés" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Les raccourcis n’ont pas pu être copiés." + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Les paramètres des raccourcis ont été copiés" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Les paramètres de raccourcis n’ont pas pu être copiés." + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Partager" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Enregistrement des raccourcis sur votre instance…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Raccourcis enregistrés" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Les raccourcis n’ont pas pu être sauvegardés." + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Synchroniser avec votre instance" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0,plural, one{# caractère} other{# caractères}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Raccourcis JSON bruts" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importer/exporter les paramètres de/vers l'instance du serveur (très expérimental)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>a partagé</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Message de @{0} retiré des favoris" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Message de @{0} ajouté en favori" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Message de @{0} retiré des signets" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Message de @{0} ajouté aux signets" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Annuler le partage" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Citer" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Certains médias n'ont pas de descriptions." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Ancien message (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Partage du message de @{0} annulé" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Message de @{0} partagé" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Partager…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Retirer des favoris" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Ajouter en favori" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Retirer des signets" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Voir le message de <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Afficher l’historique des modifications" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Modifié : {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Intégrer le message" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "La discussion n'est plus masquée" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Conversation mise en silence" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "La conversation n’a pas pu être rétablie." + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "La conversation n’a pas pu être mise en sourdine." + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Ne plus masquer la discussion" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Mettre la conversation en sourdine" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Message détaché du profil" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Message épinglé au profil" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Le message n’a pas pu être détaché." + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Le message n’a pas pu être épinglé." + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Détacher de votre profil" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Épingler à votre profil" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Supprimer ce message ?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Message supprimé" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Le message n’a pas pu être supprimé." + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Signaler le message …" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Favori" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Partagé" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Signet" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Épinglé" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Supprimée" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# réponse} other {# réponses}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Fil{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Replier" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Afficher le contenu" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Afficher le média" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Modifié" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Commentaires" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Historique des modifications" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Échec du chargement de l'historique" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Chargement en cours…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "Code HTML" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Code HTML copié" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Le code HTML n’a pas pu être copié." + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Médias attachés :" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Émojis du compte :" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL statique" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Émojis :" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Remarques :" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Ceci est statique, non stylisé et sans script. Vous devrez peut-être appliquer vos propres styles et les modifier au besoin." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Les pièces jointes de média peuvent être des images, des vidéos, des audios ou tout autre type de fichier." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Le message pourrait être modifié ou supprimé plus tard." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Aperçu" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Remarque : Cet aperçu est légèrement stylisé." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> a partagé" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Nouveaux messages" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Essayez à nouveau" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# partage} other {# partages}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Messages épinglés" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Fils" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtré</0> : <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Traduit automatiquement depuis {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Traduction en cours…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Traduire à partir de {sourceLangText} (auto-détect)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Traduction depuis {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Auto ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "La traduction a échoué" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "En réponse à @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Cette page peut être fermée." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Fermer la fenêtre" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Connexion requise." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Retour à l’accueil" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Messages du compte" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Réponses)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (− Partages)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Média)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Effacer les filtres" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Effacer" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Voir le message avec les réponses" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Réponses" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Affichage des messages sans les partages" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "− Partages" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Afficher les messages avec médias" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Affichage des messages marqués avec #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Affichage des messages dans {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Rien à voir ici pour le moment." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Les messages n’ont pas pu être chargés." + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Les informations sur le compte n’ont pas pu être chargés." + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Basculer vers l'instance du compte {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Passer à mon instance (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Mois" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Actuel" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Par défaut" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Basculer vers ce compte" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Basculer dans un nouvel onglet/fenêtre" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Voir le profil…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Définir par défaut" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Se déconnecter de <0>@{0}</0> ?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Se déconnecter…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Ajouter un compte existant" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Aucuns signets pour le moment. Ajouter quelque chose comme signet !" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Les signets n’ont pas pu être chargés." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "dernière heure" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "les 2 dernières heures" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "3 dernières heures" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "4 dernières heures" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "5 dernières heures" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "6 dernières heures" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "7 dernières heures" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "8 dernières heures" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "9 dernières heures" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "10 dernières heures" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "11 dernières heures" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "12 dernières heures" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "12 dernières heures et plus" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Mots-clés suivis" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Groupes" + +#: 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 "{selectedFilterCategory, select, all {Tous types de messages} original {Messages originaux} replies {Messages de réponse} boosts {Partages} followedTags {Mots-clés suivis} groups {Groupes} filtered {Messages filtrés}}, {sortBy, select, createdAt {{sortOrder, select, asc {les plus vieux} desc {les plus récents}}} reblogsCount {{sortOrder, select, asc {les moins partagés} desc {les plus partagés}}} favouritesCount {{sortOrder, select, asc {les moins favoris} desc {les plus favoris}}} repliesCount {{sortOrder, select, asc {le moins de réponses} desc {le plus de réponses}}} density {{sortOrder, select, asc {les moins denses} desc {les plus denses}}}} en premier{groupBy, select, account {, groupé par personne} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Rattrapage <0>bêta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Aide" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "En savoir plus" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Le rattrapage est un fil d’actualité supplémentaire qui propose une vue d’ensemble pour rester à la page avec vos abonnements. Son interface est inspirée par les e-mails et vous permet de filtrer et trier les messages facilement." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Aperçu de l’interface de rattrapage" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "C’est parti" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Restez à la page avec vos abonnements." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Afficher tous les messages qui datent de…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "autant que possible" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Rattrapage" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "En commun avec votre rattrapage précédent" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Depuis le dernier rattrapage ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "À noter : il se peut que votre instance ne montre que 800 messages dans le fil d’actualité, plus ou moins, quelle que soit la tranche horaire choisie." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Précédemment…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# message} other {# messages}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Enlever ce rattrapage ?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Seulement trois rattrapages sont sauvegardés. Les autres seront automatiquement supprimés." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Chargement des messages…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Merci de patienter." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Réinitialiser les filtres" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Liens populaires" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Partagé par {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Tous" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# personne} other {# personnes}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Classer" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Date" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Densité" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Par personne" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Aucun" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Afficher tout le monde" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Pas la peine de tout lire." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "C’est tout !" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Remonter" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Ce sont les liens partagés par les personnes que vous suivez, classés selon leur nombre d’apparences, de partages et de favoris." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Classer par densité" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Classe les messages selon leur densité d’information. Les messages plus courts ou sans images sont plus “légers”, les messages plus longs ou avec des images sont plus “lourds”." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Groupé par personne" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Les messages sont regroupées par auteur·ice·s, triés par nombre de messages par auteur·ice." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Personne suivante" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Personne précédente" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Remonter" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtré : {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Les favoris n’ont pas pu être chargés." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Principal et listes" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Fils publics" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Discussions" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profils" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Jamais" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Nouveau Filtre" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtre} other {# filtres}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Les filtres n’ont pas pu être chargés." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Aucun filtre pour l'instant." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Ajouter un filtre" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Modifier le filtre" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Le filtre n’a pas pu être modifié." + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Le filtre n’a pas pu être créé" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Titre" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Mot entier" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Aucun mot clé. Ajoutez-en un." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Ajouter un mot clé" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# mot-clé} other {# mots-clés}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtrer depuis…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Pas encore implémentée" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Statut : <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Modifier l'expiration" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Expiration" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Les messages filtrés seront …" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimisé" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "masqué" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Supprimer ce filtre ?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Le filtre n’a pas pu être supprimé." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Expiré" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Expire <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "N’expire jamais" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# hashtag} other {# hashtags}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Les mot-clés suivis n’ont pas pu être chargés." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Aucun hashtag n'a encore été suivi." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Rien à voir ici." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Les messages n’ont pas pu être chargés." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (Média uniquement) sur {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} sur {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (Média uniquement)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Personne n'a encore publié de message avec ce mot croisillon." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Les messages avec ce mot-clé n’ont pas pu être chargés." + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Ne plus suivre #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Arrêt du suivi de #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Abonné·e à #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Suivre…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Retiré du profil" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Le mot-clé n’a pas pu être retiré du profil." + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Mis en avant sur votre profil" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Mettre en avant sur votre profil" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, other {Max # hashtags}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Ajoute un hashtag" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Retirer le hashtag" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {La limite de # raccourci a été atteinte. Le raccourci n’a pas pu être ajouté.} other {La limite de # raccourcis a été atteinte. Le raccourci n’a pas pu être ajouté.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Ce raccourci existe déjà" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Raccourci du hashtag ajouté" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Ajouter aux raccourcis" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Indiquer une nouvelle instance, par exemple “mastodon.social”" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Instance incorrecte" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Afficher une autre instance…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Afficher mon instance (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Les notification n’ont pas pu être chargées." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Nouvelle</0> <1>demande d'abonnement</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Tout voir" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Résolution en cours …" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "L’URL n’a pas été trouvée." + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Rien pour l’instant." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Gestion des membres" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Retirer <0>@{0}</0> de la liste ?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Retirer…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# liste} other {# listes}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Aucune liste pour le moment." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "domaine de l’instance" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "Par exemple “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Connexion échouée. Essayez à nouveau, ou avec une autre instance." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Continuer sur {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Continuer" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Pas de compte ? Créez-en un !" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Mentions privées" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privées" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Personne ne vous a mentionné :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Les mentions n’ont pas pu être chargées." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Que vous ne suivez pas" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Qui ne sont pas abonné·e·s à vous" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Ayant un nouveau compte" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Qui vous mentionnent en privé de façon inattendue" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Qui sont limité·e·s par les modérateur·rice·s du serveur" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Préférences des notifications" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Nouvelles notifications" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Annonce} other {Annonces}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Demandes d’abonnement" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# demande d'abonnement} other {# demandes d'abonnement}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Notifications filtrées provenant de # personne} other {Notifications filtrées provenant de # personnes}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Mentions seulement" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Aujourd’hui" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Vous avez tout rattrapé." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Hier" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Les notifications n’ont pas pu être chargées." + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Préférences de notification mises à jour" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Masquer les notifications provenant de gens :" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtrer" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignorer" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Mis à jour <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Voir les notifications de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Notifications de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Les notifications provenant de @{0} seront dorénavant masquées." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "La demande de notification n’a pas pu être acceptée" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Autoriser" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Les notifications provenant de @{0} ne s'afficheront plus dans les notifications filtrées, dorénavant." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "La demande de notification n’a pas pu être rejetée" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Rejeter" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Rejetée" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Fil local ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Fil fédéré ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Fil local" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Fil fédéré" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Personne n’a encore rien publié." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Basculer vers le fil fédéré" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Passer au fil local" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Recherche : {q} (Messages)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Recherche : {q} (Comptes)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Recherche : {q} (Hashtags)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Rechercher : {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Hashtags" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Voir plus" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Afficher plus de comptes" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Aucun compte trouvé." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Voir plus de hashtags" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Aucun hashtag trouvé." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Voir plus de messages" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Aucun message trouvé." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Entrez le terme recherché ou collez une URL ci-dessus pour commencer." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Paramètres" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Affichage" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Clair" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Sombre" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Auto" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Taille du texte" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Langue d'affichage" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Traductions bénévoles" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Publication" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Visibilité par défaut" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Synchronisé" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Échec de la mise à jour de la confidentialité du mode de publication" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Synchronisé avec les paramètres de votre serveur d'instance. <0>Allez à votre instance ({instance}) pour plus de paramètres.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Expérimentations" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Charger automatiquement les messages du fil d’actualité" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Carrousel des partages" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Traduction des messages" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Traduire vers" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Langue système ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, one {}=0 {Masquer le bouton \"Traduire\" pour:} other {Masquer le bouton \"Traduire\" pour (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Remarque : Cette fonctionnalité utilise des services de traduction externes, propulsés par <0>Lingva API</0> & <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Traduction automatique sur la même ligne" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Affiche automatiquement la traduction des messages sur le fil d’actualité. Ne fonctionne qu’avec les messages <0>courts</0> sans médias, ni sondages, ni avertissement de contenu." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Sélecteur de GIFs lors de la rédaction" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Générateur de description d'images" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Uniquement pour les nouvelles images lors de la rédaction de nouveaux messages." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Remarque : Cette fonction utilise un service IA externe, propulsé par <0>img-alt-api</0>. Peut ne pas fonctionner correctement. Seulement pour les images et en anglais." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Notifications groupées côté serveur" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Import/export \"Cloud\" pour les paramètres des raccourcis" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Très expérimental.<0/>Enregistré dans les notes personnelles de votre propre profil. Ces notes, privées, sont généralement utilisées sur les profils des autres, et masquées sur le votre." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Note : Cette fonction utilise l'API du serveur d'instance auquel vous êtes actuellement connecté." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Mode camouflage <0>(<1>Texte</1> → <2>█████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Masque le texte avec des rectangles, pratique pour prendre des captures d’écran de manière respectueuse de la vie privée." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "À propos" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Fait</0> par <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Parrain" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Faire un don" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Politique de confidentialité" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Site:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Version:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Texte de version copié" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Le numéro de version n’a pas pu être copié." + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "La mise à jour de l'abonnement a échoué. Veuillez réessayer." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "La suppression de l'abonnement a échoué. Veuillez réessayer." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Notifications Push (bêta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Les notifications push sont bloquées. Veuillez les activer dans les paramètres de votre navigateur." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Permettre depuis <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "tout le monde" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "personnes à lesquelles je suis abonné·e" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "abonné⋅es" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Abonnements" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Sondages" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Modifications du message" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "L'autorisation des notifications Push n'a pas été accordée depuis votre dernière connexion. Vous devrez <0><1>vous connecter</1> à nouveau pour accorder l'autorisation Push</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "NOTE : Les notifications Push ne fonctionnent que pour <0>un compte</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Vous n’êtes pas connecté⋅e. Les interactions telles que les réponses et les partages ne sont pas possibles." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Ce message provient d’une autre instance (<0>{instance}</0>). Les interactions telles que les réponses et les partages ne sont pas possibles." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Erreur : {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Basculer vers mon instance pour activer les interactions" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Les réponses n’ont pas pu être chargées." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Retour" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Aller au message principal" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} messages plus haut ‒ Remonter" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Passer en vue latérale" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Passer en vue pleine page" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Afficher tous les contenus sensibles" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Expérimental" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Impossible de basculer" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Basculer vers l'instance du message ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Basculer vers l'instance du message" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Le message n’a pas pu être chargé." + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# réponse} other {<0>{1}</0> réponses}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# commentaire} other {<0>{0}</0> commentaires}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Voir le message avec ses réponses" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Tendances ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Actualités en tendance" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Par {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Retour à l'affichage des messages en tendance" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Affichage des messages mentionnant <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Messages en tendance" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Pas de messages en tendance." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Un client Mastodon minimaliste et original." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Se connecter avec Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "S’inscrire" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Connectez votre compte Mastodon/Fédivers existant.<0/>Votre mot de passe ne sera pas enregistré sur ce serveur." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Fabriqué</0> par <1>@cheeaun</1>. <2>Politique de confidentialité</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Capture d’écran du carrousel des partages" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Carrousel des partages" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Distingue visuellement les messages de vos abonnements et les messages partagés." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Capture d’écran de commentaires imbriqués" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Commentaires imbriqués" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Facile de suivre les conversations. Commentaires semi-repliables." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Capture d’écran de notifications groupées" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Notifications groupées" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Les notifications similaires sont groupées et réduites pour éviter le désordre." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Capture d’écran de l’interface à plusieurs colonnes" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Une ou plusieurs colonnes" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Une seule colonne par défaut pour une ambiance zen. Plusieurs colonnes configurables pour les plus braves." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Capture d’écran du fil d’actualité à multiples mots-clés, avec un champs pour ajouter des mots-clés" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Fil d’actualité à mots-clés multiples" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Jusqu’à 5 mots-clés combinés dans un seul fil." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Il semblerait que votre navigateur bloque les fenêtres pop-up." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Un message en cours de rédaction est actuellement minimisé. Publiez ou annulez-le avant d’en rédiger un nouveau." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Un message est actuellement en cours de rédaction. Publiez ou annulez-le avant d’en rédiger un nouveau." + diff --git a/src/locales/gl-ES.po b/src/locales/gl-ES.po new file mode 100644 index 00000000..99f1960c --- /dev/null +++ b/src/locales/gl-ES.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: gl\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Galician\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: gl\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Bloqueada" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Publicacións: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Última publicación: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatizada" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Grupo" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Recíproco" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Solicitado" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Seguindo" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Séguete" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# seguidora} other {# seguidoras}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Verificada" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Creada <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Permanente" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Non se puido cargar a conta." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Ir á páxina da conta" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Seguidoras" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Publicacións" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Máis" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> informou de que agora a súa conta é:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Copiouse o identificador" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Non se puido copiar o identificador" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Copiar identificador" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Ir á páxina orixinal do perfil" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Ver imaxe do perfil" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Ver cabeceira do perfil" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "Lembranzas" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "A usuaria decidiu non ofrecer esta información." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} publicacións orixinais, {1} respostas, {2} promocións" + +#: 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 {A última publicación desde onte} other {A última publicación desde fai {2} días}}} other {{3, plural, one {As úlltimas {4} publicacións desde onte} other {As últimas {5} publicacións dos últimos {6} días}}}}" + +#: 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 publicación no último ano(s)} other {Últimas {1} publicacións no último ano(s)}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Orixinal" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Respostas" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Promocións" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Estatísticas non dispoñibles." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Ver estatísticas de publicación" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Última publicación: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Acalada" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Bloqueada" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Nota privada" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Mencionar a <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Traducir bio" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Editar nota privada" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Engadir nota privada" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Activadas as notificacións para as publicacións de @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Desactivadas as notificacións para as publicacións de @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Desactivar notificacións" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Activar notificacións" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Activadas as promocións de @{username}." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Desactivadas as promocións de @{username}." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Desactivar promocións" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Activar promocións" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Engadir/Retirar das Listas" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Copiouse a ligazón" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Non se puido copiar a ligazón" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Copiar" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Semella que non se pode compartir." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Compartir…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Reactivouse a @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Reactivar a <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Acalar a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Silenciaches a @{username} durante {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Non se puido silenciar a @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Quitar a <0>@{username}</0> das túas seguidoras?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "Retirouse a @{username} das seguidoras" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Retirar seguidora…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Bloquear a <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Desbloqueouse a @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Bloqueouse a @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Non se puido desbloquear a @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Non se puido bloquear a @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Desbloquear a <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Bloquear a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Denunciar a <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Editar perfil" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Retirar solicitude de seguimento?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Deixar de seguir a @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Deixar de seguir…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Retirar…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Seguir" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Pechar" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Traduciuse a Bio" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Non se puido retirar da lista." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Non se puido engadir á lista." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Non se puideron cargar as listas." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Sen listas." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nova lista" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Nota privada sobre <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Non se puido actualizar a nota privada." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Desbotar" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Gardar e pechar" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Non se puido actualizar o perfil." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nome" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Biografía" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Campos extra" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etiqueta" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Contido" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Gardar" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "nome de usuaria" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "dominio do servidor" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Desactivada a capa" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Capa activada" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Inicio" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Escribir" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Engadir multimedia" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Engadir emoji persoal" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Engadir GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Engadir enquisa" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Tes cambios sen gardar. Desbotas esta publicación?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {O ficheiro {1} non é compatible.} other {Os ficheiros {2} non son compatibles.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Só podes anexar un ficheiro.} other {Só podes anexar ata # ficheiros.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Despregar" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimizar" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Semella que fechaches a xanela nai." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Semella que xa tes aberto un cadro de edición na xanela nai e estase a publicar. Por favor agarda a que remate e inténtao outra vez máis tarde." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Semella que xa tes un cadro de edición aberto na xanela nai. Ao traelo a esta xanela desbotarás os cambios realizados na xanela nai. Queres continuar?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Restablecer" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Respondendo á publicación de @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Respondendo á publicación de @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Editando o contido da publicación" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "A enquisa ten que ter 2 opcións como mínimo" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Algunhas opcións da enquisa están baleiras" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Algún do multimedia non ten descrición. Queres continuar?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Fallou o anexo #{i}" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Aviso sobre o contido" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Aviso sobre o contido ou multimedia sensible" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Pública" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Local" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Fóra das listas" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Só para seguidoras" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Mención privada" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Publica a resposta" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Edita a publicación" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Que estás a facer?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Marcar o multimedia como sensible" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Engadir" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Responder" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Actualizar" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Publicar" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Descargando GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Fallou a descarga da GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Máis…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Cargada" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Descrición da imaxe" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Descrición do vídeo" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Descrición do audio" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Ficheiro demasiado grande. Podería haber problemas ao cargalo. Intenta reducir o tamaño de {0} a {1} ou inferior." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Tamaño demasiado grande. Podería dar problemas ao cargala. Intenta reducir o tamaño de {0}×{1}px a {2}×{3}px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Taxa de imaxes demasiado alta. Podería dar problemas ao cargalo." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Retirar" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Erro" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Editar descrición da imaxe" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Editar descrición do vídeo" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Editar descrición do audio" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Creando a descrición. Agarda…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Fallou a creación da descrición: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Fallou a creación da descrición" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Crear unha descrición…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Fallou a creación da descrición{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— experimental</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Feito" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Opción {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Varias opcións" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Duración" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Retirar enquisa" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Buscar contas" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Erro ao cargar as contas" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Emojis personais" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Buscar emoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Erro ao cargar os emojis personais" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Usados recentemente" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Outros" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} mais…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Buscar GIFs" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Proporcionado por GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Escribe para buscar GIFs" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Anterior" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Seguinte" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Erro ao cargar GIFs" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Borradores non enviados" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Semella que tes borradores sen enviar. Continuemos onde o deixaches." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Desbotar este borrador?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Erro ao desbotar o borrador! Inténtao outra vez." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Eliminar…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Erro ao obter o estado ao que responder!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Desbotar todos os borradores?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Erro ao eliminar os borradores! Inténtao outra vez." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Eliminar todo…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Non hai borradores." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Enquisa" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Multimedia" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Abrir nunha nova xanela" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Aceptar" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Rexeitar" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Aceptado" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Rexeitado" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Nada que mostrar" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Contas" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Mostrar máis…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Fin." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Atallos do teclado" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Axuda sobre atallos do teclado" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Seguinte publicación" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Publicación anterior" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Omitir carrusel e ir á seguinte publicación" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Maiús</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Omitir carrusel e ir á publicación anterior" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Maiús</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Cargar novas publicacións" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Abrir detalles da publicación" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> ou <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Despregar o aviso sobre o contido ou<0/>pregar/despregar os fíos" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Fechar publicación ou diálogos" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> or <1>Retroceso</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Foco na columna no modo con varias columnas" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> a <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Foco na seguinte columna no modo multi-columna" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Foco na columna anterior no modo multi-columna" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Escribir nova publicación" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Escribir nova publicación (nova xanela)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Maiús</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Enviar publicación" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> ou <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Buscar" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Responder (nova xanela)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Maiús</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Favorecer (favorita)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> ou <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Promover" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Maiús</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Marcar" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Cambiar o Modo Capa" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Maiús</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Editar lista" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Non se puido editar a lista." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Non se puido crear a lista." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Mostrar respostas a membros da lista" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Mostrar respostas a persoas que sigo" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Non mostrar respostas" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Nesta lista, agochar as publicacións que están en Inicio/Seguindo" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Crear" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Eliminar esta lista?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Non se puido eliminar a lista." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Descrición do multimedia" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Traducir" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Falar" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Abrir multimedia orixinal nunha nova xanela" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Abrir multimedia orixinal" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Intentando describir a imaxe. Agarda…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Non se puido describir a imaxe" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Describir a imaxe…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Ver publicación" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Multimedia sensible" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtrado: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrado" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Publicouse a mensaxe. Compróbao." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Publicouse a resposta. Compróbao." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Actualizouse a publicación. Compróbao." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menú" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Volver cargar a páxina para actualizar?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nova actualización dispoñible…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Ponte ao día" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Mencións" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Notificacións" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Novidade" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Perfil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Marcadores" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Favorecementos" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Cancelos seguidos" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtros" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Usuarias acaladas" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Usuarias acaladas…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Usuarias bloqueadas" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Usuarias bloqueadas…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Contas…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Acceder" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "En voga" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federada" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Atallos / Columnas…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Axustes…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Listas" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Todas as Listas" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Notificación" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Esta notificación procede de outra conta." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Ver todas as notificacións" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} reaccionou á túa publicación con {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} enviou unha publicación." + +#: src/components/notification.jsx:85 +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} promoveu a túa resposta.} other {{account} promoveu a túa publicación.}}} other {{account} promoveu {postsCount} das túas publicacións.}}} other {{postType, select, reply {<0><1>{0}</1> persoas</0> promoveron a túa resposta.} other {<2><3>{1}</3> persoas</2> promoveron a túa publicación.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, one {}=1 {{account} seguiute.} other {<0><1>{0}</1> persoas</0> seguíronte.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} solicitou seguirte." + +#: src/components/notification.jsx:151 +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 {a {account} gustoulle a túa resposta.} other {a {account} gustoulle a túa publicación.}}} other {a {account} gustoulle {postsCount} das túas publicacións.}}} other {{postType, select, reply {a <0><1>{0}</1> persoas</0> gustoulle a túa resposta.} other {a <2><3>{1}</3> persoas</2> gustoulle a túa publicación.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Finalizou unha enquisa que ti creaches o na que votaches." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Finalizou unha enquisa que creaches." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Finalizou unha enquisa na que votaches." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Editouse unha publicación coa que interactuaches." + +#: src/components/notification.jsx:204 +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} gustoulle e promoveu a túa resposta.} other {{account} gustoulle e promoveu a túa publicación.}}} other {a {account} gustoulle e promoveu {postsCount} das túas publicacións.}}} other {{postType, select, reply {a <0><1>{0}</1> persoas</0> gustoulle e promoveron a túa resposta.} other {a <2><3>{1}</3> persoas</2> gustoulle e promoveron a túa publicación.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} creou a conta." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} denunciou a {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Conexións perdidas con <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Aviso da Moderación" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "A administración de <0>{from}</0> suspendeu a <1>{targetName}</1>, xa que logo non vas recibir actualizacións desa conta ou interactuar con ela." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "A administración de <0>{from}</0> bloqueou a <1>{targetName}</1>. Seguidoras afectadas: {followersCount}; seguimentos: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Bloqueaches a <0>{targetName}</0>. Seguidoras eliminadas: {followersCount}; seguimentos: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "A túa conta recibeu unha advertencia da moderación." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "A túa conta foi desactivada." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Algunha das túas publicacións foron marcadas como sensibles." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Algunha das túas publicacións foron eliminadas." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "De agora en diante as túas publicacións van ser marcadas como sensibles." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "A túa conta foi limitada." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "A túa conta foi suspendida." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Tipo de notificación descoñecido: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Promovida/Favorecida por…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Favorecida por…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Promovida por…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Seguida por…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Saber mais <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Ler mais →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Xa votaches" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# voto} other {# votos}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Agochar resultados" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Votar" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Actualizar" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Mostrar resultados" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> voto} other {<1>{1}</1> votos}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> votante} other {<1>{1}</1> votantes}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Finalizou <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Finalizou" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Finaliza en <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Finaliza" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Spam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Ligazóns maliciosas, relacións engañosas, ou respostas repetitivas" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Ilegalidade" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Viola as leis do país do servidor" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Violación das regras do servidor" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Contravén as regras propias do servidor" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Violación" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Outra" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "O problema non cae en ningunha das categorías" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Denunciar Publicación" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Denunciar a @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Pendente de revisión" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Publicación denunciada" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Perfil denunciado" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Non se puido denunciar a publicación" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Non se puido denunciar ao perfil" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Cal é o problema con esta publicación?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Cal é o problema con este perfil?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Info adicional" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Reenviar a <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Enviar Denuncia" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Silenciou a {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Non se puido acalar a {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Enviar Denuncia <0>+Silenciar perfil</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Bloqueouse a {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Non se puido bloquear a {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Enviar Denuncia <0>+ Bloquear o perfil</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ contas, cancelos e publicacións</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Publicacións con <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Publicacións co cancelo <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Busca de <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Contas con <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Inicio / Seguindo" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Pública (Local / Federada)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Conta" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Cancelo" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID da lista" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Só local" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instancia" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Optativo, ex. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Termo a buscar" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Optativo, a non ser para o modo de varias columnas" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "ex. PixelArt (Máx 5, separado por espazos)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Só multimedia" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Atallos" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Indicar unha lista de atallos que aparecerán como:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Botón flotante" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Barra con Menú/Pestana" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Varias columnas" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Non dispoñible coa visualización actual" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Ir arriba" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Ir abaixo" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Editar" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Engadir máis de un atallo/columna para que isto funcione." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Aínda non hai columnas. Toca no botón Engadir columna." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Aínda non hai atallos. Toca no botón Engadir atallo." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Non sabes que engadir?<0/>Intenta engadir <1>Inicio / Seguindo e Notificacións</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Máx {SHORTCUTS_LIMIT} columnas" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Máx {SHORTCUTS_LIMIT} atallos" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importar/exportar" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Engadir columna…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Engadir atallo…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "É opcional seleccionar unha lista. No modo de varias columnas hai que indicar unha, se non non se mostrará." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "No modo de varias columnas, requírese unha palabra a buscar, se non a columna no se vai mostrar." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Hai compatibilidade para varios cancelos, separados por espazos." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Editar atallo" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Engadir atallo" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Cronoloxía" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Lista" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importar/Exportar <0>Atallos</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importar" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Pega aquí os atallos" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "A descargar os atallos gardados desde o servidor da instancia…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Non se puideron descargar os atallos" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Descargar atallos desde o servidor da instancia" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Existe nos atallos actuais" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "A lista podería non funcionar se procede de outra conta." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "O formato dos axustes non é válido" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Engadir aos atallos actuais?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Só se engadirán os atallos que non existan nos atallos actuais." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Non hai atallos que importar" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Importáronse os atallos. Excedeuse o máximo de {SHORTCUTS_LIMIT}, así que o resto non se importaron." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Atallos importados" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importar e engadir…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Sobrescribir os atallos actuais?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Importar os atallos?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "ou sobrescribir…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importar…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exportar" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Copiáronse os atallos" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Non se puideron copiar os atallos" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Copiáronse os axustes do atallo" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Non se puideron copiar os axustes do atallo" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Compartir" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "A gardar os atallos no servidor da instancia…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Gardáronse os atallos" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Non se puideron gardar os atallos" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sincronizar co servidor da instancia" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# caracter} other {# caracteres}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Atallos en formato JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importar/exportar os axustes de/para o servidor da instancia (moi experimental)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>promoveu</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Sentímolo pero a instancia na que iniciaches sesión non pode interactuar coa publicación desde outra instancia." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Retirado o favorecemento a @{0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Favorecida a publicación de @{0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Desmarcouse a publicación de @{0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Marcouse a publicación de @{0}" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Retirar promoción" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Cita" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Algún multimedia non ten descrición." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Publicación antiga (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Retirou a promoción da publicación de @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Promoveu a publicación de @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Promover…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Xa non me gusta" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Gústame" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Retirar marcador" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Ver publicación de <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Mostrar historial de edicións" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Editada: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Inclúe a publicación" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Conversa reactivada" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Conversa acalada" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Non se puido reactivar a conversa" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Non se puido acalar a conversa" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Reactivar a conversa" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Acalar conversa" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Desprendeuse do perfil a publicación" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Publicación fixada ao perfil" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Non se puido desprender a publicación" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Non se puido fixar a publicación" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Soltar do perfil" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Fixar no perfil" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Eliminar publicación?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Eliminouse a publicación" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Non se puido eliminar a publicación" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Denunciar publicación…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Favorecida" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Promovida" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Marcada" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Fixada" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Eliminada" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# resposta} other {# respostas}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Fío{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Ver menos" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Mostrar contido" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Mostrar multimedia" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Editada" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Comentarios" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Mais de <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Editar Historial" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Fallou a carga do historial" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "A cargar…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "Código HTML" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Copiouse o código HTML" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Non se puido copiar o código HTML" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Anexos multimedia:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Emojis da conta:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL estático" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojis:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notas:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Isto é contido estático, sen estilo nin scripts. Pode que teñas que aplicar o teu propio estilo e adaptalo ás necesidades." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "As enquisas non son interactivas, convértese nunha lista con conta dos votos." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "O multimedia anexo poden ser imaxes, vídeos, audios ou varios tipos de ficheiros." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "A publicación pode editarse ou eliminarse con posterioridade." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Vista previa" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Nota: a vista previa está lixeiramente editada." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> promoveu" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Novas publicacións" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Inténtao outra vez" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Promoción} other {# Promocións}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Publicacións fixadas" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Fío" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtrado</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Tradución automática desde o {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "A traducir…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Traducir do {sourceLangText} (detección automática)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Traducir do {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Auto ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Fallou a tradución" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "A editar o contido do estado" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "En resposta a @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Xa podes fechar esta páxina." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Fechar xanela" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Precisa acceder." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Ir ao inicio" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Publicacións da conta" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Respostas)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Promocións)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Multimedia)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Limpar filtros" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Limpar" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Mostrando publicacións con resposta" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Respostas" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Mostrando publicacións sen promocións" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Promocións" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Mostrando publicacións con multimedia" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Mostrando publicacións etiquetadas con #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Mostando publicacións en {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Aínda non hai nada que ver." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Non se puideron cargar as publicacións" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Non se puido obter a información da conta" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Cambiar á instancia da conta {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Cambiar á miña instancia (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Mes" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Actual" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Por defecto" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Cambiar a esta conta" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Cambiar en nova pestana/xanela" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Ver perfil…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Establecer por defecto" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Pechar a sesión de <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Fechar sesión…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Engadir unha conta existente" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Nota: A conta <0>por defecto</0> sempre será a que se mostre ao iniciar. O cambio de conta manterase durante a sesión." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Non tes marcadores, vai mirar e garda o que che interese!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Non se cargaron os marcadores." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "última hora" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "últimas 2 horas" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "últimas 3 horas" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "últimas 4 horas" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "últimas 5 horas" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "últimas 6 horas" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "últimas 7 horas" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "últimas 8 horas" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "últimas 9 horas" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "últimas 10 horas" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "últimas 11 horas" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "últimas 12 horas" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "máis de 12 horas" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Cancelos seguidos" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Grupos" + +#: 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 "Móstrase {selectedFilterCategory, select, all {todas as publicacións} original {publicacións orixinais} replies {respostas} boosts {promocións} followedTags {cancelos seguidos} groups {grupos} filtered {publicacións filtradas}}, {sortBy, select, createdAt {{sortOrder, select, asc {máis antigo} desc {máis recente}}} reblogsCount {{sortOrder, select, asc {con menos promocións} desc {con máis promocións}}} favouritesCount {{sortOrder, select, asc {con menos favorecementos} desc {con máis favorecementos}}} repliesCount {{sortOrder, select, asc {con menos respostas} desc {con máis respostas}}} density {{sortOrder, select, asc {menor densidade} desc {maior densidade}}}} primeiro{groupBy, select, account {, agrupado por autoría} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Ponte ao día <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Axuda" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Que é isto?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Ponte ao Día é unha cronoloxía separada para os teus seguimentos onde obter unha visión rápida e doada do publicado, cunha interface inspirada na do correo electrónico para organizar e filtrar as publicacións." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Vista previa da interface de Ponte ao día" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Poñámonos ao día" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Vexamos o que publicaron as persoas que segues." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Móstrame todas as publicacións das…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "o máximo" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Obter" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Entraría na túa última posta ao día" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Ata a última posta ao día ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Nota: pode que a túa instancia mostre un máximo de 800 publicacións na cronoloxía de Inicio independentemente do tempo que marques. Podería variar." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Anteriormente…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# publicación} other {# publicacións}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Retirar esta posta ao día?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Retirar Ponte ao Día {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Eliminouse o Ponte ao Día {0}" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Nota: só se gardan 3 postas ao día. O resto elimínanse automaticamente." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Obtendo as publicacións…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Podería levarlle un anaco." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Restablecer filtros" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "O máis compartido" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Compartido por {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Todo" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# autora} other {# autoras}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Orde" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Data" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Densidade" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autoría" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Ningún" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Mostra todas as autoras" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Non tes que ler todo." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Isto é todo." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Volver arriba" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Ligazóns compartidas polos teus seguimentos, organizados por contas compartidas, promocións e favorecementos." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Orde: Densidade" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "As publicacións están ordenadas pola densidade de información, pola cantidade relativa. As publicacións curtas son «lixeiras» mentres que as máis longas «pesan máis». As publicacións con fotos «pesan máis» que as que non as teñen." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Agrupar: Autoría" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "As publicacións están agrupadas pola autoría, e ordenadas por número de publicacións por autora." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Seguinte autora" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Autora anterior" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Ir arriba" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtrado: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Sen favoritas. Reparte ❤️! " + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Non se cargaron os favorecementos." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Inicio e listas" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Cronoloxías públicas" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Conversas" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Perfís" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Nunca" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Novo filtro" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtro} other {# filtros}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Non se cargaron os filtros." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Aínda non hai filtros." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Engadir filtro" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Editar filtro" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Non se puido editar o filtro" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Non se puido crear o filtro" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Título" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Palabra completa" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Sen palabras chave. Engade unha." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Engadir palabra chave" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# palabra chave} other {# palabras chave}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtro desde…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Aínda non se aplicou" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Estado: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Cambiar a caducidade" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Caducidade" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "A publicación filtrada será…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimizadas" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "agochadas" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Eliminar este filtro?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Non se puido eliminar o filtro." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Finalizou" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Finaliza en <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Non finaliza" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# cancelo} other {# cancelos}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Non se puideron cargar os cancelos seguidos." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Aínda non segues ningún cancelo." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Non hai nada que ver aquí." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Non se puideron cargar as publicacións." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (Só multimedia) en {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} en {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (Só multimedia)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Ninguén publicou usando este cancelo por agora." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Non se puideron cargar publicacións con este cancelo" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Deixar de seguir #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Retirouse o seguimento a #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Seguiches a #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Seguindo…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Non se mostra no perfil" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Non se retirou dos destacados no perfil" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Destacado no perfil" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Destacar no perfil" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {}other {Máx # cancelos}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Engadir cancelo" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Retirar cancelo" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Acadouse o máx. de # atallo. Non se puido engadir outro.} other {Acadouse o máx. de # atallos. Non se puido engadir outro.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Xa existe este atallo" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Engadiuse o atallo ao cancelo" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Engadir a Atallos" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Escribe unha nova instancia, ex. \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Instancia non válida" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Ver outra instancia…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Ir á miña instancia (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Non se obtiveron as notificacións." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Nova</0> <1>Solicitude de Seguimento</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Ver todo" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Resolvendo…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Non se puido resolver o URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Nada por aquí." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Xestionar membros" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Retirar a <0>@{0}</0> da lista?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Retirar…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# lista} other {# listas}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Sen listas por agora." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Fallou o rexistro da aplicación" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "dominio da instancia" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "ex. \"mastodon.social\"" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Erro ao acceder. Inténtao outra vez ou cambiando de instancia." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Continuar con {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Continuar" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Non tes unha conta? Crea unha!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Mencións privadas" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privadas" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Ninguén te mencionou :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Non se cargaron as mencións." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Non estás a seguir" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Que non te segue" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Cunha nova conta" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Con mención privada non solicitada" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Que está limitada pola moderación do servidor" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Axustes das notificacións" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Novas notificacións" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Anuncio} other {Anuncios}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Solicitudes de seguimento" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# solicitude de seguimento} other {# solicitudes de seguimento}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Notificacións filtradas de # persoa} other {Notificacións filtradas de # persoas}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Só mencións" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Hoxe" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Xa estás ao día." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Onte" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Non se cargaron as notificacións" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Actualizáronse os axustes das notificacións" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Filtrar as notificacións de persoas:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtrar" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignorar" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Acutalizado <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Ver notificacións de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Notificacións de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "A partir de agora non se filtrarán as notificacións de @{0}." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Non se puido aceptar a solicitude de notificación" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Permitir" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "A partir de agora non se mostrarán as notificacións de @{0} nas Notificacións filtradas." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Non se puido desbotar a solicitude de notificación" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Desbotar" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Desbotada" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Cronoloxía local ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Cronoloxía federada ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Cronoloxía local" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Cronoloxía federada" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Ningén publicou nada por agora." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Cambiar á Federada" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Cambiar á Local" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Buscar: {q} (Publicacións)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Buscar: {q} (Contas)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Buscar: {q} (Cancelos)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Buscar: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Cancelos" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Ver máis" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Ver máis contas" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Non se atopan contas." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Ver máis cancelos" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Non se atopan cancelos." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Ver máis publicacións" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Non hai publicacións." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Escribe o que queres buscar ou pega un URL na caixa de busca." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Axustes" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Aparencia" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Claro" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Escuro" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Auto" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Tamaño da letra" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Idioma da interface" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Traducida por voluntarias" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Ao publicar" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Visibilidade por defecto" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Sincronizado" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Erro ao actualizar a privacidade ao publicar" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Sincronizado cos axustes do servidor da túa instancia. <0>Vai á túa instancia ({instance}) para realizar máis axustes.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Experimentos" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Actualización automática das cronoloxías" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Carrusel de promocións" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Tradución das publicacións" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Traducir ao" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Idioma do sistema ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, one {}=0 {Ocultar o botón \"Traducir\" para:} other {Ocultar o botón \"Traducir\" para (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Nota: esta ferramenta usa servizos externos para traducir, depende de <0>Lingva API</0> e <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Tradución automática en liña" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Mostra automaticamente na cronoloxía a tradución das publicacións. Só funciona para publicacións <0>curtas</0> sen aviso sobre o contido, multimedia ou enquisa." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Selector de GIF para o editor" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Nota: Esta ferramenta usa un servizo externo para buscar GIF, proporcionado por <0>GIPHY</0>. G-rated (axeitado para todas as idades), quítanse todos os parámetros de seguimento, omítese na solicitude a información da orixe da mesma, pero os termos da consulta e o enderezo IP acadan igualmente o seu servidor." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Xerador da descrición de imaxes" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Só para novas imaxes ao redactar novas publicacións." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Nota: esta ferramenta usa un servizo de IA externo, proporcionado por <0>img-alt-api</0>. Pode que non funcione moi ben. Só para imaxes e en Inglés." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Notificacións agrupadas polo servidor" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Característica en fase Alpha. Mellora potencial no agrupamento cunha lóxica básica para agrupar." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Importar/exportar na \"Nube\" os axustes dos atallos" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Moi experimental.<0/>Gárdase nas notas do teu propio perfil. As notasdo perfil (privadas) normalmente úsanse para outras contas e están ocultas no teu perfil." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Nota: Esta ferramenta usa a API do servidor da instancia con sesión iniciada actualmente." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Modo Capa <0>(<1>Texto</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Substitúe texto por bloques, útil para facer capturas de pantalla, por privacidade." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Sobre" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Creado</0> por <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Patrocinios" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Doar" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Política de Privacidade" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Web:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versión:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Copiouse o número de versión" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Non se copiou a cadea coa versión" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Fallou a actualización da subscrición. Inténtao outra vez." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Fallou a retirada da subscrición. Inténtao outra vez." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Notificacións Push (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "As notificacións Push están bloqueadas. Actívaas nos axustes do teu navegador." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Permitir de <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "calquera" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "persoas que sigo" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "seguidoras" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Segue" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Enquisas" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Edicións de publicacións" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Non se concedeu o permiso para Push desde o último acceso. Terás que <0><1>acceder</1> outra vez para conceder o permiso</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "NOTA: As notificacións Push só funcionan para <0>unha conta</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Non iniciaches sesión. Non é posible interactuar (responder, promover, etc)." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Esta publicación procede de outra instancia (<0>{instance}</0>). Non é posible interaccionar (responder, promover, etc)." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Erro: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Cambiar á miña instancia para poder interactuar" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Non se puideron cargar as respostas." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Atrás" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Ir á publicación principal" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} publicacións máis arriba ― Ir arriba" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Cambiar a Vista Lateral con detalle" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Cambiar a Vista completa" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Mostrar todo o contido sensible" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Experimental" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Non se puido cambiar" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Cambiar á instancia ({0}) da publicación" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Cambiar á instancia da publicación" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Non se puido cargar a publicación" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# resposta} other {<0>{1}</0> respostas}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# comentario} other {<0>{0}</0> comentarios}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Ver publicación coas suas respostas" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "En voga en ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Novas populares" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Por {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Volver a mostrar publicacións populares" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "A mostrar publicacións que mencionan <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Publicacións populares" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Sen publicacións en voga." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Un cliente web minimalista para Mastodon que fai as cousas ao seu xeito." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Accede con Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Crear conta" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Conecta a túa conta Mastodon/Fediverso. <0/>As credenciais non se gardan neste servidor." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Creado</0> por <1>@cheeaun</1>. <2>Política de Privacidade</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Captura de pantalla do Carrusel de Promocións" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Carrusel de Promocións" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Separa visualmente as publicacións orixinais daquelas que foron compartidas (publicacións promovidas)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Captura de pantalla dos comentarios agrupados do fío" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Fío cos comentarios agrupados" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Sigue as conversas fácilmente. Respostas semicontraídas." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Captura de pantalla das notificacións agrupadas" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Notificacións agrupadas" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "As notificacións que se parecen agrúpanse e contráense para reducir o barullo." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Captura de pantalla da interface con varias columnas" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Unha ou Varias columnas" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Para quen busca tranquilidade, por defecto só temos unha columna. Se o precisas podes engadir varias." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Captura de pantalla dunha cronoloxía con varios cancelos co formulario para engadir máis cancelos" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Cronoloxía con varios cancelos" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Podes combinar ata 5 cancelos na mesma cronoloxía." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Semella que o teu navegador está a bloquear xanelas emerxentes." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Actualmente hai un borrador minimizado. Publícao ou desbótao antes de crear un novo." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Actualmente hai unha publicación aberta. Publícaa ou desbótaa antes de crear unha nova." + diff --git a/src/locales/he-IL.po b/src/locales/he-IL.po new file mode 100644 index 00000000..01139eb8 --- /dev/null +++ b/src/locales/he-IL.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: he\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Hebrew\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: he\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "הודעות: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "בוט" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "קבוצה" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "הדדי" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "הצטרף ב-<0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "לתמיד" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "" + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "אל דף החשבון" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "הודעות" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "עוד" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "אל עמוד הפרופיל המקורי" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "הצגת תמונת פרופיל" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "" + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "מקור" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "תגובות" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "הדהודים" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "" + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "הצגת סטטיסטיקה" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "מושתק" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "חסום" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "הודעה פרטית" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "אזכור של <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "עריכת הודעה פרטית" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "הוספת הערה פרטית" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "ההתראות על הודעות של @{username} מאופשרות." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "ההתראות על הודעות של @{username} מכובות." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "כיבוי התראות" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "אפשור התראות" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "הדהודים מ@{username} מאופשרים." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "הדהודים מ@{username} מכובים." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "הוספה/הסרה מרשימות" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "הקישור הועתק" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "" + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "שיתוף…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "עריכת פרופיל" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "לבטל את בקשת העקיבה?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "לעקוב" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "אין רשימות." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "רשימה חדשה" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "ביטול" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "שמירה וסגירה" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "" + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "שדות נוספים" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "שמירה" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "הוספת אימוג׳י מיוחד" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 "" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "מזעור" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "בתגובה להודעה של @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "בתגובה להודעה של @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "סקר צריך לכלול לפחות שתי אפשרויות" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "יש בסקר אפשרויות ריקות" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "פומבי" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "לעוקבים בלבד" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "הוספה" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "עוד…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "תיאור תמונה" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "תיאור סרטון" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "תיאור שמע" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "תקלה" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "בחירה מרובה" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "הסרת סקר" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "חיפוש חשבונות" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "תקלה בטעינת חשבונות" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "אימוג׳י מיוחדים" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "חיפוש אימוג׳י" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "תקלה בטעינת אימוג׳י מיוחדים" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "בשימוש לאחרונה" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "חיפוש גיפים" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "פועל בעזרת GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "תקלה בטעינת גיפים" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "טיוטות שלא נשלחו" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "למחוק את הטיוטה?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "תקלה במחיקת הטיוטה! אנא נסו שנית." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "מחיקה…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "תקלה במחיקת הטיוטות! אנא נסו שנית." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "טעינת הודעות חדשות" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "פתיחת פרטי ההודעה" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "מיקוד בעמודה במסגרת תצוגת עמודות" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "כתיבת הודעה חדשה" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "חיפוש" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "חיבוב" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "הדהוד" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "עריכת רשימה" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "למחוק את הרשימה?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "תרגום" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "הצגת הודעה" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "תפריט" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "יש גרסה חדשה זמינה…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "התראות" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "פרופיל" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "חשבונות…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "התחברות" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "הגדרות…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "" + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "מזהה רשימה" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "לא חובה; לדוגמה hed.im" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "לא חובה, מלבד עבור תצוגת עמודות" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "עמודות" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "אין חובה לציין רשימה מסויימת. עבור תצוגת עמודות יש צורך ברשימה, אחרת העמודה לא תוצג." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "עבור תצוגת עמודות יש צורך במילות חיפוש, אחרת העמודה לא תוצג." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "אימוג׳י של החשבון:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "אימוג׳י:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "השיבו ל־@{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "" + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "תקלה: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "צילום מסך של ממשק עמודות" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "עמודה אחת או עמודות מרובות" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/it-IT.po b/src/locales/it-IT.po new file mode 100644 index 00000000..ef27c14c --- /dev/null +++ b/src/locales/it-IT.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: it\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Italian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Privato" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Post: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Ultimo post: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatizzato" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Gruppo" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Reciproci" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Richiesta inviata" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Seguiti" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Ti segue" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# seguace} other {# seguaci}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Verificato" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Iscritto <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Per sempre" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Impossibile caricare account." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Vai alla pagina dell'account" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Seguaci" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "following.stats" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Post" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Altro" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> ha comunicato che il suo nuovo account è ora:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Nome utente copiato" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Impossibile copiare nome utente" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Copia nome utente" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Vai alla pagina del profilo originale" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Visualizza immagine di profilo" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Visualizza immagine di copertina" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "In memoriam" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "L'utente ha deciso di non condividere questa informazione." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} post originali, {1} risposte, {2} reblog" + +#: 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 {Ultimo post nell'ultimo giorno}other {Ultimo post negli ultimi {2} giorni}}} other {{3, plural,one {Ultimi {4} post nell'ultimo giorno} other {Ultimi {5} post negli ultimi {6} giorni}}}}" + +#: 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 {Ultimo post nell'ultimo anno(i)} other {Ultimi {1} post nell'ultimo anno(i)}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Originale" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Risposte" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Reblog" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Statistiche post non disponibili." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Visualizza statistiche post" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Ultimo post: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Silenziato" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Bloccato" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Nota privata" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Menziona <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Traduci bio" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Modifica nota privata" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Aggiungi nota privata" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Notifiche attivate per i post di @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Notifiche disattivate per i post di @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Disattiva notifiche" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Attiva notifiche" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Reblog da @{username} abilitati." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Reblog da @{username} disattivati." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Disattiva reblog" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Abilita reblog" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Aggiungi/rimuovi da liste" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Link copiato" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Impossibile copiare link" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Copia" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "La condivisione non sembra funzionare." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Condividi…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "@{username} riattivato" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Riattiva <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Silenzia <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Hai silenziato @{username} per {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Impossibile silenziare @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Rimuovere <0>@{username}</0> dai seguaci?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} rimosso dai seguaci" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Rimuovi seguace…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Bloccare <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "@{username} sbloccato" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} bloccato" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Impossibile sbloccare @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Impossibile bloccare @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Sblocca <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Blocca <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Segnala <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Modifica profilo" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Ritirare richiesta di seguire?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Smettere di seguire @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Smetti di seguire…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Ritira…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Segui" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Chiudi" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Bio tradotta" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Impossibile rimuovere da lista." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Impossibile aggiungere alla lista." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Impossibile caricare lista." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Nessuna lista." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nuova lista" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Nota privata su <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Impossibile aggiornare nota privata." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Annulla" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Salva e chiudi" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Impossibile aggiornare profilo." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nome" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Bio" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Campi extra" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etichetta" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Contenuto" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Salva" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "nome utente" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "nome dominio del server" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Modalità mantello disattivata" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Modalità mantello attivata" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Home" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Componi" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Aggiungo emoji personalizzata" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Aggiungi sondaggio" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Ci sono modifiche non salvate. Scartare il post?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {Il file {1} non è supportato.} other {I file {2} non sono supportati.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Puoi allegare fino a 1 documento.} other {Puoi allegare fino a # documenti.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Scollega" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Contrai" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Sembra tu abbia chiuso la finestra genitore." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Sembra tu abbia già un campo di composizione aperto nella finestra genitore e sia in fase di pubblicazione. Attendi il completamento e riprova." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Sembra che tu abbia già un campo di composizione aperto nella finestra principale. Far apparire questa finestra eliminerà le modifiche effetuate nella finestra principale. Vuoi proseguire?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Collega" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "In risposta al post di @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "In risposta al post di @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Modificando post originale" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Il sondaggio deve avere almeno 2 opzioni" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Alcune scelte del sondaggio sono vuote" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Alcuni media sono senza descrizione. Continuare?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Allegato #{i} fallito" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Avviso contenuto" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Avviso contenuto o media sensibili" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Pubblico" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Locale" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Non in lista" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Solo seguaci" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Menzione privata" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Pubblica la tua risposta" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Modifica il tuo post" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Che stai facendo?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Contrassegna media come sensibili" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Aggiungi" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Rispondi" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Aggiorna" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Pubblica" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Scarico GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Download GIF fallito" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Altro…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Caricato" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Descrizione immagine" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Descrizione video" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Descrizione audio" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "File troppo pesante. Il caricamento potrebbe riscontrare degli errori. Prova a ridurre la dimensione del file da {0} a {1} o meno." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Dimensioni eccessive. Il caricamento potrebbe riscontrare degli errori. Prova a ridurre le dimensioni da {0}×{1}px a {2}×{3}px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Frequenza fotogrammi troppo alta. Il caricamento potrebbe riscontrare degli errori." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Rimuovi" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Errore" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Modifica descrizione immagine" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Modifica descrizione video" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Modifica descrizione audio" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Genero descrizione. Attendere…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Generazione descrizione fallita: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Generazione descrizione fallita" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Genera descrizione…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Generazione descrizione fallita: {0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— sperimentale</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Fine" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Opzione {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Scelta multipla" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Durata" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Rimuovi sondaggio" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Cerca account" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Errore caricamento account" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Emoji personalizzate" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Cerca emoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Errore caricamento emoji personalizzate" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Usate di recente" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Altri" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} altri…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Cerca GIF" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Fornito da GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Scrivi per cercare GIF" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Indietro" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Avanti" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Errore caricamento GIF" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Bozze in sospeso" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Sembra tu abbia delle bozze non inviate. Riprendiamo da lì." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Eliminare questa bozza?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Errore nell'eliminazione della bozza! Riprova." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Elimina…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Errore nel recupero dello stato rispondi-a!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Eliminare tutte le bozze?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Errore nell'eliminazione delle bozze! Riprova." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Elimina tutte…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Nessuna bozza." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Sondaggio" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Media" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Apri in nuova finestra" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Accetta" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Rifiuta" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Accettata" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Rifiutata" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Nulla da mostrare" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Account" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Mostra altro…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Fine." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Abbreviazioni da tastiera" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Aiuto abbreviazioni da tastiera" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Post successivo" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Post precedente" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Salta il carosello e vai al post successivo" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Maiusc</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Salta il carosello e vai al post precedente" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Maiusc</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Carica nuovi post" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Apri dettagli post" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Invio</0> or <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Espandi avviso contenuti o<0/>o espandi/comprimi discussione" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Chiudi post o schermata" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> o <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Seleziona colonna in modalità multi-colonna" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> a <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Seleziona prossima colonna in modalità multi-colonna" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Seleziona colonna precedente in modalità multi-colonna" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Componi nuovo post" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Componi nuovo post (nuova finestra)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Maiusc</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Invia post" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Invio</1> o <2>⌘</2> + <3>Invio</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Cerca" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Rispondi (nuova finestra)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Maiusc</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Mi piace (apprezzamento)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> o <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Reblog" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Maiusc</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Aggiungi ai segnalibri" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Imposta modalità mantello" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Maiusc</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Modifica lista" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Impossibile modificare lista." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Impossibile creare lista." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Mostra risposte ai membri della lista" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Mostra risposte alle persone che seguo" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Non mostrare risposte" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Nascondi i post di questa lista da Home/Seguiti" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Crea" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Eliminare questa lista?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Impossibile eliminare lista." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Descrizione media" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Traduci" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Leggi" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Apri media originale in una nuova finestra" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Apri media originale" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Cerco di descrivere l'immagine. Attendere…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Descrizione immagine fallita" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Descrivi immagine…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Visualizza post" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Media sensibili" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtrato: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrato" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Post pubblicato. Dai un'occhiata." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Risposta pubblicata. Dai un'occhiata." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Post aggiornato. Dai un'occhiata." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menu" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Ricaricare pagina ora per aggiornare?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nuovo aggiornamento disponibile…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "following.title" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Recupera" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Menzioni" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Notifiche" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Nuovo" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profilo" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Segnalibri" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Mi piace" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Hashtag seguiti" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "FIltri" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Utenti silenziati" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Utenti silenziati…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Utenti bloccati" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Utenti bloccati…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Account…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Accedi" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Tendenze" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federata" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Scorciatoie / Colonne…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Impostazioni…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Liste" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Tutte le liste" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Notifica" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Questa notifica viene da un altro account." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Visualizza tutte le notifiche" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} ha reagito al tuo post con {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} ha pubblicato un post." + +#: src/components/notification.jsx:85 +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} ha rebloggato la tua risposta.} other {{account} ha rebloggato il tuo post.}}} other {{account} ha rebloggato {postsCount} dei tuoi post.}}}other {{postType, select, reply {<0><1>{0}</1> persone</0> hanno rebloggato la tua risposta.}other {<2><3>{1}</3> persone</2> hanno rebloggato il tuo post.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} ti ha iniziato a seguire.} other {<0><1>{0}</1> persone</0> ti hanno iniziato a seguire.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} ha richiesto di seguirti." + +#: src/components/notification.jsx:151 +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} ha messo Mi piace alla tua risposta.} other {{account} ha messo Mi piace al tuo post.}}} other {{account} ha messo {postsCount} Mi piace ai tuoi post.}}} other {{postType, select, reply {<0><1>{0}</1> persone</0> hanno messo Mi piace alla tua risposta.} other {<2><3>{1}</3> persone</2> hanno messo mi piace al tuo post.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Un sondaggio in cui hai votato o che hai creato è terminato." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Un sondaggio che hai creato è terminato." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Un sondaggio in cui hai votato è terminato." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Un post con cui hai interagito è stato modificato." + +#: src/components/notification.jsx:204 +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} ha rebloggato e ha messo Mi piace alla tua risposta.} other {{account} ha rebloggato e messo Mi piace al tuo post.}}} other {{account} ha rebloggato e messo Mi piace a {postsCount} dei tuoi post.}}} other {{postType, select, reply {<0><1>{0}</1> persone</0> hanno rebloggato e messo Mi piace alla tua risposta.} other {<2><3>{1}</3> persone</2> hanno rebloggato e messo Mi piace al tuo post.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} creato." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} ha segnalato {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Connessione con <0>{name}</0> persa." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Avviso di moderazione" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Un amministratore da <0>{from}</0> ha sospeso <1>{targetName}</1>, ciò significa che non puoi più ricevere aggiornamenti o interagire con loro." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Un amministratore da <0>{from}</0> ha bloccato <1>{targetName}</1>. Seguaci interessati: {followersCount}, seguiti: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Hai bloccato <0>{targetName}</0>. Seguaci rimossi: {followersCount}, seguiti: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Il tuo account ha ricevuto un avviso di moderazione." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Il tuo account è stato disabilitato." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Alcuni dei tuoi post sono stati contrassegnati come sensibili." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Alcuni dei tuoi post sono stati eliminati." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Da ora in poi i tuoi post verranno marcati come sensibili." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Il tuo account è stato limitato." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Il tuo account è stato sospeso." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Tipo notifica sconosciuto: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Rebloggato da/Piace a…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Piace a…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Rebloggato da…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Seguito da…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Scopri di più <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Leggi di più →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Votato" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# voto} other {# voti}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Nascondi risultati" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Vota" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Ricarica" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Mostra risultati" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> voto} other {<1>{1}</1> voti}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> votante} other {<1>{1}</1> votanti}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Finito <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Finito" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Finendo <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Finendo" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Spam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Link malevoli, interazioni finte, o risposte ripetitive" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Illegale" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Viola la legge del tuo server o del paese del server" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Violazione delle regole del server" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Viola regole specifiche del server" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Violazione" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Altro" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Il problema non rientra nelle altre categorie" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Segnala post" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Segnala @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Valutazione in sospeso" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Post segnalato" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Profilo segnalato" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Impossibile segnalare post" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Impossibile segnalare profilo" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Qual'è il problema con questo post?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Qual'è il problema con questo profilo?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Informazioni aggiuntive" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Inoltra a <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Invia segnalazione" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Silenziato {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Impossibile silenziare {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Invia segnalazione <0>+ silenzia profilo</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "{username} Bloccato" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Impossibile bloccare {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Invia segnalazione <0>+ blocca profilo</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query}<0>- account, hashtag e post</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Post con <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Post contenenti <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Cerca <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Account con <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Home / Seguiti" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Pubblico (Locale / Federata)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Account" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Hashtag" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID lista" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Solo locale" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Istanza" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Opzionale, per es. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Termine di ricerca" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Opzionale, tranne per la modalità multi-colonna" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "es. PixelArt (max 5, separati da spazi)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Solo media" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Scorciatoie" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Specifica una lista di scorciatoie che apparirà come:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Tasto fluttuante" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Barra navigazione/menu" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Multi-colonna" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Non disponibile nella modalità di visualizzazione attuale" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Sposta su" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Sposta giù" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Modifica" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Aggiungi più di una scorciatoia/colonna per fare in modo che funzioni." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Ancora nessuna colonna. Clicca il bottone Aggiungi colonna." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Ancora nessuna scorciatoia. Clicca il bottone Aggiungi scorciatoia." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Non sai cosa aggiungere?<0/>Prova con <1>Home / Seguiti e Notifiche</1> prima." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Max {SHORTCUTS_LIMIT} colonne" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Max {SHORTCUTS_LIMIT} scorciatoie" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importa/esporta" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Aggiungi colonna…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Aggiungi scorciatoia…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Una lista specifica è opzionale. Per la modalità multi-colonna, è richiesta una lista, altrimenti la colonna non verrà mostrata." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Per la modalità multi-colonna, è richiesto un termine di ricerca, altrimenti la colonna non verrà mostrata." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Sono supportati hashtag multipli. Separati da uno spazio." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Modifica scorciatoia" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Aggiungi scorciatoia" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Timeline" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Lista" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importa/Esporta <0>Scorciatoie</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importa" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Incolla qui le scorciatoie" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Scaricando le scorciatoie salvate dal server dell'istanza…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Impossibile scaricare scorciatoie" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Scarica scorciatoie dal server dell'istanza" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Esiste nelle attuali scorciatoie" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "La lista potrebbe non funzionare se proviene da un account diverso." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Formato impostazioni non valido" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Apporre alle scorciatoie attuali?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Solo le scorciatoie che non esistono nelle scorciatoie attuali verranno apposte." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Nessuna nuova scorciatoia da importare" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Scorciatoie importate. È stato superato il limite di {SHORTCUTS_LIMIT}, quindi il resto non verrà importato." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Scorciatoie importate" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importa e apponi…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Sovrascrivere le scorciatoie attuali?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Importare scorciatoie?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "o sovrascrivi…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importa…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Esporta" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Scorciatoie copiate" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Impossibile copiare scorciatoie" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Impostazioni scorciatoie copiate" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Impossibile copiare impostazioni scorciatoie" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Condividi" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Salvataggio scorciatoie nel server dell'istanza…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Scorciatoie salvate" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Impossibile salvare scorciatoie" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sincronizza con server istanza" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# carattere} other {# caratteri}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "JSON scorciatoie originale" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importa/esporta impostazioni da/su un server istanza (molto sperimentale)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>boostato</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Spiacenti, l'istanza a cui sei connesso non può interagire coi post di altre istanze." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Non ti piace più il post di @{0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Hai messo Mi piace al post di @{0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Post di @{0} rimosso dai segnalibri" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Post di @{0} aggiunto ai segnalibri" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Annulla reblog" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Cita" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Alcuni contenuti non hanno una descrizione." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Post vecchio (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Reblog del post di @{0} annullato" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Hai rebloggato il post di @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Reblogga…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Non mi piace più" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Mi piace" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Rimuovi dai segnalibri" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Visualizza post di <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Mostra cronologia modifiche" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Modificato: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Incorpora post" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Conversazione riattivata" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Conversazione silenziata" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Impossibile riattivare la conversazione" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Impossibile silenziare la conversazione" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Riattiva conversazione" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Silenzia conversazione" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Post tolto dal profilo" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Post fissato al profilo" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Impossibile togliere il post" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Impossibile fissare post" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Togli dal profilo" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Fissa sul profilo" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Eliminare questo post?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Post eliminato" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Impossibile eliminare post" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Segnala post…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Ti piace" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Rebloggato" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Aggiunto ai segnalibri" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Fissato" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Eliminato" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# risposta} other {# risposte}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Discussione{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Mostra meno" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Mostra contenuto" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Mostra media" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Modificato" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Commenti" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Più da <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Modifica Cronologia" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Impossibile caricare cronologia" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Carico…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "Codice HTML" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Codice HTML copiato" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Impossibile copiare codice HTML" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Allegati multimediali:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Emoji dell'account:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL statico" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emoji:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Note:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "È statico, non stilizzato e senza script. Potresti dover applicare i tuoi stili e modificare di conseguenza." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "I sondaggi non sono interattivi, diventano una lista con i conteggi dei voti." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Gli allegati multimediali possono essere immagini, video, audio o qualsiasi tipo di file." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Il post può essere modificato o eliminato dopo." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Anteprima" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Nota: Questa anteprima è leggermente stilizzata." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> ha rebloggato" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Nuovi post" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Riprova" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Reblog} other {# Reblog}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Post fissati" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Discussione" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtrati</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Tradotto automaticamente da {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Traduco…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Traduci da {sourceLangText} (auto-detected)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Traduci da {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Auto ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Traduzione fallita" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Modifico stato originale" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "In risposta a @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Adesso puoi chiudere questa pagina." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Chiudi finestra" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Accesso richiesto." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Vai alla home" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Post dell'account" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Risposte)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Reblog)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Media)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Rimuovi filtri" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Cancella" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Mostrando post con risposte" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Risposte" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Mostrando post senza reblog" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Reblog" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Mostrando post con media" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Mostrando post con #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Mostrando post in {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Niente da vedere qui." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Impossibile caricare i post" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Impossibile recuperare info account" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Passa all'istanza {0} dell'account " + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Passa alla mia istanza (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Mese" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Attuale" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Default" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Passa a questo account" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Passa in nuova scheda/finestra" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Visualizza profilo…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Imposta come predefinito" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Uscire da <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Esci…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Aggiungi un account esistente" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Nota: L'account <0>default</0> verrà sempre usato per il primo accesso. Gli account a cui passi rimarranno attivi durante la sessione." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Ancora nessun segnalibro. Vai e aggiungi qualcosa!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Impossibile caricare i segnalibri." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "ultima ora" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "ultime 2 ore" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "ultime 3 ore" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "ultime 4 ore" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "ultime 5 ore" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "ultime 6 ore" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "ultime 7 ore" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "ultime 8 ore" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "ultime 9 ore" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "ultime 10 ore" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "ultime 11 ore" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "ultime 12 ore" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "oltre 12 ore" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Tags seguiti" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Gruppi" + +#: 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 "Mostrando {selectedFilterCategory, select, all {tutti i post} original {post originali} replies {risposte} boosts {reblog} followedTags {tag seguiti} groups {gruppi} filtered {post filtrati}}{sortBy, select, createdAt {{sortOrder, select, asc {dal più vecchio} desc {al più recente}}} reblogsCount {{sortOrder, select, asc {meno reblog} desc {più reblog}}} favouritesCount {{sortOrder, select, asc {meno like} desc {più like}}} repliesCount {{sortOrder, select, asc {meno risposte} desc {più risposte}}} density {{sortOrder, select, asc {meno densi} desc {più densi}}}} prima{groupBy, select, account {, raggruppato per autori} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Recupera <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Aiuto" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Cos'è questo?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Recupera è una timeline separata per gli account che segui, offre una visione panoramica con un'interfaccia semplice ispirata alle email per poter organizzare e filtrare i post." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Anteprima IU di Recupera" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Recuperiamo" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Recuperiamo i post dai tuoi seguiti." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Mostrami tutti i post da…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "fino al massimo" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Recupera" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Si sovrappone con il tuo ultimo recupero" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Fino all'ultimo recupero ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Nota: la tua istanza potrebbe mostrare solamente un massimo di 800 post nella timeline della Home a prescindere dal lasso di tempo. Può essere di meno o di più." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Precedentemente…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural,one {# post}other {# posts}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Rimuovere questo recupero?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Rimozione \"Recupera\" {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Recupera {0} rimossa" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Nota: Verranno salvati al massimo 3. Il resto verrà automaticamente rimosso." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Recupero post…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Potrebbe volerci un po' di tempo." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Resetta filtri" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Top link" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Condiviso da {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Tutto" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural,one {# autore} other {# autori}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Ordina" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Data" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Densità" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "group.filter" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autori" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Nessuno" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Mostra tutti gli autori" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Non devi leggere tutto." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "È tutto." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Torna su" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Link condivisi da account che segui, ordinati per numero di condivisioni, reblog e Mi piace." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Ordina: Densità" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "I post sono ordinati in base alla loro densità o profondità informativa. I post più brevi sono più \"leggeri\" mentre i post più lunghi sono più \"pesanti\". I post con foto sono più \"pesanti\" dei post senza foto." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Gruppo: Autori" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "I post vengono raggruppati in base agli autori, ordinati dal numero di post per autore." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Prossimo autore" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Autore precedente" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Torna su" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtrati: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Ancora nessun mi piace. Metti mi piace a qualcosa!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Impossibile caricare i Mi piace." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Casa e liste" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Timeline pubbliche" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Conversazioni" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profili" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Mai" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Nuovo filtro" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtro} other {# filtri}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Impossibile caricare filtri." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Ancora nessun filtro." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Aggiungi filtro" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Modifica filtro" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Impossibile modificare filtro" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Impossibile creare filtro" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Titolo" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Intera parola" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Nessuna parola chiave. Aggiungine una." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Aggiungi parola chiave" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# parola chiave} other {# parole chiave}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtra da…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Non ancora implementato" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Status: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Cambia scadenza" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Scadenza" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "I post filtrati saranno…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "contratti" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "nascosti" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Eliminare questo filtro?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Impossibile eliminare filtro." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Scaduto" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Scadendo <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Senza scadenza" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# hashtag} other {# hashtag}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Impossibile caricare hashtag sguiti." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Ancora nessun hashtag seguito." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Niente da vedere qui." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Impossibile caricare i post." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (solo media) su {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} su {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (solo contenuti multimediali)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Nessuno ha ancora pubblicato nulla con questo hashtag." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Impossibile caricare i post con questo hashtag" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Smettere di seguire #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Non segui più #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Ora segui #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Seguiti…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Non più in evidenza sul profilo" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Impossibile rimuovere dai contenuti in evidenza sul profilo" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "In evidenza sul profilo" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Metti in evidenza sul profilo" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {}other {Max # hashtag}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Aggiungi hashtag" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Rimuovi hashtag" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Max # scorciatoie raggiunte. Impossibile aggiungere scorciatoia.} other {Max # scorciatoie raggiunte. Impossibile aggiungere scorciatoia.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Questa scorciatoia esiste già" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Aggiunta scorciatoia hashtag" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Aggiungi a Scorciatoie" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Inserisci una nuova istanza es. \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Istanza non valida" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Vai in un'altra istanza…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Vai alla mia istanza (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Impossibile recuperare notifiche." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Nuove</0> <1>richieste di seguire</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Mostra tutto" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Risolvo…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Impossibile risolvere URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Ancora niente." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Gestisci membri" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Rimuovere <0>@{0}</0> dalla lista?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Rimuovere…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# lista} other {# liste}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Ancora nessuna lista." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Registrazione applicazione fallita" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "dominio d'istanza" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "es. \"mastodon.social\"" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Errore d'accesso. Per favore prova ancora o prova con un'altra istanza." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Continua con {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Continua" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Non hai un account? Creane uno!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Menzioni private" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privato" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Nessuno ti ha menzionato :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Impossibile caricare menzioni." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Non segui" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Chi non ti segue" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Con un nuovo account" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Ti menziona in privato dal nulla" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "È limitato dai moderatori dei server" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Impostazioni di notifica" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Nuove notifiche" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Annuncio} other {Annunci}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Richieste di seguiti" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# richiesta di seguire} other {# richieste di seguire}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Filtrate notifiche da # persona} other {Filtrate notifiche da # persone}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Solo menzioni" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Oggi" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Non ci sono novità." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Ieri" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Impossibile caricare notifiche" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Impostazioni di notifica aggiornate" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Blocca notifiche da chi:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtra" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignora" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Aggiornato <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Visualizza notifiche da <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Notifiche da <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Da ora in poi le notifiche da @{0} non saranno bloccate" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Impossibile accettare richiesta di notifica" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Consenti" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Da ora in poi le notifiche da @{0} non apparrianno in Notifiche filtrate." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Impossibile ignorare richiesta di notifica" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Ignora" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Ignorato" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Timeline locale ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Timeline federata ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Timeline locale" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Timeline federata" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Nessuno ha ancora pubblicato nulla." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Passa a Federata" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Passa a Locale" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Cerca: {q} (Post)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Cerca: {q} (Account)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Cerca: {q} (Hashtag)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Cerca: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Hashtag" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Mostra altro" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Mostra altri account" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Nessun account trovato." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Mostra altri hashtag" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Nessun hashtag trovato." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Mostra altri post" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Nessun post trovato." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Inserisci il termine di ricerca o incolla un URL sopra per iniziare." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Impostazioni" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Aspetto" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Chiaro" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Scuro" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automatico" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Dimensione testo" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Lingua visualizzata" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Traduzioni volontarie" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Pubblicazione" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Visibilità di default" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Sincronizzato" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Aggiornamento visibilità post fallito" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Sincronizzato con le impostazioni del tuo server di istanza. <0>Visita la tua istanza ({instance}) per altre impostazioni.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Esperimenti" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Aggiorna automaticamente i post della timeline" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Carosello reblog" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Traduzione post" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Traduci in" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Lingua di sistema ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, one {}=0 {Nascondi tasto \"Traduci\" per:} other {Nascondi tasto \"Traduci\" per (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Nota: Questa funzione utilizza servizi di traduzione esterni, alimentata da <0>Lingva API</0> e <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Traduzione automatica in linea" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Mostra automaticamente la traduzione per i post nella timeline. Funziona solo per i post <0>corti</0> senza avvisi contenuti, media e sondaggi." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Selezionatore di GIF per compositore" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Nota: Questa funzione utilizza un servizio di ricerca GIF esterno, alimentato da <0>GIPHY</0>. Classificazione T (adatto a tutte le età), i parametri traccianti sono eliminati, le informazioni di referer sono omesse dalle richieste, ma i termini di ricerca e le informazioni sull'indirizzo IP raggiungeranno comunque i loro server." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Generatore di descrizioni d'immagine" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Solo per le nuove immagini mentre si compongono nuovi post." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Nota: Questa funzionalità usa un servizio IA esterno, alimentato da <0>img-alt-api</0>. Potrebbe non funzionare correttamente. Solo per immagini e in inglese." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Notifiche raggruppate dal server" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Funzionalità in stato alfa. Potenziale miglioramento nel raggruppamento delle finestre ma con una logica base di raggruppamento." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Importazione/esportazione \"cloud\" per le impostazioni delle scorciatoie." + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Molto sperimentale.<0/>Conservato nelle note del tuo profilo. Le note (private) del profilo sono usate principalmente per gli altri profili e sono nascoste per il tuo profilo." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Nota: Questa funzionalità usa l'API del server d'istanza attualmente in accesso." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Modalità mantello <0>(<1>Testo</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Sostituisci testo con blocchi, utile per fare screenshot e per questioni di privacy." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Informazioni" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Sviluppato</0> da <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Sponsor" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Dona" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Politica sulla privacy" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Sito:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versione:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Stringa di versione copiata" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Impossibile copiare la stringa della versione" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Impossibile aggiornare iscrizione. Si prega di riprovare." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Impossibile rimuovere l'iscrizione. Per favore riprova." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Notifiche Push (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Le notifiche push sono bloccate. Si prega di abilitarle nelle impostazioni del tuo browser." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Consenti da <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "chiunque" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "persone che seguo" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "seguaci" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Seguiti" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Sondaggi" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Modifiche del post" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Il permesso push non è stato concesso dopo il tuo ultimo login. Dovrai <0><1>effettuare l'accesso</1> di nuovo per concedere l'autorizzazione push</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "NOTA: Le notifiche push funzionano per <0>un account</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "post.title" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Non hai effettuato l'accesso. Le interazioni (risposte, reblog, etc) non sono abilitate." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Questo post è di un'altra istanza (<0>{instance}</0>). Le interazioni (risposte, reblog, etc) non sono abilitate." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Errore: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Passa alla mia istanza per abilitare le interazioni" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Impossibile caricare risposte." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Indietro" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Vai al post principale" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} post sopra - Torna in cima" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Passa a vista laterale" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Passa a vista completa" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Mostra tutto il contenuto sensibile" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Sperimentale" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Impossibile cambiare" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Passa all'istanza del post ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Passa all'istanza del post" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Impossibile caricare post" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural,one {# risposta}other {<0>{1}</0> risposte}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural,one {# commento}other {<0>{0}</0> commenti}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Visualizza il post con le sue risposte" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "In tendenza su ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Notizie di tendenza" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Di {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Ritorna a visualizzare i post di tendenza" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Mostra i post che citano <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Post in tendenza" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Nessun post in tendenza." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Un web client minimalista di Mastodon." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Accedi con Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Registrati" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Collega il tuo account Mastodon o del Fediverso.<0/>Le tue credenziali non vengono salvate su questo server." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Costruito</0> da <1>@cheeaun</1>. <2>Infromativa sulla privacy</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Schermata del Carosello dei Reblog" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Carosello dei Reblog" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Separa visivamente i post originali e i post ri-condivisi (post boostati)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Screenshot della discussione a commenti annidati" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Discussione a commenti annidati" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Segui le conversazioni senza fatica. Risposte semi-comprimibili." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Screenshot delle notifiche raggruppate" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Notifiche raggruppate" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Le notifiche simili sono raggruppate e compresse per ridurre la confusione." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Screenshot dell'interfaccia multi-colonna" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Una o più colonne" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Di default, una sola colonna per gli utenti zen. Modalità multi-colonna per gli utenti avanzati." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Screenshot della timeline multi-hashtag con un modulo per aggiungere altri hashtag" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Timeline multi-hashtag" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Fino a 5 hastag combinati in una sola timeline." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Sembra che il tuo browser stia bloccando le finestre a comparsa." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Un post bozza è attualmente contratto. Pubblicato o scartalo prima di crearne un altro." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Un post è attualmente aperto. Pubblicato o scartalo prima di crearne un altro." + diff --git a/src/locales/ja-JP.po b/src/locales/ja-JP.po new file mode 100644 index 00000000..f19f0c0e --- /dev/null +++ b/src/locales/ja-JP.po @@ -0,0 +1,3808 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ja\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Japanese\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "ロック中" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "投稿: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "最終投稿: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "グループ" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "相互フォロー" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "リクエスト済み" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "フォロー中" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "フォローされています" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "認証済み" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "<0>{0}</0> に参加しました" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "アカウントを読み込めません。" + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "アカウントページに移動" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "フォロワー" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "投稿" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "その他" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "ハンドルをコピーしました" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "ハンドルをコピーできません" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "ハンドルをコピー" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "元のプロフィールページに移動" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "プロフィール画像を表示" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "プロフィールヘッダーを表示" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "このユーザーはこの情報を利用できないように選択しました。" + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "" + +#: 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 "" + +#: 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 {1 年以内に 1 回の投稿} other {1 年以内に {1} 回の投稿}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "オリジナル" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "返信" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "ブースト" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "投稿の統計情報を利用できません。" + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "投稿の統計を見る" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "最終投稿: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "ミュート済み" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "ブロック済み" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "プライベートメモ" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "プロフィールを翻訳" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "プライベートメモを編集" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "プライベートメモを追加" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "@{username} の投稿に対して通知を有効にしました。" + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "@{username} の投稿に対する通知を無効にしました。" + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "通知を無効化" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "通知を有効化" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "@{username} からのブーストを有効にしました。" + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "@{username} からのブーストを無効にしました。" + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "ブーストを無効化" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "ブーストを有効化" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "リストから追加/削除" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "リンクをコピーしました" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "リンクをコピーできません" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "コピー" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "共有は機能しないようです。" + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "共有…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "@{username} のミュートを解除" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "<0>@{username}</0> をミュート解除" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "<0>@{username}</0> をミュート…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} を {0} ミュートしました" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "@{username} をミュートできません" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "<0>@{username}</0> をフォロワーから削除しますか?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} がフォロワーから削除されました" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "フォロワーを削除…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "<0>@{username}</0> をブロックしますか?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "@{username} のブロックを解除しました" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} をブロックしました" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "@{username} のブロックを解除できません" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "@{username} をブロックできません" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "<0>@{username}</0> のブロックを解除" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "<0>@{username}</0> をブロック…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "<0>@{username}</0> を報告…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "プロフィールを編集" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "フォローリクエストを取り消しますか?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "@{0} のフォローを解除しますか?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "フォロー解除…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "取り消し…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "フォロー" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "閉じる" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "翻訳されたプロフィール" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "リストはありません。" + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "新しいリスト" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "<0>@{0}</0> に関するプライベートメモ" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "プライベートメモを更新できませんでした。" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "キャンセル" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "保存して終了" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "プロフィールを更新できませんでした" + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "名前" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "プロフィール" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "補足情報" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "ラベル" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "内容" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "保存" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "ユーザー名" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "サーバーのドメイン名" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "クロークモードは無効化されています" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "クロークモードは有効化されています" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "ホーム" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "投稿" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "カスタム絵文字を追加" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "投票を追加" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 "" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "ポップアウト" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "最小化" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "ポップイン" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "公開" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "ローカル" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "未収載" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "フォロワーのみ" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "非公開の返信" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "追加" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "返信" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "更新" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "投稿" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "GIF をダウンロード中…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "GIF のダウンロードに失敗しました" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "その他…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "サイズが大きすぎます。アップロード時に問題が発生する可能性があります。 {0} × {1} px から {2} × {3} px に減らしてみてください。" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "フレームレートが高すぎます。アップロード時に問題が発生する可能性があります。" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "削除" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "画像の説明を編集" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "動画の説明を編集" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "音声の説明を編集" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "説明を生成しています。しばらくお待ちください…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "説明の生成に失敗しました: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "説明の生成に失敗しました" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "説明の生成…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "説明の生成に失敗しました: {0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>実験的</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "完了" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "GIFの検索" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Powered by GIPHY." + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "前へ" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "次へ" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "GIF の読み込みに失敗しました" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "未送信の下書き" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "下書きの削除中にエラーが発生しました!もう一度やり直してください。" + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "削除…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "返信の取得中にエラーが発生しました!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "すべての下書きを削除しますか?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "下書きの削除中にエラーが発生しました。もう一度やり直してください。" + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "すべて削除…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "下書きはありません。" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "アンケート" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "メディア" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "新しいウィンドウで開く" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "承認する" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "拒否する" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "承認済み" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "拒否されました" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "表示するものがありません" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "アカウント" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "もっと見る…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "終わりです。" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "キーボードショートカット" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "キーボードショートカットのヘルプ" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "次の投稿" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "前のポスト" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "カルーセルをスキップして次のポスト" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "カルーセルをスキップして前のポスト" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "新しいポストを読み込む" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "ポストの詳細を開く" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> または <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "CWを表示/隠す または スレッドを開く/閉じる" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "ポストまたはダイアログを閉じる" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0>または<1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "複数列モードで列にフォーカス" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> から <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "新しいポスト" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "新しいポスト(新しいウィンドウ)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "ポストの送信" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> または <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "検索" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "返信 (新しいウィンドウ)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "いいね (お気に入り)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> または <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "ブースト" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "ブックマーク" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "クロークモードの切り替え" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "リストの編集" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "リストを編集できません。" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "リストを作成できません。" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "リストメンバーへの返信を表示" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "フォロー中の人への返信を表示" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "返信を表示しない" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "このリストの投稿をホーム/フォローから隠す" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "作成" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "このリストを削除しますか?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "リストを削除できません。" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "メディアの説明" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "翻訳" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "フィルター済み" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "メニュー" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "今すぐページを再読み込みして更新しますか?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "新しいアップデートが利用可能です…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "キャッチアップ" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "メンション" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "通知" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "New" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "プロフィール" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "ブックマーク" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "いいね!" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "フォロー中のハッシュタグ" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "フィルター" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "ミュートしたユーザー" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "ミュートしたユーザー…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "ブロックしたユーザー" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "ブロックしたユーザー…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "アカウント…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "ログイン" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "トレンド" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "連合" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "ショートカット/列…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "設定…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "リスト" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "すべてのリスト" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "通知" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "この通知はあなたの他のアカウントからです。" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "すべての通知を表示" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} があなたの投稿に {emojiObject} でリアクションしました" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} が投稿を公開しました。" + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} からフォローリクエストがきています" + +#: src/components/notification.jsx:151 +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} から返信にいいねされました。} other {{account} からポストをいいねされました。}}} other {{account} から {postsCount} 件のポストにいいねされました。}}} other {{postType, select, reply {<0><1>{0}</1> 人</0>から返信にいいねされました。} other {<2><3>{1}</3> 人</2> からポストにいいねされました。}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "投票または作成したアンケートが終了しました。" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "作成したアンケートが終了しました。" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "投票したアンケートが終了しました。" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "あなたが交流した投稿が編集されました。" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} が登録しました。" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} が {targetAccount} を報告しました" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "<0>{name}</0>との接続が切れました。" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "モデレーション警告" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "<0>{from}</0>の管理者が<1>{targetName}</1>を停止しました。これにより、更新を受け取ったり、交流したりすることができなくなります。" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "<0>{from}</0>の管理者が<1>{targetName}</1>をブロックしました。影響を受けるフォロワー: {followersCount}、フォロー: {followingCount}。" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "あなたのアカウントはモデレーション警告を受けました。" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "続きを見る →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "結果を隠す" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "更新" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "結果を表示" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> 票} other {<1>{1}</1> 票}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0} 秒" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0} 分" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0} 時間" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "ポストを報告" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "@{username} を報告" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "ポストを報告しました" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "プロファイルを報告しました" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "ポストを報告できません" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "プロフィールを報告できません" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "報告を送信" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "{username} をミュートしました" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "{username} をミュートできません" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "ホーム / フォロー中" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "公開 (ローカル/連合)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "アカウント" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "ハッシュタグ" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "リスト ID" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "ローカルのみ" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "インスタンス" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "(オプション) 例: mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "検索キーワード" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "マルチカラムモード以外、オプション" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "例: PixelArt (最大 5 個、スペース区切り)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "メディアのみ対象" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "ショートカット" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "ベータ" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "フローティングボタン" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "タブ/メニューバー" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "複数列表示" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "現在のビューモードでは使用できません" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "上へ移動" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "下へ移動" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "編集" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "最大 {SHORTCUTS_LIMIT} 列まで" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "最大 {SHORTCUTS_LIMIT} ショートカットまで" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "インポート/エクスポート" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "列を追加…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "ショートカットを追加…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "ショートカットを編集" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "ショートカットを追加" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "タイムライン" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "リスト" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "<0>ショートカット</0>のインポート/エクスポート" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "インポート" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "ここにショートカットを貼り付け" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "インポート…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "エクスポート" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "ショートカットをコピーしました" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "ショートカットをコピーできません" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "ショートカット設定をコピーしました" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "ショートカットの設定をコピーできません" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "共有" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# 文字} other {# 文字}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "引用" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "ブースト…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "ブックマーク解除" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "編集履歴を表示" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "編集済み: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "ポストを埋め込む" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "会話のミュートを解除" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "会話をミュート" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "ポストを削除しました" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "ポストを削除できません" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "いいね!しました" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "ブーストしました" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "ブックマークしました" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "ピン留めしました" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "削除しました" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# 件の返信} other {# 件の返信}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "コンテンツを表示" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "メディアを表示" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML コード" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTMLコードをコピーしました" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "新しい投稿" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "スレッド" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "翻訳に失敗しました" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "ホームに戻る" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "ここに表示するものはまだありません。" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "ポストを読み込むことができません" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "アカウント情報を取得できませんでした" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "このアカウントのインスタンス {0} の表示に切り替える" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "自分のインスタンス (<0>{currentInstance}</0>) の表示に切り替える" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "現在のアカウント" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "デフォルト" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "プロフィールの表示…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "デフォルトに設定" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "ログアウト…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "アカウントを追加" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "注意: <0>デフォルト</0>アカウントは常に最初に読み込まれます。セッション中に切り替えたアカウントは維持されます。" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "1時間以内" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "2時間以内" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "3時間以内" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "4時間以内" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "5時間以内" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "6時間以内" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "7時間以内" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "8時間以内" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "9時間以内" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "10時間以内" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "11時間以内" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "12時間以内" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "12時間以上" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "フォロー中のタグ" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "グループ" + +#: 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 "{selectedFilterCategory, select, all {すべてのポスト} original {オリジナルポスト} replies {返信} boosts {ブースト} followedTags {フォロー中のタグ} groups {グループ} filtered {でフィルターされたポスト}} を {sortBy, select, createdAt {{sortOrder, select, asc {古い} desc {新しい}}} reblogsCount {{sortOrder, select, asc {ブーストが少ない} desc {ブーストが多い}}} favouritesCount {{sortOrder, select, asc {いいね!が少ない} desc {いいね!が多い}}} repliesCount {{sortOrder, select, asc {返信が少ない} desc {返信が多い}}} density {{sortOrder, select, asc {密度が低い} desc {密度が高い}}}} 順で {groupBy, select, account {ユーザーごとにグループ化して} other {}}表示" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "キャッチアップ <0>β</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "ヘルプ" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "これは何?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "「キャッチアップ」はあなたのための特別なタイムラインです。メールにヒントを得たシンプルなインターフェイスで、ポストを簡単に並べ替えたりフィルターしながら、概要を一目で確認できます。" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "キャッチアップUIのプレビュー" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "キャッチアップ!" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "フォローしている人のポストをキャッチアップしよう!" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "… からのすべての投稿を表示" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "最大限まで" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "キャッチアップ" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "前回のキャッチアップと重複します" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "前回のキャッチアップまで ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "注:あなたのインスタンスでは時間範囲に関係なく、ホームタイムラインの最大800個のポストしか表示されない可能性があります。\n" +"これより少ない場合も、多い場合もあります。" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "以前のキャッチアップ…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, other {# 件のポスト}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "このキャッチアップを削除しますか?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "注意:最大3つのみが保存されます。残りは自動的に削除されます。" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "ポストの取得中…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "少々お待ち下さい。" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "フィルターをリセット" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "トップリンク" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "{0} が共有しました" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "すべて" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, other {# 人}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "ソート" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "日時" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "密度" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "ユーザー" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "なし" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "すべての投稿者を表示" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "すべてを読む必要はありません。" + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "これで全部です。" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "トップへ戻る" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "フォロー中のユーザーによって共有されたリンクが表示されます。共有された回数や、ブースト数、いいね!数でソートされます。" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "ソート: 密度" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "ポストは情報密度によってソートされます。短いポストは「低く」、長いポストは「高く」なります。また、画像付きポストは画像なしポストより「高く」なります。" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "グループ: ユーザー" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "ポストはユーザーごとにグループ化され、ユーザーごとのポスト数でソートされます" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "次のユーザー" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "前のユーザー" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "一番上までスクロール" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "フィルター: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "例: “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "{selectedInstanceText} にログイン" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "ログイン" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "アカウントを持っていませんか?アカウントを作成しましょう!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "非公開の返信" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "非公開" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "通知設定" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "フォローリクエスト" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "通知設定が更新されました" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "設定" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "外観" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "ライト" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "ダーク" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "自動" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "テキストサイズ" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "表示言語" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "翻訳のボランティア" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "投稿" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "デフォルトの公開範囲" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "同期済み" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "投稿のプライバシーを更新できませんでした" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "実験的機能" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "タイムライン投稿を自動更新する" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "ブーストのカルーセル表示" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "翻訳を投稿" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "翻訳先:" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "システム言語 ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "自動インライン翻訳" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "投稿用の GIF ピッカー" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "画像説明の生成" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "プライバシーポリシー" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "誰でも" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "フォローしている人" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "フォロワー" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "フォロー" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "投票" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "投稿の編集" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "こだわりのあるミニマルな Mastodon Web クライアント" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Mastodon にログイン" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "登録" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "あなたの Mastodon/Fediverse アカウントに接続します。<0/>認証情報はこのサーバーに保存されません。" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>開発者</0> <1>@cheeaun</1> <2>プライバシーポリシー</2>" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "ブーストのスライド表示のスクリーンショット" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "ブーストのスライド表示" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "オリジナルのポストとブーストされたポストを見分けやすく表示します。" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "コメントスレッドのスクリーンショット" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "コメントスレッド" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "会話をわかりやすく追えます。また、返信を折りたたみ可能。" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "通知のグルーピングのスクリーンショット" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "通知のグルーピング" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "似たような通知はグループかされ、煩雑さが軽減します。" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "マルチカラムUIのスクリーンショット" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "シングル or マルチカラム" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "デフォルトではシングルモードですが、パワーユーザー向けにマルチカラムモードも設定できます。" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "マルチタグ・タイムラインにハッシュタグを追加するスクリーンショット" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "マルチタグ・タイムライン" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "最大5つのハッシュタグを1つのタイムラインでまとめて表示できます。" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/kab.po b/src/locales/kab.po new file mode 100644 index 00000000..e3e5dde7 --- /dev/null +++ b/src/locales/kab.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: kab\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Kabyle\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: kab\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Isekkeṛ" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Tisuffaɣ: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Tasuffeɣt taneggarut: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Awurman" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Agraw" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Temṭafaṛem" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Yettwasra" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Yeṭṭafar" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Yeṭṭafaṛ-ik·ikem" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# aneḍfar} other {# ineḍfaren}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Yettwasenqed" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Yerna-d ass <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "I lebda" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Yegguma ad d-yali umiḍan." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Ddu ɣer usebter n umiḍan" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Imeḍfaṛen" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Tisuffaɣ" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Ugar" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> ɣur-s tura amiḍan-a amaynut:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Isem n useqdac yettwanɣel" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "D awezɣi anɣal n yisem n useqdac" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Nɣel isem n useqdac" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Ddu ɣer usebter n umaɣnu" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Wali tugna n umaɣnu" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Wali aqerru n umaɣnu" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "In Memoriam" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Aseqdac-a yefren ur tettili ara telɣut-a." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} tisuffaɣ tiɣbula, {1} tiririyin, {2} izuzar" + +#: 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 {Tasuffeɣt taneggurt i wass-a} other {Tasuffeɣt taneggarut deg {2} wussan-a yezrin}}} other {{3, plural, one {{4} tsuffaɣ tineggura i wass-a} other {{5} tsuffaɣ tineggura deg {6} wussan-a yezrin}}}}" + +#: 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 {1 tsuffeɣt taneggarut deg yiseggasen-a ineggura} other {{1} tsuffaɣ deg yiseggasen-a ineggura}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Aɣbalu" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Tiririt" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Izuzar" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Tidaddanin n yizen-a ulac-itent." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Wali tidaddanin n tsuffeɣt" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Tasuffeɣt taneggarut: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Yettwasgugem" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Yettusewḥel" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Tazmilt tusligt" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Bder <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Suqel tudert" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Ẓreg tazmilt tusligt" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Rnu tazmilt tusligt" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Tettwarmed telɣut i tsuffaɣ n @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Tettwasens telɣut i tsuffaɣ n @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Sens ulɣuten" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Rmed ulɣuten" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Izuzar seg @{username} ttwaremden." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Izuzar seg @{username} ttwasensen." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Sens izuzar" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Sken izuzar" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Rnu/Kkes seg tebdarin" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Yettwanɣel wasaɣ" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "D awezɣi ad d-yenɣel useɣwen" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Nɣel" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Beṭṭu yettban ur yeddi ara." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Bḍu…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Yettwakkes usgugem i @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Kkes asgugem <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Sgugem <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Sgugem @{username} i {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "D awezɣi asgugem n @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Kkes <0>@{username}</0> seg yineḍfaren?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} yettwakkes seg yineḍfaren" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Kkes aneḍfar…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Sewḥel <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Yettwakkes usewḥel i @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Yettusewḥel @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "D awezɣi tukksa n usewḥel i @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "D awezɣi asewḥel i @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Kkes asewḥel <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Sewḥel <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Cetki ɣef <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Ẓreg amaɣnu" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Kkes assuter n uḍfar?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Ur ṭṭafar ara @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Ur ṭṭafar ara…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Kkes…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Ḍfeṛ" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Mdel" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Tettwasuqqel tudert" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "D awezɣi ad yettwakkes seg tebdart." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "D awezɣi ad yettwarnu ɣer tebdart." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "D awezɣi ad d-alint tebdarin." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Ulac tibdarin." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Tabdart tamaynutt" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Tazmilt tusligt ɣef <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "D awezɣi aleqqem n tezmilt tusligt." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Sefsex" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Sekles sakkin mdel" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "D awezɣi aleqqem n umaɣnu." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Isem" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Tameddurt" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Urtiyen niḍen" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Tabzimt" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Agbur" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Sekles" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "isem n useqdac" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "isem n taɣult n uqeddac" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Askar uffir yensa" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Askar uffir yermed" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Agejdan" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Suddes" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Timerna n imuji udmawan" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Rnu asisten" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Ɣur-k isenfal ur yettwaskelsen ara. Sefsex tasuffeɣt-a?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Tzemreḍ ad tsedduḍ 1 ufaylu kan.} other {Tzemreḍ ad tsedduḍ # yifuyla.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Ldi deg ufaylu udhim" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Semẓẓi" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Waqil tmedleḍ asfaylu amaraw." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Yettban-d ɣur-k yakan urti ideg turiḍ yeldi deg usfaylu amaraw, ha-t-an ad t-id-tessuffɣeḍ. Ttxil-k, ṛǧu ad yemmed syen εreḍ ticki." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Yettban tesεiḍ yakan urti ideg turiḍ yeldi deg usfaylu amaraw. Tiririt n usfaylu-a ad issefsex tira n tsuffeɣt deg usfaylu-a war asekles. Kemmel?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Err-d seg usfaylu agejdan" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Tiririt ɣef tsuffeɣt n @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Tiririt ɣef tsuffeɣt n @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Aẓrag n tsuffeɣt n uɣbalu" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Asisten ilaq ad yesεu ma drus snat textiṛiyin" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Kra n yifranen n usisten d ilmawen" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Kra yimidyaten ulac ɣer-sen aglam. Kemmel?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Amedday #{i} yecceḍ" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Yir agbur" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Yir agbur neɣ amidya amḥulfu" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Azayaz" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Adigan" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "War abdar" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Imeḍfaṛen kan" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Abdar uslig" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Suffeɣ tiririt-ik·im" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Ẓreg tasuffeɣt-ik·im" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Acu i txeddmeḍ?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Creḍ allal n teywalt d anafri" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Rnu" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Err" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Leqqem" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Suffeɣ" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Asader n GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Yecceḍ usader n GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Ugar…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Yuli-d" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Aglam n tugna" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Aglam n tvidyutt" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Aglam n useklas ameslaw" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Teɣzi n ufaylu meqqret aṭas. asali-ines yezmer ad yesεu uguren. Ԑreḍ ad tesneqseḍ deg teɣzi seg {0} ɣer {1} neɣ ugar." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Amidya-a meqqer aṭas. asali-ines yezmer ad yesεu uguren. Ԑreḍ ad tesneqseḍ deg teɣzi seg {0}×{1}px ɣer {2}×{3}px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Afmiḍi meqqer aṭas. Asali-s yezmer ad d-yeglu s wuguren." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Kkes" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Tuccḍa" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Ẓreg aglam n tugna" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Ẓreg aglam n tvidyut" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Ẓreg aglam n useklas ameslaw" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Asirew n uglam. Ttxil-k ṛǧu…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Yecceḍ usirew n uglam: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Yecceḍ usirew n uglam" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Sirew aglam…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Yecceḍ usirew n uglam{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— armitan</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Yemmed" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Tiferni {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Aṭas n tferniwin" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Tanzagt" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Kkes afmiḍi" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Nadi imiḍanen" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Tuccḍa deg usali n imiḍanen" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Imujiten udmawanen" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Nadi imujit" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Tuccḍa deg usali n yimujiten udmawanen" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Yettwaseqdac melmi kan" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Wiyyaḍ" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} d wugar…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Nadi GIFs" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "S lmendad n GIPHP" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Aru i unadi n GIFs" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Uzwir" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Uḍfir" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Tuccḍa deg usali GIFs" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Ur ttazen ara irewwayen" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Yettban ɣur-k irewwayen ur yettwaznen ara. Kemmel ansi i ten-teǧǧiḍ." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Kkes arewway-a?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Tuccḍa deg tukksa n urewway! Ttxil εreḍ tikkelt niḍen." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Kkes…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Tuccḍa deg tririt n waddad n tririt!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Kkes akk irewwayen?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Tuccḍa deg tukksa n yirewwayen! Ttxil εreḍ tikkelt niḍen." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Kkes-iten akk…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Ulac irewwayen i yettwafen." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Asisten" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Amidya" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Ldi deg usfaylu amaynut" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Qbel" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Agi" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Yettwaqbal" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Yettwagi" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Ulac ara yettwaskanen" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Imiḍanen" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Sken-d ugar…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Taggara." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Inegzumen n unasiw" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Tallelt n yinegzumen n unasiw" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Tasuffeɣt tuḍfirt" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Tasuffeɣt iɛeddan" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Zgel akarusel ɣer tsuffeɣt tuḍfirt" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Zgel akarusel ɣer tsuffeɣt tudfirt" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Sali-d tisuffaɣ timaynutin" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Ldi talqayt n tsuffeɣt" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Sekcem</0> neɣ <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Alɣu ɣef usumɣer n ugbur neɣ <0/>abeddel n usqerdec semɣer/semẓẓi" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Mdel tasuffeɣt neɣ idiwenniyen" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> neɣ <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Tigejdit Focus deg uskar n waṭas n tgejda" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> ɣer <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Aru Tasuffeɣt tamaynut" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Aru tasuffeɣt tamaynut (asfaylu amaynut)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Azen tasuffeɣt" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> neɣ <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Nadi" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Err (asfaylu amaynut)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Ḥemmel (asmenyaf)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> or <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Zuzer" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Ticreḍt n usebtar" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Rmed/Sens askar uffir" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Ẓreg tabdart" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "D awezɣi ad tettwaẓrag tebdart." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "D awezɣi timerna n tebdart." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Sken tiririyin i yiεeggalen n tebdart" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Sken tiririyin i yimdanen i ṭṭafareɣ" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Ur skan ara tiririyin" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Ffer tisuffaɣ deg tebdart-a seg ugejdan/Aḍfar" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Snulfu-d" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Kkes tabdart-a?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "D awezɣi tukksa n tebdart." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Aglam n umidya" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Suqel" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Mmeslay" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Ldi amidya aɣbalu deg usfaylu amaynut" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Ldi amidya aɣbalu" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Aneεruḍ n uglam n tugna. Ttxil-k rǧu…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Yecceḍ uglam n tugna" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Glem tugna…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Wali tasuffeɣt" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Amidya amḥulfu" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Yettwasizdeg: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Tettwasizdeg" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Yeffeɣ-d yizen-nni. Mmuqqel-it." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Tiririt ɣef tsuffeɣt. Senqed-itt." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Yettwalqam yizen-nni. Mmuqel-it." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Umuɣ" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Ales asali n usebter tura i uleqqem?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Yella lqem amaynut…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Alukem" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Ibdaren" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Alɣu" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Amaynut" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Amaɣnu" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Ticraḍ n yisebtar" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Iεǧeb-as" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Ihacṭagen yettwaḍfaren" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Imzizdigen" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Iseqdacen yettwasgugmen" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Iseqdacen yettwasgugmen…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Imiḍanen yettusḥebsen" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Imiḍanen yettusḥebsen…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Imiḍanen…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Qqen" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Mucaεen" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Asedduklan" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Inegzumen / Ijga…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Iɣewwaṛen…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Tibdarin" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Akk tibdarin" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Ulɣu" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Talɣut-a seg umiḍan-ik niḍen." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Wali akk ulɣuten" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} yerra-d ɣef tsuffeɣt-ik s {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "Y·Tesuffeɣ-d {account} tasuffeɣt." + +#: src/components/notification.jsx:85 +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} yesnerna tiririt-ik·im.} other {{account} yesnerna tasuffeɣt-ik·im.}}} other {{account} yesnerna {postsCount} n tsuffaɣ-ik.}}} other {{postType, select, reply {<0><1>{0}</1> imdanen</0> snernan tiririt-ik·im.} other {<2><3>{1}</3> imdanen</2> zuzren tasuffeɣt-ik·im.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, one {}=1 {{account} yeṭṭafar-ik.} other {<0><1>{0}</1> imdanen</0> ṭṭafaren-k.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} yessuter ad k-yeḍfer." + +#: src/components/notification.jsx:151 +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} teεǧeb-as tririt-ik·im.} other {{account} teεǧeb-as tsuffeɣt-ik·im.}}} other {{account} εeǧbent-as {postsCount} tsuffaɣ-ik·im.}}} other {{postType, select, reply {<0><1>{0}</1> imdanen</0> teεǧeb-asen·t tririt-ik·im.} other {<2><3>{1}</3> imdanen</2> teεǧeb-asen·t tsuffeɣt-ik·im.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Asisten i tferneḍ neɣ i terniḍ ifukk." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Asisten i terniḍ ifukk." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Ifukk usisten ideg tettekkaḍ." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Tasuffeɣt iɣef twennteḍ tettwaẓreg." + +#: src/components/notification.jsx:204 +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} izuzer & teεǧeb-as tririt-ik·im.} other {{account} izuzer & teεǧeb-as tsuffeɣt-ik·im.}}} other {{account} izuzer & εeǧbent-as {postsCount} n tsuffaɣ-ik·im.}}} other {{postType, select, reply {<0><1>{0}</1> imdanen</0> zuzren & teεǧeb-asen·t tririt-ik·im.} other {<2><3>{1}</3> imdanen</2> zuzren & teεǧeb-asen·t tsuffeɣt-ik·im.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} yeffeɣ." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} yettwasmater {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Ruḥent tuqqniwin akked <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Alɣu n uqeεεed" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Anedbal seg <0>{from}</0> yettwaḥbes <1>{targetName}</1>, dayen ulac ileqman ara d-yawḍen sɣur-s neɣ amyigew yid-s." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Anedbal seg <0>{from}</0> yettusewḥel <1>{targetName}</1>. Ineḍfaren yettwaḥuzan: {followersCount}, ineḍfaren: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Tesweḥleḍ <0>{targetName}</0>. Ineḍfaren yettwakksen: {followersCount}, ineḍfaren: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Amiḍan-ik yeṭṭef-d alɣu n uqeεεed." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Amiḍan-ik yensa." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Kra seg tsuffaɣ-ik ttwacerḍent d timḥulfa." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Kra seg tsuffaɣ-ik ttwakksent." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Tisuffaɣ-ik ad ttwacerḍent d tisuffaɣ timṣulfa sya d asawen." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Amiḍan-ik yesεa tilas." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Yettwaseḥbes umiḍan-ik." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Anaw n wulɣu d arussin: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Izuzer-it/Iḥemmel-it…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Iεǧeb-as i…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Izuzer-it…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Iḍfer-it…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Issin ugar <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Γer ugar →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Yefren" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Ffer igmaḍ" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Fren" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Smiren" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Sken igmaḍ" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> afran} other {<1>{1}</1> ifranen}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> amefran} other {<1>{1}</1> imefranen}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Ifukk <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Ifukk" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Yettfakk <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Yettfakk" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}tsn" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}tsd" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}srg" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "D aspam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Yir iseɣwan, yir agman d tririyin i d-yettuɣalen" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Arusḍif" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Ur iquder ara asaḍuf n tmurt-ik neɣ asaḍuf n uqeddac" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Takriṭ n ulugen n uqeddac" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Yerẓa ilugan uzzigen n uqeddac" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Takriṭ" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Ayen nniḍen" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Ugur ur yemmezg ara d taggayin niḍen" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Mmel tasuffeɣt" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Mmel @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Ittraǧu acegger" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Tasuffeɣt tattwammel" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Amaɣnu yettwammel" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "D awezɣi tummla n tsuffeɣt" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "D awezɣi tummla n umaɣnu" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "D acu i d ugur deg tsuffeɣt-a?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "D acu i d ugur deg umaɣnu-a?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Talɣut niḍen" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Welleh ɣer <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Azen aneqqis" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Yettwasgugem {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "D awezɣi asgugem n {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Azen aneqqis <0>+ Sgugem amaɣnu</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Yettusewḥel {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "D awezɣi asewḥel i {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Azen aneqqis <0>+ Sewḥel amaɣnu</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ imiḍanen, ihacṭagen & tisuffaɣ</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Tisuffaɣ yesɛan <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Tisuffaɣ yettwaweccmen <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Wali <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Imiḍanen yesɛan <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Agejdan / Aḍfar" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Azayez (Adigan / Asedduklan)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Amiḍan" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Ahacṭag" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "Asulay n tebdart" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Adigan kan" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Aqeddac" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Afrayan, am. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Nadi awal" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Afrayan, slid i uskar n waṭas n tgejda" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "e.g. PixelArt (ugar n 5, ferqen s tallunt)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Amidya kan" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Inegzumen" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Suzzeg tabdart n yinegzumen ara d-ibanen  am:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Tiqeffilt yettifliwen" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Iccer/Afeggag n wumuɣ" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Aṭas n tgejdiyin" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Ulac deg uskar n uskan amiran" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Nkez d asawen" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Nkez d akessar" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Ẓreg" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Rnu ugar n unegzum/tgejdit i wakken ad yekker." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Ulac tigejdit akka tura. Sit ɣef tqeffalt \"Rnu tigejdit\"." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Ulac inegzumen akka tura. Sit ɣef tqeffalt \"Rnu anegzum\"." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Ur tt-tefriḍ ara ɣef wacu ara ternuḍ?<0/>Ԑreḍ timerna<1>n ugejdan / Aḍfar akked ilɣa</1> d imezwura." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Ugar n tgejda {SHORTCUTS_LIMIT}" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Ugar n {SHORTCUTS_LIMIT} yinegzumen" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Kter/sifeḍ" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Rnu ajgu…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Rnu anegzum…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Tabdart tuzzigt d tafrayant. I uskar s waṭas n tgejda, tabdart tettwasra, ma ulac tigejdit ad teffer." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "I uskar s waṭas n tgejda, awal n unadi yettwasra, ma ulac tigejdit ad teffer." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Aṭas ihacṭagen ttwasefraken. Ferqen s tallunt." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Ẓreg anegzum" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Rnu anegzum" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Tasnimirt" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Tabdart" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Kter/Sifeḍ<0>Inegzumen</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Kter" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Senṭeḍ inegzumen da" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Asader inegzumen i yettwaskelsen seg uqeddac n tummant…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "D awezɣi asader n yinegzumen" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Sader inegzumen seg uqeddac n tummant" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Yella deg yinegzumen imiranen" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Tabdart yezmer ur tetteddu ara ma yella tekka-d seg umiḍan niḍen." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Amasal n yiɣewwaren d arameɣtu" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Semselsi inegzumen imiranen?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Slid inegzumen i yulac deg yinegzumen imiranen ara yettwarnun." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Ulac inegzumen imaynuten i uktar" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Inegzumen ttwaktaren-d. Ԑeddan talast n {SHORTCUTS_LIMIT}, ɣef waya llan wid ur d-yettwaktaren ara." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Inegzumen ttwaketren" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Kter & semselsi…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Zgel inegzumen imiranen?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Kter inegzumen?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "neɣ zgel…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Kter…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Sifeḍ" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Inegzumen ttwaneɣlen" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "D awezɣi anɣal n yinegzumen" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Iɣewwaren n unegzum ttwaneɣlen" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "D awezɣi anɣal n yiɣewwaren n yinegzumen" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Bḍu" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Asekles n yinegzumen ɣef uqeddac n tummant…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Inegzumen ttwaskelsen" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "D awezɣi asekles n yinegzumen" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Mtawi akked uqeddac n tummant" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# asekkil} other {# isekkilen}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Inegzumen n yizirig JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Kter/sifeḍ iɣewwaren seg/ɣer uqeddac n tummant (d armitan ugar)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/><1>izuzer-it</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Nesḥassef, tummant-ik tamirantur yeqqnen ur tezmir ara ad temyigewt akked tsuffaɣt -a seg tummant tayeḍ." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Yekkes-as uεǧab i tsuffeɣt n @{0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Teεǧeb-as tsuffeɣt n @{0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Yekkes-as acraḍ i tsuffeɣt n @{0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Tettwacreḍ tsuffeɣt @{0}" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Sefsex azuzer" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Tanebdurt" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Kra yimidyaten ulac ɣer-sen aglam." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Tasuffeɣt taqburt (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Tesfesxeḍ azuzer n tsuffeɣt n @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Tezzuzreḍ tasuffeɣt n @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Zuzer…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Kkes aεǧab" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Ḥemmel" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Kkes-as ticreḍt" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Wali tasuffeɣt sɣur <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Sken azray n teẓrigin" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Yettwaẓreg: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Sidef tasuffeɣt" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Yettwafsi usgugem ɣef udiwenni" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Yettwasgugem udiwenni" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "D awezɣi tukksa n usgugem i udiwenni" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "D awezɣi asgugem n udiwenni" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Kkes asgugem n udiwenni" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Sgugem adiwenni" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Tasuffeɣt tettwakkes seg umaɣnu" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Tasuffeɣt tettwasenteḍ ɣer umaɣnu" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "D awezɣi aserreḥ n tsuffeɣt" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "D awezɣi asenteḍ n tsuffeɣt" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Kkes asenteḍ seg umaɣnu" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Senteḍ ɣef umaɣnu" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Kkes tasuffeɣt-a?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Tasuffeɣt tettwakkes" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "D awezɣi tukksa n tsuffeɣt" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Mmel tasuffeɣt…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Iḥemmel" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Tettwazuzer" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Yettwacreḍ" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Yettwasenteḍ" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Yettwakkes" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# tiririt} other {# tiririyin}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Asqerdec{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Ssken cwiṭ" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Sken agbur" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Sken amidya" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Yettwaẓrag" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Iwenniten" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Ugar sɣur <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Azray n teẓrigin" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Yecceḍ usali n uzray" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Yessalay-d…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "Tangalt HTML" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Tangalt HTML tettwanɣal" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "D awezɣi anɣal n tengalt HTML" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Imeddayen n umidya:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Imujiṭen n umiḍan:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL n tdaddanin" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Imujiten:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Tizmilin:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Tidaddanin-a war talɣa, war tira. Ahat yessefk ad tesnaseḍ talɣiwin-ik, ad ten-tbeddleḍ melmi i tebɣiḍ." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Isestanen ur myigawen ara, ttuɣalen d tabdart s umḍan n ufran." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Imeddayen n umidya zemren ad ilin d tugniwin, d tividyutin, d iseklasen imeslawen neɣ kra n wawan n ufaylu." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Tasuffeɣt tezmer ad tettwaẓrag neɣ ad tettwakkes ticki." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Askan" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Tamawt: Taskant-a tettufeṣṣel s wudem afessas." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "Izuzer-itt <0/><1/>" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Tisuffaɣ timaynutin" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Ɛreḍ tikkelt-nniḍen" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# n uzuzer} other {# n yizurar}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Tisuffaɣ yettwasenṭḍen" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Asqerdec" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Yettwasizdeg</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Tasuqilt tawurmant seg {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Yessuqul…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Suqel seg {sourceLangText} (tifin tawurmant)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Ssuqel seg {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Awurman ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Tuccḍa deg tsuqilt" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Aẓrag n waddad n uɣbalu" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Tiririt i @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Tzemreḍ ad tmedleḍ asebtar tura." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Mdel asfaylu" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Tuqqna tettwasra." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Uɣal ɣer ugejdan" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Tisuffaɣ n umiḍan" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ tririyin)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Izuzar)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Amidya)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Sfeḍ imsizedgen" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Sfeḍ" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Askan n tsuffeɣt s tririyin" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "ugar n tririyin" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Sken tisuffaɣ war azuzer" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Izuzar" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Askan n tisuffaɣ s umidya" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Askan n tsuffaɣ yettwabdaren s #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Askan n tsuffaɣ deg {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Ulac acu ara twaliḍ dagi akka ar tura." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "D awezɣi alluy n tsuffaɣ" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "D awezɣi tiririt n telɣut n umiḍan" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Uɣal ɣer tummant n umiḍan {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Uɣal ɣer tummant-iw (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Ayyur" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Melmi kan" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Amezwer" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Uɣal ɣer umiḍan-a" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Uɣal ɣer yiccer/usfaylu amaynut" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Wali amaɣnu…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Sbadu-t d amezwer" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Ffeɣ <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Ffeɣ…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Rnu amiḍan yellan yakan" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Tamawt: Amiḍan <0>amezwer</0> ad yezg yettwaseqdac deg usali amezwaru. Imiḍanen yettwasneflen ad qqimen ɣef teɣzi n tɣimit." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Werɛad ur tesɛiḍ ara ticraḍ. Ddu ad d-tcerḍeḍ kra!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "D awezɣi ad d-alint tecraḍ n yisebtar." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "1 usrag aneggaru" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "2 yisragen ineggura" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "3 yisragen ineggura" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "4 yisragen ineggura" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "5 yisragen ineggura" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "6 yisragen ineggura" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "7 yisragen ineggura" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "8 yisragen ineggura" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "9 yisragen ineggura" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "10 yisragen ineggura" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "11 yisragen ineggura" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "12 yisragen ineggura" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "ugar n 12 yisragen" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Tibzimin yettwaḍefren" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Igrawen" + +#: 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 "Askan n {selectedFilterCategory, select, all {akk tisuffaɣ} original {tisuffaɣ tiɣbula} replies {tiririyin} boosts {izuzar} followedTags {tibzimin yettwaḍefren} groups {igrawzen} filtered {tisuffaɣ yettwaszedgen}}, {sortBy, select, createdAt {{sortOrder, select, asc {tiqburin akk} desc {tingurra akk}}} reblogsCount {{sortOrder, select, asc {drus n yizuzar} desc {aṭas n yizuzar}}} favouritesCount {{sortOrder, select, asc {drus n yismenyaf} desc {aṭas n yismenyaf}}} repliesCount {{sortOrder, select, asc {drus n tririyin} desc {aṭas n tririyin}}} density {{sortOrder, select, asc {adday n tneẓẓit} desc {afellay n tneẓẓit}}}} amezwaru{groupBy, select, account {, ttusgarwen almend n yimeskar} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Alukem <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Tallelt" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "D acu-t wa?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Alukem d tasnimirt niḍen ii yineḍfaren-ik, i d-yettmuddun udem s uswir εlayen deg uṛmac n tiṭ, s ugrudem afessas igan am wudem n yimayl i ufran n tsuffaɣ d usizdeg-nsent." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Taskant n ugrudem n ulukem" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Yebda" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Lukem tisuffaɣ n yineḍfaren-ik." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Sken-iyi-d akk tisuffaɣ sɣur…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "alamma dayen" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Alukem" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Yemyikcam akked ulukem-ik aneggaru" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Alamma d alukem aneggaru ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Tamawt: tummant-ik tezmer kan ad tesken ugar n 800 tsuffaɣ deg tesnimirt n ugejdan akken yebɣu yili uzrar n wakud. Aya yezmer ad yili ugar neɣ drus." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Uqbel…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# tasuffeɣt} other {# tisuffaɣ}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Kkes alukem-a?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Tamawt: Ugar kan n 3 ad d-ttwarrent. Ayen d-yeqqimen ad ttwakksent s wudem awurman." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Asali n tsuffaɣ…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Aya yezmer ad yeṭṭef kra n wakud." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Wennez imsizedgen" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Iseɣwan ufrinen" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Yebḍa-tt {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Akk" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# ameskar} other {# imeskaren}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Semyizwer" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Azemz" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Taneẓẓi" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Imeskaren" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Ula yiwen" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Wali akk imeskaren" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Fiḥel ad teɣreḍ kullec." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "D ayen kan." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Uɣal ar tqacuct" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Iseɣwan yettwabḍan sɣur yineḍfaren, myezwaren almend n umḍan n beṭṭu, izuzar d yismenyifen." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Semyizwer: Taneẓẓi" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Tisuffaɣ myezwarent almend n tneẓẓit n telɣut neɣ s telqayt. Tisuffaɣ timeẓẓyanin \"fessusit\" ma yella d tisuffaɣ tiɣezzfanin \"ẓẓayit\". Tisuffaɣ s tewlafin \"ẓẓayit\" ɣef tsuffaɣ war tiwlafin." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Agraw: Imeskaren" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Tisuffaɣ ttusgarwent almend n yimeskar, myizwarent almend n umḍan n tsuffaɣ i umeskar." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Ameskar uḍfir" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Ameskar udfir" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Ali d asawen" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Yettwasizdeg: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "D awezɣi asali n yismenyafen." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Agejdan akked tebdarin" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Tisnimirin tizayazin" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Idiwenniyen" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Imuɣna" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Werǧin" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Amsizdeg amaynut" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# imsizdeg} other {# imsizedgen}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "D awezɣi ad d-alin imsizedgen." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Ulac imsizdeg akka tura." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Rnu imsizdeg" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Ẓreg amsizdeg" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "D awezɣi asiẓreg n yimsizdeg" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "D awezɣi timerna n yimsizdeg" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Azwel" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Awal ummid" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Ulaw awalen n tsura. Rnu yiwen." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Rnu awal tasarut" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# awal n tsarut} other {# awalen n tsura}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Sizdeg seg…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Mazal ur yebdid ara ar tura" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Addad: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Senfel taggara" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Keffu" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Tisuffaɣ yettwasezdgen ad…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "yettwasemẓẓin" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "yettwaffer" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Kkes imsizdeg-a?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "D awezɣi tukksa n yimsizdeg." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Ad yekfu" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Ad yekfu <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Ur ikeffu ara" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# ahacṭag} other {# ihacṭagen}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "D awezɣi asali n yihacṭagen i yettwaḍfaren." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Ulac ihacṭagen i yettwaḍfaren akka ar tura." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Ulac acu ara twaliḍ dagi." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "D awezɣi alluy n tsuffaɣ." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (Amidya kan) ɣef {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} ɣef {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (Amidya kan)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Ulac win i d-isuffɣen kra s tebzimt-a akka ar tura." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "D awezɣi asali n tsuffaɣ s tebzimt-a" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Ur ṭṭafar ara #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Ur yettwaḍfar ara #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Yettwaḍfar #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Yeṭṭafar…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Yettwakkes seg umaɣnu" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "D awezɣi tukksa seg umaɣnu" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Yella ɣef umaɣnu-k" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Welleh fell-as deg umaɣnu-k" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {}other {Ugar # tibzimin}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Rnu ahacṭag" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Kkes ahacṭag" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Amḍan afellay n # unegzum yewweḍ. D awezɣi timerna n unegzum.} other {Amḍan afellay # yinegzumen yewweḍ. D awezɣi timerna n unegzum.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Anegzum-a yella yakan" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Anegzum n uhacṭag yettwarna" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Rnu ɣer inezgumen" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Sekcem-d aqedac amaynut, amedya \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Yir tummant" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Ddu ɣer uqeddac-nniḍen…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Ddu ɣer tummant-iw (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "D awazeɣi asali n yilɣa." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Amaynut</0> <1>Ḍfer issutar</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Wali-ten akk" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Iferru…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "D awezɣi ferru n URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Ulac i yellan akka tura." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Sefrek imttekkiyen" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Kkes <0>@{0}</0> seg tebdart?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Kkes…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# tabdart} other {# tibdarin}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Ulac tibdarinakka tura." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Ur yessaweḍ ara ad ijerred asnas-nni" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "amedya \"mastodon.social\"" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Ur yessaweḍ ara ad yekcem. Ttxil-k·m, ɛreḍ tikkelt nniḍen neɣ ɛreḍ aqeddac nniḍen." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Kemmel s {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Kemmel" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Ur tesεiḍ ara amiḍan? Snulfu-d yiwen!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Tabdarin tusligin" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Usligen" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Ulac win k-id-ibedren :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "D awezɣi ad d-alin ibdaren." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Ur teṭtafareḍ ara" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Anwa ur k-neṭṭafar ara" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "S umiḍan amaynut" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "D anwa i k-id-ibedren s wudem uslig war ma yessuter-ak-d" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "D anwi iwumi gan imḍebbren n uqeddac tilas" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Iɣewwaṛen n wulɣu" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Ulɣuten imaynuten" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Alɣu} other {Alɣuten}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Issutar n uḍfar" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# ḍfer assuter} other {# ḍfer issutar}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Ttwasezdgen yilɣa sɣur # amdan} other {Ttwasezdgen yilɣa sɣur # imdanen}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Ibdaren kan" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Ass-a" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Tessawḍeḍ kullec." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Iḍelli" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "D awezɣi ad d-alin ilɣa" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Iɣewwaṛen n wulɣu ttwaleqqmen" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Sizdeg ilɣa n yimdanen:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Imsizdeg" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Anef" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Yettwaleqqem <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Wali ilɣa seg <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Ilɣa sɣur <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Ilɣa sɣur @{0} ad uɣalen ad ffren sya ar sdat." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "D awezεi aqbal n ussuter n wulɣu" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Sireg" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Ilɣa sɣur @{0} ur d-ttwaskanen ara deg yilɣa yettwaszedgen sya d afella." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "D awezεi tigtin n ussuter n wulɣu" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Zgel" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Yettwazgel" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Tasuddemt tadigant ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Tasuddemt tasedduklant ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Tasuddemt tadigant" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Tasnimirt tazayazt tamatut" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Ulac win i d-isuffɣen kra akka ar tura." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Bren ɣer tesdduklant" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Uɣal ɣer udigan" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Nadi: {q} (Tisuffaɣ)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Nadi: {q} (Imiḍanen)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Nadi: {q} (Ihacṭagen)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Nadi: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Ihacṭagen" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Wali ugar" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Wali ugar n imiḍanen" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Ulac imiḍanen yettwafen." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Wali ugar n ihacṭagen" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Ulac ihacṭagen i yettwafen." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Wali ugar n tsuffaɣ" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Ulac tisuffaɣ i yettwafen." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Sekcem awal-ik·im n unadi neɣ senteḍ URL nnig i wakken ad tebduḍ." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Iɣewwaṛen" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Udem" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Aceɛlal" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Ubrik" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Awurman" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Teɣzi n uḍris" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Tutlayt n uskan" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Iwaziwen n tsuqilin" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Asuffeɣ" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Abani amezwer" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Yemtawa" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Ur yessaweḍ ara ad ileqqem tabaḍnit n usuffeɣ" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Yemtawa akked yiɣewwaren n uqeddac n tummant-ik. <0>Ddu ɣer tummant-ik ({instance}) i wugar n yiɣewwaren.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Tirmatin" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Asmiren awurman n tsuffaɣ n tesnimirt" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Kaṛusel n yizuzar" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Asuqqel n tsuffeɣt" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Suqel ɣer" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Tutlayt n unagraw ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, one {}=0 {Ffer taqeffalt \"Suqqel\" i:} other {Ffer taqeffalt \"Suqqel\" i (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Tamawt: Tamahilt-a tesseqdac imeẓla n usuqqel azɣaray, tella s lmendad n <0>Lingva API</0> & <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Tasuqilt tawurmant srid" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Sken tisuqilin s wudem awurman i tsuffaɣ deg tesnimirt. Tetteddu kan i tsuffaɣ <0>timeẓẓyanin</0> war alɣu n ugbur, amidya akked usisten." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Amefran n GIF i umsuddes" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Tamawt: Tamahilt-a tesseqdac ameẓlu n unadi n GIF azɣaray, s ttawil n <0>GIPHY</0>. Asesmel G (yemmezg akked meṛṛa iwtayen), iɣewwaren n uḍfar ttwakksen, talɣut n temselɣut tettwasfeḍ seg yissutar, maca issutar n unadi d telɣut n tansa IP ad wwḍen yal tikkelt ɣer yiqeddacen-nsen." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Asaraw n uglam n tugna" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "I tugniwin timaynutin kan mi ara taruḍ tisuffaɣ timaynutin." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Tamawt: Tamahilt-a tesseqdac ameẓlu AI azɣaray, s ttawil n <0>img-alt-api</0>. YEzmer ur iteddu ara. Slid i tugniwin yerna s Teglizit." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Ilɣa ttusgarwen deg yidis n uqeddac" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Tamahilt deg takkayt n Alfa. Asfaylu n usegrew abruyan tettwasnerna d acu tameẓla n usegrew tazadurt." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Aktar/asifeḍ n \"Asigna\" i yiɣewwaren n yinegzumen" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ D armitan ugar.<0/>Yettwasekles deg tezmilin n umaɣnu-k. Tizmilin-a n umaɣnu (tusligin) ttuseqdacent s umata ɣef yimuɣna niḍen, ffrent ɣef umaɣnu-k." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Tamawt: Tamahilt-a tesseqdac API n uqeddac n usesteb yellan akka tura." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Askar uffir <0>(<1>Aḍris</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Semselsi aḍris s yiḥedren, lhan i tuṭṭfiwin n ugdil, i tiɣẓinin n tbaḍnit." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Ɣef" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Built</0> sɣur <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "S lmendad" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Mudd tawsa" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Tasertit tabaḍnit" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Asmel:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Lqem:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Azrir n lqem yettwanɣel" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "D awezɣi anɣal n uzrir n lqem" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Yecceḍ uleqqem n uglam. Ttxil-k, εreḍ tikkelt niḍen." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Yecceḍ tukksa n uglam. Ttxil-k, εreḍ tikkelt niḍen." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Ilɣa Push (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Ilɣa Push ttusweḥlen. Ttxil-k rmed-iten deg yiɣewwaren n yiminig." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Sireg seg <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "yal yiwen" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "imdanen I aneḍfar" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "imeḍfaṛen" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "T·Yeṭafaṛ" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Isestanen" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Ibeddilen n tsuffeɣt" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Tisirag Push ur ttwamuddent ara seg unekcum aneggaru. Tesriḍ <0><1>ad teqqneḍ</1> tikkelt niḍen i wakken ad tmuddeḍ tisirag push</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "Tamawt: Ilɣa Push teddun kan i <0>yiwen n umiḍan</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Ur teqqineḍ ara. Amiyigew (tiririt, azuzer, rtg) ur teddun ara." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Tasuffeɣt-a seg tummant niḍen (<0>{instance}</0>). Amyigew (tiririt, azuzer, rtg) ur ddint ara." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Tuccḍa: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Uɣal ɣer tummant-iw i urmad n umyigew" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "D awezɣi ad d-alint tririyin." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Tuɣalin" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Ddu ɣer tsuffeɣt tagejdant" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} n tsuffaɣ nnig - Ali d asawen" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Ddu ɣer yidis n uskan Peek" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Uɣal s uskan ummid" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Sken akk agbur amḥulfu" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Armitan" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "D awezɣi abeddel" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Uɣal ɣer tummant n tsuffeɣt ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Uɣal ɣer tummant n tsuffeɣt" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "D awezɣi alluy n tsuffeɣt" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# tiririt} other {<0>{1}</0> tiririyin}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# awennit} other {<0>{0}</0> iwenniten}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Wali tasuffeɣt s tririyin-is" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Amuceε ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Isalan mucaɛen" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Sɣur {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Uɣal ɣer uskan n tsuffaɣ mucaεen" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Askan n tsuffaɣ i d-ibedren <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Tisuffaɣ mucaɛen" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Ulac tisuffaɣ mucaɛen." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Amsaɣ n Mastodon yella yettwali-t s tmuɣli taḥeqqart." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Qqen s Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Jerred" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Qqen amiḍan-ik Mastodon/Fedivers i yellan.<0/>Inekcam-ik ur ttwaskelsen ara ɣef uqeddac-a." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Yettwabna</0> sɣur <1>@cheeaun</1>. <2>Tasertit n tbaḍnit</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Tuṭṭfa n ugdil n kaṛusel n yizuzar" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Kaṛusel n yizuzar" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Freq s tmuɣli tisuffaɣ tiɣbula akked tsufaɣ yettwalsen beṭṭu (tisuffaɣ yettwazuzren)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Tuṭṭfa n ugdil n yiwenniten yimyikcamen" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Azrar n yiwenniten yemyikcamen" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Ḍfer idiwenniyen war ussis. Tiririt s uzgen-afnaẓ." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Tuṭṭfa n ugdil n yilɣa yettusgerwen" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Ilɣa ttusgarwen" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Ilɣa uluten ttusgarwen syen ttufenẓen i usenqes seg temterwit." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Tuṭṭfa n ugdil n ugrudem n waṭas n tgejda" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Yiwet neɣ aṭas n tgejdiyin" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "S wudem amezwer, tigejdit tasuft i i umnadi n uskar Zen. Aṭas n tgejda ttwasestabent i yiseqdacen n tsaraɣt." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Tuṭṭfa n ugdil n tesnimirt n yihacṭagen s tferkit i tmerna n wugar ihacṭagen" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Tasnimirt n waṭas yihacṭagen" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Ugar n 5 yihacṭagen ttwasdukklen deg yiwet n tesnimirt." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Yettban-d iminig-ik yessewḥal isfuyla udhimen." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Tasuffaɣt tarewwayt tettwasemẓẓi akka tura. Suffeɣ neɣ sefsex-itt send timerna n yiwet n tmaynut." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Tasuffaɣt teldi akka tura. Suffeɣ neɣ sefsex-itt send timerna n yiwet n tmaynut." + diff --git a/src/locales/ko-KR.po b/src/locales/ko-KR.po new file mode 100644 index 00000000..53a0b863 --- /dev/null +++ b/src/locales/ko-KR.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ko\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Korean\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: ko\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "잠김" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "게시물: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "마지막 게시일: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "자동화됨" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "그룹" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "맞팔" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "요청함" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "팔로잉" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "날 팔로 함" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# 팔로워} other {# 팔로워}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "인증됨" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "<0>{0}</0> 가입" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "무기한" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "계정을 불러 올 수 없습니다." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "계정 페이지로 이동" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "팔로워" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "게시물" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "더 보기" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> 님은 새 계정으로 옮기셨습니다:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "핸들 복사됨" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "핸들을 복사할 수 없습니다" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "핸들 복사" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "원본 프로필 페이지로 가기" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "프로필 이미지 보기" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "프로필 헤더 보기" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "고인을 추모함" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "이 사용자는 해당 정보를 볼 수 없도록 설정했습니다." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0}개의 원문 게시물, {1}개의 댓글, {2}개의 부스트" + +#: 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 {지난 하루 동안 1개의 게시물} other {지난 {2}일 동안 1개의 게시물}}} other {{3, plural, one {지난 하루 동안 {4}개의 게시물} other {지난 {6}일 동안 {5}개의 게시물}}}}" + +#: 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 {지난 몇 해 동안 1개의 게시물} other {지난 몇 해 동안 {1}개의 게시물}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "원본" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "댓글" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "부스트" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "게시물 통계 못 봄." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "게시물 통계 보기" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "마지막 게시물: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "뮤트됨" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "차단됨" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "비공개 메모" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "<0>@{username}</0> 님 언급하기" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "소개문 번역" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "비공개 메모 고치기" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "비공개 메모 쓰기" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "@{username} 님의 게시물에 대한 알림 켜짐" + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "@{username} 님의 게시물에 대한 알림 꺼짐" + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "알림 끄기" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "알림 켜기" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "@{username} 님의 부스트 켜짐." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "@{username} 님의 부스트 꺼짐." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "부스트 끄기" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "부스트 켜기" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "리스트에서 더하기·빼기" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "링크 복사됨" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "링크를 복사할 수 없음" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "복사" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "공유 기능이 작동하지 않습니다." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "공유…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "@{username} 님 뮤트 풂" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "<0>@{username}</0> 님 뮤트 풀기" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "<0>@{username}</0> 님 뮤트…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "{0} 동안 @{username} 님 뮤트함" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "@{username} 님을 뮤트할 수 없음" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "<0>@{username}</0> 님을 팔로워에서 뺄까요?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} 님이 팔로워에서 빠짐" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "팔로워에서 빼기…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "<0>@{username}</0> 님을 차단할까요?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "@{username} 님 차단을 풂" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} 님을 차단함" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "@{username} 님 차단을 풀 수 없음" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "@{username} 님을 차단할 수 없음" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "<0>@{username}</0> 님 차단 풀기" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "<0>@{username}</0> 님 차단…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "<0>@{username}</0> 님 신고…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "프로필 고치기" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "팔로 요청을 취소할까요?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "@{0} 님을 그만 팔로할까요?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "그만 팔로하기…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "취소…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "팔로" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "닫기" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "번역된 소개문" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "리스트에서 뺄 수 없음." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "리스트에 더할 수 없음." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "리스트를 불러 올 수 없음." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "리스트가 없음." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "새 리스트" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "<0>@{0}</0> 님에 관한 비공개 메모" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "비공개 노트를 갱신할 수 없음." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "취소" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "저장하고 닫기" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "프로필을 갱신할 수 없음." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "이름" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "소개문" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "기타 항목" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "레이블" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "내용" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "저장" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "사용자명" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "서버 도메인 이름" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "가리기 모드 꺼짐" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "가리기 모드 켜짐" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "홈" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "쓰기" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "커스텀 에모지 더하기" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "설문 넣기" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "저장되지 않은 변경 사항이 있습니다. 해당 게시물을 지우시겠습니까?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {파일은 1개까지만 첨부할 수 있습니다.} other {파일은 #개 까지만 첨부할 수 있습니다.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "새 창으로 열기" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "최소화" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Parent window를 닫으신거 같습니다." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Parent window에 이미 작성 필드가 열려 있고 현재 게시 중인 것 같습니다. 완료될 때까지 기다렸다가 나중에 다시 시도하세요." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Parent window에 이미 작성 필드가 열려 있는 것 같습니다. 이 창을 열면 Parent window에서 변경한 내용이 취소됩니다. 계속하시겠습니까?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "창 합치기" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "@{0} 님 게시물에 답글 달기(<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "@{0} 님 게시물에 답글 달기" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "원본 게시물 고치기" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "설문에는 적어도 2개 이상의 선택지가 있어야 합니다" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "선택지 중에 비어있는 게 있습니다" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "첨부한 매체 중에 설명이 없는 게 있습니다. 그래도 올릴까요?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "첨부 파일 #{i} 실패" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "열람 주의" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "열람 주의 및 민감한 매체" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "공개" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "로컬" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "조용히 공개" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "팔로워만" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "쪽지" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "댓글 달기" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "게시물 고치기" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "지금은 무얼 하고 계신가요?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "민감하다고 표시" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "더하기" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "댓글" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "업데이트" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "올리기" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "움짤 받는 중…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "움짤 받기 실패" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "더 보기…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "올라감" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "이미지 설명" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "동영상 설명" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "오디오 설명" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "파일 크기가 너무 큽니다. 올리다가 문제가 생길 수 있습니다. 파일 크기를 {0}에서 {1} 이하로 줄여보세요." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "이미지 또는 동영상의 너비나 높이가 너무 큽니다. 올리다가 문제가 생길 수 있습니다. 너비와 높이를 {0}×{1} 픽셀에서 {2}×{3} 픽셀로 줄여보세요." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "초당 프레임 수가 너무 많습니다. 올리다가 문제가 생길 수 있습니다." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "지우기" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "오류" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "이미지 설명 고치기" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "동영상 설명 고치기" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "오디오 설명 고치기" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "설명을 자동 생성중. 잠시 기다려 주세요…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "설명을 자동 생성하는 데 실패했습니다: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "설명을 자동 생성하는 데 실패" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "설명 자동 생성…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "설명을 자동 생성하는 데 실패{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— 시범중</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "완료" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "선택지 {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "선다형 질문" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "기간" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "설문 지우기" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "계정 검색" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "계정 불러오기 오류" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "커스텀 에모지" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "에모지 검색" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "커스텀 에모지 불러오기 오류" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "최근 사용" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "기타" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0}개 더…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "움짤 검색" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "GIPHY 제공" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "움짤을 검색하려면 입력하세요" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "이전" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "다음" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "GIF 불러오기 오류" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "올리지 않은 초고" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "아직 올리지 않은 초고가 있는 것 같습니다. 쓰다 만 곳에서 계속하세요." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "이 초고를 지울까요?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "초고를 지우다가 오류가 났습니다! 다시 한 번 시도해 보세요." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "지우기…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "댓글 달 게시물을 불러 올 수 없습니다!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "모든 초고를 지울까요?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "초고를 지우다가 오류가 나았습니다! 다시 한 번 시도해 보세요." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "모두 지우기…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "초고를 찾을 수 없었습니다." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "설문" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "매체" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "새 창에서 열기" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "수락" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "거절" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "수락함" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "거절함" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "표시할 내용 없음" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "계정" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "더 보기…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "끝" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "키보드 단축키" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "키보드 단축키 도움말" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "다음 게시물" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "이전 게시물" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "다음 게시물로 캐러셀 넘기기" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "이전 게시물로 캐러셀 넘기기" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "새 게시물 불러오기" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "게시물 자세히 보기" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> 또는 <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "열람 주의를 펼치거나<0/>글타래 펼치기·접기" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "게시물 혹은 창 닫기" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> 또는 <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "멀티 칼럼 모드에서 특정 칼럼으로 이동" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> 에서 <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "새 게시물 쓰기" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "새 게시물 쓰기 (새 창)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "게시물 올리기" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> 또는 <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "검색" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "댓글 (새 창)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "좋아요 (즐겨찾기)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> 또는 <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "부스트" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "책갈피" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "가리기 모드 켜고 끄기" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "리스트 고치기" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "리스트를 고칠 수 없습니다." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "리스트를 만들 수 없습니다." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "리스트 구성원에게 단 댓글 보기" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "내가 팔로하는 사용자에게 단 댓글 보기" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "댓글은 숨기기" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "이 리스트의 게시물은 첫 화면 및 팔로잉 타임라인에서 가리기" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "만들기" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "리스트를 지울까요?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "리스트를 지울 수 없습니다." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "매체 설명" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "번역" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "말하기" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "원본 매체 새 창에서 열기" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "원본 매체 열기" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "이미지 설명을 생성중입니다. 잠시 기다려 주세요…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "이미지 설명 생성 실패" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "이미지 설명…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "게시물 보기" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "민감한 매체" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "필터됨: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "필터된" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "게시물이 올라갔습니다. 확인 해 보세요." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "댓글이 올라갔습니다. 확인 해 보세요." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "게시물이 고쳐졌습니다. 확인 해 보세요." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "메뉴" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "새로 고침하여 업데이트 할까요?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "새 버전이 올라왔습니다…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "따라잡기" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "언급" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "알림" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "신규" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "프로필" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "책갈피" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "좋아요" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "팔로하는 해시태그" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "필터" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "뮤트한 사용자" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "뮤트한 사용자들…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "차단한 사용자" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "차단한 사용자들…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "계정들…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "로그인" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "인기" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "연합" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "바로 가기·칼럼…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "설정…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "리스트" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "모든 리스트" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "알림" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "이 알림은 나의 다른 계정에서 왔습니다." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "모든 알림 보기" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} 님이 내 게시물에 {emojiObject} 반응을 남겼습니다." + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} 님이 게시물을 올렸습니다." + +#: src/components/notification.jsx:85 +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} 님이 내 댓글을 부스트했습니다.} other {{account} 님이 내 게시물을 부스트했습니다.}}} other {{account} 님이 내 게시물 {postsCount}개를 부스트했습니다.}}} other {{postType, select, reply {<0><1>{0}</1> 사람</0>이 내 댓글을 부스트했습니다.} other {<2><3>{1}</3> 사람</2>이 내 게시물을 부스트했습니다.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} 님이 나를 팔로합니다.} other {<0><1>{0}</1> 사람</0>이 나를 팔로합니다.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} 님이 나를 팔로하고 싶어합니다." + +#: src/components/notification.jsx:151 +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} 님이 내 댓글을 좋아합니다.} other {{account} 님이 내 게시물을 좋아합니다.}}} other {{account} 님이 내 게시물 {postsCount}개를 좋아합니다.}}} other {{postType, select, reply {<0><1>{0}</1> 사람</0>이 내 댓글을 좋아합니다.} other {<2><3>{1}</3> 사람</2>이 내 게시물을 좋아합니다.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "만들었거나 투표한 설문 조사가 끝났습니다." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "만든 설문 조사가 끝났습니다." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "투표한 설문 조사가 끝났습니다." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "좋아했거나 부스트 한 게시물이 고쳐졌습니다." + +#: src/components/notification.jsx:204 +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}님이 내 댓글을 부스트 및 좋아합니다.} other {{account}님이 내 게시물을 부스트 및 좋아합니다.}}} other {{account}님이 내 게시물 {postsCount}개를 부스트 및 좋아함.}}} other {{postType, select, reply {<0><1>{0}</1>명의 사람들이</0> 내 댓글을 부스트 및 좋아합니다.} other {<2><3>{1}</3>명의 사람들이</2> 내 게시물을 부스트 및 좋아합니다.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} 님이 가입했습니다." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} 님이 {targetAccount} 님을 신고했습니다." + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "<0>{name}</0> 서버와 연결 끊김." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "조정 경고" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "<0>{from}</0> 의 관리자가 <1>{targetName}</1> 를 일시 중단하였습니다, 이는 더 이상 업데이트를 받거나 상호 작용할 수 없다는 의미입니다." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "<0>{from}</0>의 관리자가 <1>{targetName}</1>를 차단하였습니다. 영향을 받는 팔로워: {followersCount}, 팔로잉: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "당신은 <0>{targetName}</0>를 차단하였습니다. 제거된 팔로워: {followersCount}, 팔로잉: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "중재 경고를 받았습니다." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "계정이 비활성화되었습니다." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "일부 게시물이 민감한 게시물로 처리되었습니다." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "내 게시물 몇 개가 지워졌습니다." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "앞으로의 게시물은 민감하다고 표시됩니다." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "계정이 제한되었습니다." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "계정이 정지되었습니다." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[알 수 없는 알림 유형: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "부스트·좋아한 사용자…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "좋아한 사람:" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "부스트한 사람:" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "팔로한 사람:" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "자세히 보기 <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "더 보기 →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "투표함" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# vote} other {# votes}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "결과 숨기기" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "투표" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "새로 고침" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "결과 보기" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, other {총 <1>{1}</1>표}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, other {총 <1>{1}</1>명}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "<0/>에 마감" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "마감" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "<0/> 내 마감" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "마감" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}초" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}분" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}시간" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "스팸" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "악성 링크, 허위 참여 또는 반복적인 댓글" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "불법" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "국내법 또는 서버 국가의 법을 위반" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "서버 규칙 위반" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "특정 서버 규칙 위반" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "위반" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "기타" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "어느 유형에도 속하지 않음" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "게시물 신고" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "@{username} 님 신고" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "검토 대기중" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "게시물 신고함" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "프로필 신고함" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "게시물을 신고할 수 없음" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "프로필을 신고할 수 없음" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "이 게시물에 어떤 문제가 있나요?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "이 프로필에 어떤 문제가 있나요?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "추가 정보" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "<0>{domain}</0>에 전달" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "신고하기" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "{username} 님 뮤트함" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "{username} 님을 뮤트할 수 없음" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "신고 <0>및 프로필 뮤트</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "{username} 님 차단함" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "{username} 님을 차단할 수 없음" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "신고 <0>및 프로필 차단</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ 계정, 해시태그 & 포스트</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "<0>{query}</0>이/가 포함된 게시물" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "<0>#{0}</0>로 태그된 게시물" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "<0>{query}</0> 찾기" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "<0>{query}</0>이/가 포함된 계정" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "홈·팔로잉" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "공개(로컬/연합)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "계정" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "해시태그" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "리스트 ID" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "로컬만" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "인스턴스" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "생략 가능 (예: mastodon.social)" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "검색어" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "멀티칼럼 모드가 아니면 생략 가능" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "예: 픽셀아트 (최대 5개, 띄어쓰기로 구분)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "매체만" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "바로 가기" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "베타" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "표시할 바로 가기 목록을 지정합니다:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "구석에 떠 있는 버튼" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "탭·메뉴 바" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "멀티칼럼" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "현재 보기 모드에서는 못 씀" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "위로 올리기" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "아래로 내리기" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "고치기" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "바로 가기/열을 두 개 이상 추가하여 작동하도록 합니다." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "아직 아무 칼럼도 없습니다. 칼럼 추가 버튼을 눌러 보세요." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "아직 아무 바로 가기도 없습니다. 바로 가기 추가 버튼을 눌러 보세요." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "뭘 넣어야 할 지 모르겠나요?<0/>우선 <1>홈·팔로잉과 알림</1>부터 넣어보세요." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "최대 {SHORTCUTS_LIMIT} 칼럼" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "최다 {SHORTCUTS_LIMIT}개의 바로 가기" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "가져오기·내보내기" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "칼럼 추가…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "바로 가기 추가…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "멀티 칼럼 모드의 경우 검색어가 필수이며, 그렇지 않으면 칼럼이 표시되지 않습니다." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "멀티 해시태그가 지원됩니다. (띄어쓰기로 구분)" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "바로 가기 고치기" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "바로 가기 추가" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "타임라인" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "리스트" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "<0>바로 가기</0> 가져오기·내보내기" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "가져오기" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "여기에 바로 가기를 붙이세요" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "인스턴스 서버에서 저장된 바로 가기를 받는 중…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "바로 가기 받을 수 없음" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "인스턴스 서버에서 바로 가기 받기" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* 현재 바로 가기에 이미 있음" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "다른 계정에서 온 리스트는 못 가져올 수 있습니다." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "잘못된 설정 형식" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "현재 바로 가기에 덧붙일까요?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "가져올 바로가기가 없습니다" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "바로 가기를 가져왔습니다. 최다치인 {SHORTCUTS_LIMIT}개를 넘겼으므로, 나머지는 가져오지 못했습니다." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "바로가기 복사됨" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "가져와서 덧붙이기…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "현재 바로가기를 덮어쓸까요?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "바로 가기를 가져올까요?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "또는 덮어쓰기…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "가져오기…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "내보내기" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "바로 가기 복사됨" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "바로 가기를 복사할 수 없음" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "바로 가기 설정을 복사함" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "바로 가기 설정을 복사할 수 없음" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "공유" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "바로 가기를 인스턴스 서버에 저장중…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "바로 가기 저장됨" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "바로 가기를 저장할 수 없음" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "인스턴스 서버에 동기화" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, other {# 글자}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "바로 가기 JSON 코드" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "인스턴스 서버에서 설정 가져오기·인스턴스 서버에 설정 내보내기 (매우 시범적)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> 님이 <1>부스트 함</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "죄송합니다. 현재 로그인한 인스턴스는 다른 인스턴스에 있는 이 게시물과 상호작용할 수 없습니다." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "@{0} 님의 게시물을 좋아했던 것 취소" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "@{0} 님의 게시물 좋아함" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "@{0} 님의 게시물에서 책갈피 뺌" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "@{0} 님의 게시물에 책갈피 꽂음" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "부스트 취소" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "인용" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "첨부한 매체 중에 설명이 없는 게 있습니다." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "오래된 게시물 (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "@{0} 님의 게시물 부스트 취소" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "@{0} 님의 게시물 부스트" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "부스트…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "좋아요 취소" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "좋아요" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "책갈피 빼기" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "<0>@{0}</0> 님의 게시물 보기" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "수정 내역 보기" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "{editedDateText}에 고쳐짐" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "게시물 임베드하기" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "대화 뮤트 풀림" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "대화 뮤트됨" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "대화 뮤트를 풀 수 없음" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "대화를 뮤트할 수 없음" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "대화 뮤트 풀기" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "대화 뮤트하기" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "프로필에 고정됐던 게시물을 내림" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "게시물이 프로필에 고정됨" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "게시물 고정을 풀 수 없음" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "게시물을 고정할 수 없음" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "프로필에 고정된 게시물 내리기" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "프로필에 고정" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "게시물을 지울까요?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "게시물 지워짐" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "게시물 지울 수 없음" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "게시물 신고…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "좋아함" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "부스트함" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "책갈피 꽂음" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "고정됨" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "지워짐" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, other {#개의 댓글}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "글타래{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "접기" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "내용 보기" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "매체 보기" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "고쳐짐" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "댓글들" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "수정 내역" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "내역 불러오기 실패" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "불러오는 중…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML 코드" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML 코드 복사됨" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "HTML 코드를 복사하지 못 함" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "첨부된 매체:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "계정 에모지:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "정적 URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "에모지:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "메모:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "정적이며 스타일이나 JavaScript가 적용되지 않습니다. 필요에 따라 직접 스타일을 적용하시거나 고쳐서 쓰셔야 합니다." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "설문 조사는 상호작용하지 않으며, 투표수가 고정된 목록으로 표현됩니다." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "첨부 매체는 이미지나 동영상, 오디오 등 아무 파일이나 됩니다." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "원본 게시물은 나중에 고쳐지거나 지워질 수 있습니다." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "미리 보기" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "참고로 위 미리 보기는 다소 스타일이 적용되어 있습니다." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> 님이 부스트 함" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "새 게시물" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "재시도" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "글타래" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>필터됨</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "{sourceLangText}에서 자동 번역됨" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "번역중…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "{sourceLangText}(자동 인식됨)를 번역" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "{sourceLangText}를 번역" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "자동 ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "번역 실패" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "소스 상태 고치기" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "@{0} 님께 댓글" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "이제 이 페이지를 닫아도 됩니다." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "창 닫기" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "로그인이 필요합니다." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "홈 가기" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "계정 게시물" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ 댓글)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- 부스트)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (매체)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "필터 초기화" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "초기화" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "댓글이 달린 게시물 보기" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ 댓글" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "부스트 빼고 게시물 보는 중" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- 부스트" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "매체와 함께 게시글 보여주기" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "#{0} 으로 태그된 게시물 보여주기" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "{0} 에서 게시글 보여주기" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "아직 표시할 내용이 없습니다." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "게시물을 불러 올 수 없습니다" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "계정 정보를 가져올 수 없음" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "해당 계정의 인스턴스로 전환 {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "내 인스턴스로 전환 (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "월" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "현재 계정" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "기본 계정" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "이 계정으로 전환" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "새 탭/창으로 변경하기" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "프로필 보기..." + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "기본 계정으로 삼기" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "로그아웃 <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "로그아웃…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "다른 계정 추가" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "참고: <0>기본 계정</0>은 언제나 가장 먼저 뜹니다. 교체한 계정들은 세션 내내 유지됩니다." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "아직 북마크한 것이 없습니다. 북마크 하나 해보세요!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "책갈피를 불러 올 수 없습니다." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "지난 1시간" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "지난 2시간" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "지난 3시간" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "지난 4시간" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "지난 5시간" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "지난 6시간" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "지난 7시간" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "지난 8시간" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "지난 9시간" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "지난 10시간" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "지난 11시간" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "지난 12시간" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "12시간 이상" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "팔로우한 태그" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "그룹" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "따라잡기 <0>베타</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "도움말" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "이게 무엇인가요?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "따라잡기는 이메일에서 영감을 받은 간단한 인터페이스의 별도 타임라인으로, 게시물들이 간편하게 정리 및 필터링되어 한눈에 파악할 수 있는 인터페이스입니다." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "따라잡기 미리 보기" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "따라잡아 볼까요?" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "내가 팔로하는 게시물들을 따라잡아 봅시다." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "다음 기간의 모든 게시물을 봅니다:" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "최대한 많이" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "따라잡기" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "마지막 따라잡기와 기간이 겹칩니다" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "마지막 따라잡기 때({0})까지" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "주의: 인스턴스가 기간 설정과 무관하게 타임라인에서 최대 800개(또는 내외)의 게시물까지만 보여줄 수도 있습니다." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "이전 따라잡기:" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, other {게시물 #개}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "이 따라잡기를 지울까요?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "참고: 총 3개까지만 보존됩니다. 나머지는 알아서 지워집니다." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "게시물 불러오는 중…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "시간이 조금 걸릴 수 있습니다." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "필터 초기화" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "인기 링크" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "{0} 이 공유함" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "전체" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, other {글쓴이 #명}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "정렬" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "날짜" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "밀도" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "글쓴이" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "안 묶음" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "모든 글쓴이 보기" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "다 읽을 필요는 없답니다." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "이게 다입니다." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "맨 위로 올라가기" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "팔로한 사람들이 공유한 링크를 공유·부스트·좋아요 수가 많은 순서로 보여줍니다." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "정렬: 밀도" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "게시물을 정보 밀도가 높거나 낮은 순서로 보여줍니다. 짧은 게시물은 정보 밀도가 “낮고”, 긴 게시물은 “높다”고 봅니다. 이미지가 첨부된 게시물은 이미지가 없는 게시물보다 정보 밀도가 “높다”고 봅니다." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "묶기: 글쓴이" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "글이 글쓴이에 따라 묶이며, 게시물이 많은 글쓴이가 앞에 나옵니다." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "다음 글쓴이" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "이전 글쓴이" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "맨 위로" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "필터됨: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "아직 좋아요가 없습니다. 좋아요를 눌러보세요!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "좋아요를 불러올 수 없음" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "홈 및 리스트" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "공개 타임라인" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "대화" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "프로필" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "안 함" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "새 필터" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "필터를 로드할 수 없음." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "아직 아무 필터도 없습니다." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "필터 추가" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "필터 고치기" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "필터를 고칠 수 없음" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "필터를 생성할 수 없음" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "제목" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "전체 단어" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "검색어가 없으니 추가하세요." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "검색어 추가" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, other {검색어 #개}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "…로 부터 필터" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "※ 아직 미구현" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "상태: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "만기 변경" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "만기" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "필터된 게시글은..." + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "최소화됨" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "숨김" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "이 필터를 지울까요?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "필터를 지울 수 없습니다." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "만료됨" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "<0/> 만료됨" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "만기 없음" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, other {해시태그 #개}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "팔로하는 해시태그를 불러 올 수 없습니다." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "아직 아무 해시태그도 팔로하지 않습니다." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "표시할 내용이 없습니다." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "게시물을 불러 올 수 없습니다." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{instance} 상의 {hashtagTitle} (매체만)" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{instance} 상의 {hashtagTitle}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (매체만)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "해당 태그를 포함한 게시물을 불러올 수 없습니다" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "#{hashtag} 를 그만 팔로우할까요?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "#{hashtag} 팔로 풂" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "#{hashtag} 팔로함" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "팔로잉…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "프로필에 표시되지 않음" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "프로필에 표시되지 않음 기능을 사용할 수 없습니다." + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "프로필에 내보임" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "프로필에 내보이기" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "해시태그 더하기" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "해시태그 지우기" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "이 바로 가기는 이미 있습니다" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "해시태그 바로 가기가 추가됨" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "바로 가기 추가" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "새 인스턴스 입력 (예: mastodon.social)" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "잘못된 인스턴스" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "다른 인스턴스로 가기…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "내 인스턴스(<0>{currentInstance}</0>)로 가기" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "알림을 불러 올 수 없습니다." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>새</0> <1>팔로 요청</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "모두 보기" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "불러오는 중…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "URL을 불러올 수 없음" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "아직 아무 것도 없습니다." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "구성원 관리" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "<0>@{0}</0> 님을 리스트에서 뺄까요?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "지우기…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, other {리스트 #개}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "아직 아무 리스트도 없습니다." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "앱 등록에 실패함" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "인스턴스 도메인" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "예: “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "계속" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "계정이 없으신가요? 하나 만드세요!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "쪽지" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "쪽지" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "아무도 언급하지 않았습니다" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "언급을 가져올 수 없습니다." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "팔로하지 않은 사람" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "날 팔로하지 않는 사람" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "새 계정으로" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "모더레이터를 통해 제한된 유저" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "알림 설정" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "새 알림" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, other {공지}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "팔로 요청" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, other {팔로 요청 #건}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, other {#사람으로부터 필터된 알림}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "내 언급만" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "오늘" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "모두 따라잡았습니다." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "어제" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "알림을 가져올 수 없음" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "알림 설정이 바뀜" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "다음 사용자로부터 알림을 제외:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "필터" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "무시" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "<0>{0}</0> 업데이트됨" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "<0>@{0}</0> 로부터 받은 알림 보기" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "<0>@{0}</0> 로부터 받은 알림" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "<0>@{0}</0> 로부터 받은 알림은 이제부터 필터링되지 않습니다." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "수락" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "알림 요청을 해제할 수 없습니다." + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "닫기" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "닫힘" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "로컬 타임라인 ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "연합 타임라인 ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "로컬 타임라인" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "연합 타임라인" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "아직 아무도 게시물을 쓰지 않았습니다." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "연합으로 변경하기" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "로컬로 변경하기" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "검색: {q} (게시물)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "검색: {q} (계정)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "검색: {q} (해시태그)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "검색: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "해시태그" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "더 보기" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "계정 더 보기" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "아무 계정도 찾을 수 없습니다." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "해시태그 더 보기" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "아무 해시태그도 찾을 수 없습니다." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "게시물 더 보기" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "아무 게시물도 찾을 수 없습니다." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "시작하려면 위 검색창에 검색어를 입력하거나 URL을 붙여 넣으세요." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "설정" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "외관" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "밝게" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "어둡게" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "자동" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "글자 크기" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "글" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "표시 언어" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "번역 참여하기" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "게시" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "기본 공개 범위" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "동기화 됨" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "게시물 공개 범위 수정 실패" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "인스턴스 서버의 설정과 동기화 됩니다. <0>쓰고 있는 인스턴스({instance})에서 더 많은 설정이 가능합니다.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "시범 기능" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "타임라인 게시물 알아서 새로 고침" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "부스트 캐러셀" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "게시물 번역" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "다음 언어로 번역:" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "시스템 언어 ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {다음 언어에 대해 “번역” 버튼 가리기:} other {다음 #개 언어에 대해 “번역” 버튼 가리기:}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "참고: 이 기능은 외부 번역 서비스인 <0>Lingva API</0> & <1>Lingva Translate</1>를 이용합니다." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "자동 번역" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "타임라인에서 게시물에 번역을 자동으로 보여줍니다. 열람 주의나 매체, 설문 조사가 없는 <0>짧은</0> 게시물에만 적용 됩니다." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "글쓰기 창에서 움짤 고르기" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "이 기능은 외부 움짤 검색 서비스인 <0>GIPHY</0>를 이용합니다. 전체관람가 움짤만 제공되며, 추적 매개변수는 제거되고 리퍼러 정보는 요청에서 생략되지만, 그럼에도 검색어와 IP 주소 정보는 해당 서비스에 전달 됩니다." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "이미지 설명 자동 생성기" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "새 게시물을 쓸 때 새로운 이미지에만 적용 됩니다." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "참고: 이 기능은 외부 인공지능 서비스인 <0>img-alt-api</0>를 이용합니다. 잘 동작하지 않을 수 있으며, 이미지에만 적용 가능하고 영어만 지원합니다." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "서버측에서 알림 묶기" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "알파 단계 기능입니다. 묶음의 크기가 커질 수도 있지만, 묶는 규칙은 기초적입니다." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "바로 가기 설정을 위해 \"클라우드\" 가져오기/내보내기" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "알림: 이 기능은 현재 로그인한 인스턴스 서버 API를 사용합니다." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "가리기 모드 <0>(<1>글자들</1> → <2>███</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "글자를 모두 네모로 바꿔서 개인정보 염려 없이 스크린숏을 캡처할 수 있게 합니다." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "정보" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<1>@cheeaun</1>이 <0>만듦</0>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "후원자" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "기부" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "개인 정보 보호 정책" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>사이트:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>버전:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "버전 번호 복사 됨" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "버전 번호를 복사할 수 없음" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "구독을 갱신하는 데 실패했습니다. 다시 시도해 보세요." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "구독을 삭제하는 데 실패했습니다. 다시 시도하세요." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "푸시 알림 (베타)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "푸시 알림이 차단되었습니다. 브라우저 설정에서 푸시 알림을 활성화하세요." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "<0>{0}</0>에게서 알림 받기" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "모두" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "내가 팔로하는 사람들" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "팔로워" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "팔로" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "설문 조사" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "게시물 수정" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "마지막 로그인 이후 푸시 권한이 부여되지 않았습니다. <0>푸시 권한을 다시 얻으려면<1>로그인</1>을</0>해야합니다." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "주의: 푸시 알림은 <0>단 하나의 계정</0>에만 작동합니다." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "로그인하지 않았습니다. 상호작용(댓글, 부스트 등) 은 불가능합니다." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "이 게시글은 다른 인스턴스 (<0>{instance}</0>) 에서 작성돠었습니다. 상호작용(댓글, 부스트 등) 은 불가능합니다." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "오류: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "내 인스턴스를 변경해 상호작용을 활성화시키기" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "댓글을 불러 올 수 없습니다." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "뒤로" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "원 게시물로 이동하기" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "전체 화면으로 전환" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "모든 민감한 내용 보기" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "시범적" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "전환할 수 없음" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "게시물의 인스턴스로 전환 ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "게시물의 인스턴스로 전환" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "게시물을 불러 올 수 없습니다" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, other {댓글 <0>{1}</0>개}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, other {댓글 <0>{0}</0>개}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "게시물과 댓글 보기" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "인기 ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "인기 뉴스" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "인기 게시물 보기로 되돌아가기" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "<0>{0}</0> 님을 언급하는 게시물 보기" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "인기 게시물" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "인기 게시물이 없음." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "미니멀리즘을 추구하는 Mastodon 웹 클라이언트." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Mastodon으로 로그인" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "가입" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "기존 Mastodon/Fediverse 계정을 연결하세요.<0/>당신의 인증 수단은 이 서버에 저장되지 않습니다." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "부스트 캐러셀의 스크린숏" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "부스트 캐러셀" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "그룹 알림" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "멀티 칼럼 UI 스크린샷" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "한 칼럼 혹은 멀티칼럼" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "기본적으로는 젠 모드를 추구하는 분들을 위해 한 칼럼으로 보입니다. 고급 사용자들을 위한 멀티 칼럼도 설정 가능합니다." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "해시태그를 더 추가할 수 있는 양식이 있는 멀티 해시태그 타임라인 스크린샷" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "다중 해시태그 타임라인" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "한 타임라인에 최대 5개 해시태그까지 지정할 수 있습니다." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "웹브라우저에서 팝업 윈도를 차단한 것 같습니다." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "게시글 초고가 현재 최소화되어있습니다. 새로운 게시글을 작성하기 전 올리거나 지우세요." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "게시글이 현재 열려있습니다. 새로운 게시글을 작성하기 전 올리거나 지우세요." + diff --git a/src/locales/lt-LT.po b/src/locales/lt-LT.po new file mode 100644 index 00000000..95f2ce7b --- /dev/null +++ b/src/locales/lt-LT.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: lt\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 19:32\n" +"Last-Translator: \n" +"Language-Team: Lithuanian\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && (n%100>19 || n%100<11) ? 0 : (n%10>=2 && n%10<=9) && (n%100>19 || n%100<11) ? 1 : n%1!=0 ? 2: 3);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: lt\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Užrakinta" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Įrašai: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Paskutinį kartą paskelbta: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatizuotas" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Grupuoti" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Bendri" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Paprašyta" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Sekama" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Seka tave" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# sekėjas} few {# sekėjai} many {# sekėjo} other {# sekėjų}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Patvirtinta" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Prisijungė <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Visam laikui" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Nepavyksta įkelti paskyros." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Eiti į paskyros puslapį" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Sekėjai" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Sekimai" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Įrašai" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Daugiau" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> nurodė, kad jų naujoji paskyra dabar yra:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Nukopijuotas socialinis medijos vardas" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Nepavyksta nukopijuoti socialinės medijos vardo." + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Kopijuoti socialinės medijos vardą" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Eiti į originalų profilio puslapį" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Peržiūrėti profilio vaizdą" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Peržiūrėti profilio antraštę" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "Atminimui" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Šis naudotojas pasirinko nepadaryti šią informaciją prieinamą." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} originalūs įrašai, {1} atsakymai, {2} pasidalinimai" + +#: 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 {Paskutinis {0} įrašas per pastarąją {1} dieną} few {Paskutinis 1 įrašas per pastarąsias {2} dienas} many {Paskutinis 1 įrašas per pastarąsias {2} dienos} other {Paskutinis 1 įrašas per pastarąsias {2} dienų}}} few {{3, plural, one {Paskutiniai {4} įrašai per pastarąją 1 dieną} few {Paskutiniai {5} įrašai per pastarąsias {6} dienas} many {Paskutinio {5} įrašo per pastaruosius {6} dienos} other {Paskutinių {5} įrašų per pastarąsias {6} dienų}}} many {{3, plural, one {Paskutiniai {4} įrašai per pastarąją 1 dieną} few {Paskutiniai {5} įrašai per pastarąsias {6} dienas} many {Paskutinio {5} įrašo per pastaruosius {6} dienos} other {Paskutinių {5} įrašų per pastarąsias {6} dienų}}} other {{3, plural, one {Paskutiniai {4} įrašai per pastarąją 1 dieną} few {Paskutiniai {5} įrašai per pastarąsias {6} dienas} many {Paskutinio {5} įrašo per pastaruosius {6} dienos} other {Paskutinių {5} įrašų per pastarąsias {6} dienų}}}}" + +#: 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 {{1} paskutinis įrašas per pastaruosius metus} few {{1} paskutiniai įrašai per pastaruosius metus} many {{1} paskutinio įrašo per pastaruosius metus} other {{1} paskutinių įrašų per pastaruosius metus}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Originalūs" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Atsakymai" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Pasidalinimai" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Įrašo statistika nepasiekiama." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Peržiūrėti įrašų statistiką" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Paskutinis įrašas: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Nutildyta" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Užblokuota" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Privati pastaba" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Paminėti <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Versti biografiją" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Redaguoti privačią pastabą" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Pridėti privačią pastabą" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Įjungti pranešimai apie @{username} įrašus." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Išjungti pranešimai apie @{username} įrašus." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Išjungti pranešimus" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Įjungti pranešimus" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Įjungti pasidalinimai iš @{username}." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Išjungti pasidalinimai iš @{username}." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Išjungti pasidalinimus" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Įjungti pasidalinimus" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Pridėti / šalinti iš sąrašų" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Nukopijuota nuorada" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Nepavyksta atidaryti nuorodos." + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopijuoti" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Atrodo, kad bendrinimas neveikia." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Bendrinti…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Atšauktas @{username} nutildymas" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Atšaukti nutildymą <0>@{username}></0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Nutildyti <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Nutildytas @{username} dėl {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Nepavyksta nutildyti @{username}." + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Pašalinti <0>@{username}</0> iš sekėjų?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} pašalintas iš sekėjų" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Šalinti sekėją…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Bluokuoti <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Atblokuotas @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Užblokuotas @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Nepavyksta atblokuoti @{username}." + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Nepavyksta užblokuoti @{username}." + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Atblokuoti <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Bluokuoti <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Pranešti apie <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Redaguoti profilį" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Atšaukti sekimo prašymą?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Nebesekti @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Nebesekti…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Atšaukti…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Sekti" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Uždaryti" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Išversta biografija" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Nepavyksta pašalinti iš sąrašo." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Nepavyksta pridėti prie sąrašo." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Nepavyksta įkelti sąrašų." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Nėra sąrašų." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Naujas sąrašas" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Privati pastaba apie <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Nepavyksta atnaujinti privačios pastabos." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Atšaukti" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Išsaugoti ir uždaryti" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Nepavyksta atnaujinti profilio." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Pavadinimas" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Biografija" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Papildomi laukai" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etiketė" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Turinys" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Išsaugoti" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "naudotojo vardas" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "serverio domeno vardas" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Išjungtas slėpimo režimas" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Įjungtas slėpimo režimas" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Pagrindinis" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Sukurti" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Pridėti mediją" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Pridėti pasirinktinį jaustuką" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Pridėti GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Pridėti apklausą" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Turite neišsaugotų pakeitimų. Atmesti šią įrašą?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {{1} failas nepalaikomas.} few {{2} failai nepalaikomi.} many {{2} failo nepalaikoma.} other {{2} failų nepalaikoma.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Galite pridėti tik iki # failo.} few {Galite pridėti tik iki # failų.} many {Galite pridėti tik iki # failo.} other {Galite pridėti tik iki # failų.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Išskleisti" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Sumažinti" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Atrodo, kad uždarėte pirminį langą." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Atrodo, kad pirminiame lange jau atidarytas sukūrimo laukas ir šiuo metu skelbiamas. Palauk, kol jis bus baigtas, ir pabandyk dar kartą vėliau." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Atrodo, kad pirminiame lange jau yra atidarytas sukūrimo laukas. Suskleisčius šiame lange, bus atmesti pakeitimai, kuriuos padarėte pirminiame lange. Tęsti?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Suskleisti" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Atsakant į @{0} įrašą (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Atsakant į @{0} įrašą" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Redaguojamas šaltinio įrašas" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Apklausa turi turėti bent 2 parinktis." + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Kai kurie apklausos pasirinkimai yra tušti." + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Kai kurios medijos neturi aprašymų. Tęsti?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Nepavyko #{i} priedas." + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Turinio įspėjimas" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Turinio įspėjimas arba jautri medija" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Vieša" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Vietinis" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Neįtrauktas į sąrašą" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Tik sekėjai" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Privatus paminėjimas" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Skelbti savo atsakymą" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Redaguoti savo įrašą" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Ką tu darai?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Žymėti mediją kaip jautrią" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Pridėti" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Atsakyti" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Atnaujinti" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Skelbti" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Atsisiunčiama GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Nepavyko atsisiųsti GIF." + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Daugiau…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Įkelta" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Vaizdo aprašymas" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Vaizdo įrašo aprašymas" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Garso įrašo aprašymas" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Per didelis failo dydis. Įkeliant gali kilti problemų. Bandyk sumažinti failo dydį nuo {0} iki {1} arba mažiau." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Per didelis matmuo. Įkeliant gali kilti problemų. Bandyk sumažinti matmenis nuo {0}×{1} tšk. iki {2}×{3} tšk." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Per didelis kadrų dažnis. Įkeliant gali kilti problemų." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Šalinti" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Klaida" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Redaguoti vaizdo aprašymą" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Redaguoti vaizdo įrašo aprašymą" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Redaguoti garso įrašo aprašymą" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Generuojamas aprašymas. Palauk…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Nepavyko sugeneruoti aprašymo: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Nepavyko sugeneruoti aprašymo." + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Generuoti aprašymą…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Nepavyko sugeneruoti aprašymo: {0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>– eksperimentinė</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Atlikta" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "{0} pasirinkimas" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Keli pasirinkimai" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Trukmė" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Šalinti apklausą" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Ieškoti paskyrų" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Klaida įkeliant paskyras." + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Pasirinktiniai jaustukai" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Ieškoti jaustukų" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Klaida įkeliant pasirinktinius jaustukus." + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Neseniai naudoti" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Kiti" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} daugiau…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Ieškoti GIF" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Veikiama su „GIPHY“" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Rašyk, kad ieškotum GIF" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Ankstesnis" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Kitas" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Klaida įkeliant GIF." + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Neišsiųsti juodraščiai" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Atrodo, kad turi neišsiųstų juodraščių. Tęskime nuo ten, kur baigei." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Ištrinti šį juodraštį?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Klaida ištrinant juodraštį. Bandyk dar kartą." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Ištrinti…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Klaida gaunant atsakymo į būseną." + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Ištrinti visus juodraščius?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Klaida ištrinant juodraščius. Bandyk dar kartą." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Ištrinti visus…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Juodraščių nerasta." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Apklausa" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Medija" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Atidaryti naujame lange" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Priimti" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Atmesti" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Priimta" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Atmesta" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Nėra ką rodyti." + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Paskyros" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Rodyti daugiau…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Pabaiga." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Spartieji klaviatūros klavišai" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Spartieji klaviatūros klavišos žinynas" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Sekantis įrašas" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Ankstesnis įrašas" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Praleisti karuselę į kitą įrašą" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Lyg2 (Shift)</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Praleisti karuselę į ankstesnį įrašą" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Lyg2 (Shift)</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Įkelti naujų įrašų" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Atidaryti įrašo informaciją" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Įvesti (Enter)</0> arba <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Išskleisti turinio įspėjimą arba<0/>perjungti išskleistą / suskleistą giją" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Uždaryti įrašą arba dialogo langus" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Gr (Esc)</0> arba <1>Naikinimo klavišas (Backspace)</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Fokusuoti stulpelį daugiastulpelių režime" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> iki <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Fokusuoti sekantį stulpelį daugiastulpelių režime" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Fokusuoti ankstesnį stulpelį daugiastulpelių režime" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Sukurti naują įrašą" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Sukurti naują įrašą (naujas langas)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Lyg2 (Shift)</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Siųsti įrašą" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Vald (Ctrl)</0> + <1>Įvesti (Enter)</1> arba <2>⌘</2> + <3>Įvesti (Enter)</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Paieška" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Atsakyti (naujas langas)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Lyg2 (Shift)</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Patinka (pamėgti)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> arba <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Pasidalinti" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Lyg2 (Shift)</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Prid. į žym." + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Perjungti slėpimo režimą" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Lyg2 (Shift)</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Redaguoti sąrašą" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Nepavyksta redaguoti sąrašo." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Nepavyksta sukurti sąrašo." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Rodyti atsakymus sąrašo nariams" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Rodyti atsakymus žmonėms, kuriuos seku" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Nerodyti atsakymų" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Paslėpti šio sąrašo pranešimus iš pagrindinio / sekimo" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Kurti" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Ištrinti šį sąrašą?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Nepavyksta ištrinti sąrašo." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Medijos aprašymas" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Versti" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Kalbėti" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Atidaryti originalią mediją naujame lange" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Atidaryti originalią mediją" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Bandymas apibūdinti vaizdą. Palauk…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Nepavyko apibūdinti vaizdo." + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Apibūdinti vaizdą…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Peržiūrėti įrašą" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Jautri medija" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtruota: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtruota" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Įrašas paskelbtas. Peržiūrėk." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Atsakymas paskelbtas. Peržiūrėk." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Įrašas atnaujintas. Peržiūrėk." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Meniu" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Perkrauti puslapį dabar, kad atnaujinti?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Yra naujas naujinimas…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Sekimai" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Pasivijimas" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Paminėjimai" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Pranešimai" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Naujas" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profilis" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Žymės" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Patiktukų" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Sekamos saitažodžiai" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtrai" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Nutildyti naudotojai" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Nutildyti naudotojai…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Užblokuoti naudotojai" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Užblokuoti naudotojai…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Paskyros…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Prisijungti" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Tendencinga" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federacinis" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Trumposios nuorodos / stulpeliai…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Nustatymai…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Sąrašai" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Visi sąrašai" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Pranešimas" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Šis pranešimas yra iš kitos tavo paskyros." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Peržiūrėti visus pranešimus" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} sureagavo į tavo įrašą su {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} paskelbė įrašą." + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, one {{0} seka tave.} few {<0><1>{0}</1> žmonės</0> seka tave.} many {<0><1>{0}</1> žmones</0> seka tave.}=1 {{account}} other {<0><1>{0}</1> žmonių</0> seka tave.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} paprašė tave sekti." + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Baigėsi apklausa, kurioje balsavai arba kurią sukūrei." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Baigėsi apklausa, kurią sukūrei." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Prižiūrėjimo įspėjimas" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "Jūsų #Wrapstodon {year} jau čia!" + +#: src/components/notification.jsx:272 +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." +msgstr "Administratorius (-ė) iš <0>{from}</0> pristabdė <1>{targetName}</1>, o tai reiškia, kad nebegali gauti iš jų naujienų ir su jais bendrauti." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Užblokavote <0>{targetName}</0>. Pašalinti sekėjai: {followersCount}, sekimai: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Tavo paskyra gavo prižiūrėjimo įspėjimą." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Tavo paskyra buvo išjungta." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Kai kurie tavo įrašai buvo pažymėtos kaip jautrios." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Kai kurios tavo įrašai buvo ištrinti." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Nuo šiol tavo įrašai bus pažymėti kaip jautrūs." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Tavo paskyra buvo apribota." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Tavo paskyra buvo pristabdyta." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Nežinomas pranešimo tipas: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Pasidalino / patiko…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Patiko…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Pasidalino…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Seka…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Sužinoti daugiau <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "Peržiūrėti #Wrapstodon" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Skaityti daugiau →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Balsuota" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# balsas} few {# balsai} many {# balso} other {# balsų}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Slėpti rezultatus" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Balsuoti" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Atnaujinti" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Rodyti rezultatus" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> balsas} few {<1>{1}</1> balsai} many {<1>{1}</1> balso} other {<1>{1}</1> balsų}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> balsuotojas} few {<1>{1}</1> balsuotojai} many {<1>{1}</1> balsuotojo} other {<1>{1}</1> balsuotojų}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Baigėsi <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Baigėsi" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Baigsis <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Baigsis" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0} sek." + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0} min." + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0} val." + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Brukalas" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Kenkėjiškos nuorodos, netikras įsitraukimas arba pasikartojantys atsakymai" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Neteisėta" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Pažeidžia tavo arba serverio šalies įstatymus" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Serverio taisyklių pažeidimas" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Pažeidžia konkrečias serverio taisykles" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Pažeidimas" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Kita" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Problema netinka kitoms kategorijoms" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Pranešti apie įrašą" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Pranešti apie @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Laukiama apžvalgos" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Nepavyksta pranešti apie profilį" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Papildoma informacija" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Persiųsti į <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Užblokuotas {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Nepavyksta užblokuoti {username}." + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Siųsti ataskaitą <0>+ blokuoti profilį</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ paskyros, saitažodžiai ir įrašai</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Įrašai su <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Įrašai pažymėti su <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Ieškoti <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Paskyros su <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Pagrindinis / sekimai" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Viešieji (vietiniai / federaciniai)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Paskyra" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Saitažodis" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "Sąrašo ID" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Tik vietinė" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Serveris" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Pasirinktinis, pvz., mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Paieškos terminas" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Pasirinktinis, nebent naudojamas daugiastulpelių režimas" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "pvz., „PixelArt“ (ne daugiau kaip 5, atskirti tarpais)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Tik medija" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Trumposios nuorodos" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta versija" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Nurodyk trumpųjų nuorodų sąrašą, kuris bus rodomas kaip:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Slankusis mygtukas" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Skirtukas / meniu juosta" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Daugiastulpelių" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Nepasiekiama dabartiniame rodinio režime." + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Perkelti aukštyn" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Perkelti žemyn" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Redaguoti" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Pridėk daugiau nei vieną trumpąją nuorodą / stulpelį, kad tai veiktų." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Kol kas nėra stulpelių. Paliesk mygtuką Pridėti stulpelį." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Kol kas nėra trumpųjų nuorodų. Paliesk mygtuką Pridėti trumpąją nuorodą." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Nežinai, ką pridėti?<0/>Pirmiausia pabandyk pridėti <1>Pagrindinis / sekimai ir pranešimai</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Didžiausias {SHORTCUTS_LIMIT} stulpelių skaičius" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Didžiausias {SHORTCUTS_LIMIT} trumpųjų nuorodų skaičius" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importuoti / eksportuoti" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Pridėti stulpelį…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Pridėti trumpąją nuorodą…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Konkretus sąrašas neprivalomas. Daugiastulpelių režime sąrašas yra privalomas, kitaip stulpelis nebus rodomas." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Daugiastulpelių režime privaloma nurodyti paieškos terminą, kitaip stulpelis nebus rodomas." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Palaikomi keli saitažodžiai. Atskirti tarpais." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Redaguoti trumpąją nuorodą" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Pridėti trumpąją nuorodą" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Laiko skalė" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Sąrašas" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importuoti / eksportuoti <0>trumposios nuorodos</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importuoti" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Įklijuok trumpąsias nuorodas čia" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Atsisiunčiamos išsaugotos trumposios nuorodos iš serverio…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Nepavyksta atsisiųsti trumpųjų nuorodų." + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Atsisiųsti trumpųjų nuorodų iš serverio" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Egzistuoja dabartiniuose trumpuosiuose nuorodose" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Sąrašas gali neveikti, jei jis yra iš kitos paskyros." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Netinkamas nustatymų formatas" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Pridėti prie esamų trumpųjų nuorodų?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Bus pridėti tik tie trumpieji nuorodos, kurių neegzistuoja dabartinėse trumposiose nuorodose." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Nėra naujų trumpųjų nuorodų importuoti" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Importuotos trumposios nuorodos. Viršytas didžiausias {SHORTCUTS_LIMIT} ribą, todėl likusieji neimportuojami." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Importuotos trumposios nuorodos" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importuoti ir pridėti…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Perrašyti esamas trumpąsias nuorodas?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Importuoti trumpąsias nuorodas?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "arba perrašyti…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importuoti…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Eksportuoti" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Nukopijuotos trumposios nuorodos" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Nepavyksta nukopijuoti trumpųjų nuorodų." + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Nukopijuoti trumpųjų nuorodų nustatymai" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Nepavyksta nukopijuoti trumpųjų nuorodų nustatymų." + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Bendrinti" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Išsaugomos trumpųjų nuorodų į serverį…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Išsaugotos trumposios nuorodos" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Nepavyksta išsaugoti trumpųjų nuorodų." + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sinchronizuoti su serveriu" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# simbolis} few {# simboliai} many {# simbolio} other {# simbolių}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Neapdorotos trumposios nuorodos JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importuoti / eksportuoti nustatymus iš / į serverį (labai eksperimentinis)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>pasidalino</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Atsiprašome, tavo dabartinis prisijungtas serveris negali sąveikauti su šiuo įrašu iš kito serverio." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Panaikintas @{0} patiktuko įrašas" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Patiko @{0} įrašas" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Pašalintas @{0} įrašas iš žymių" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Pridėtas @{0} įrašas į žymes" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Nebepasidalinti" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Cituoti" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Kai kurios medijos neturi aprašymų." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Senasis įrašas (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Panaikintas @{0} įrašo pasidalinimas" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Pasidalintas @{0} įrašas" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Pasidalinti…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Nebepatinka" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Patinka" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Pašalinti iš žymių" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Peržiūrėti įrašą, kurį sukūrė <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Rodyti redagavimo istoriją" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Redaguota: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Įterptas įrašas" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Atšauktas pokalbio nutildymas" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Pokalbis nutildytas" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Nepavyksta atšaukti pokalbio nutildymą." + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Nepavyksta nutildyti pokalbio." + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Atšaukti pokalbio nutildymą" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Nutildyti pokalbį" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Įrašas atsegtas iš profilio" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Įrašas prisegtas prie profilio" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Nepavyksta atsegti įrašo." + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Nepavyksta atsegti įrašo." + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Atsegti iš profilio" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Prisegti prie profilio" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Ištrinti šį įrašą?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Įrašas ištrintas" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Nepavyksta ištrinti įrašo." + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Pranešti apie įrašą…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Patinka" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Pasidalinta" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Pridėta" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Prisegta" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Ištrinta" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# atsakymas} few {# atsakymai} many {# atsakymo} other {# atsakymų}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Gija{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Rodyti mažiau" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Rodyti turinį" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Rodyti mediją" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Redaguota" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Komentarai" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Daugiau iš <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Redagavimo istoriją" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Nepavyko įkelti istorijos." + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Įkeliama…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML kodas" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Nukopijuotas HTML kodas" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Nepavyksta nukopijuoti HTML kodo." + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Medijos priedai:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Paskyros jaustukai:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "statinis URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Jaustukai:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Pastabos:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Tai – statiškas, nestilingas ir be skriptis. Gali reikėti taikyti savo stilius ir redaguoti pagal poreikį." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Apklausos nėra interaktyvios, tampa sąrašu su balsų skaičiais." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Medijos priedai gali būti vaizdai, vaizdo įrašai, garso įrašai arba bet kokio tipo failai." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Įrašas gali būti redaguojamas arba ištrintas vėliau." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Peržiūrėti" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Pastaba: ši peržiūra yra šiek tiek stilizuota." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> pasidalino" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Nauji įrašai" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Bandyti dar kartą" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# pasidalinimas} few {# pasidalinimai} many {# pasidalinimo} other {# pasidalinimų}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Prisegti įrašai" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Gija" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtruota</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Automatiškai išversta iš {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Verčiama…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Versti iš {sourceLangText} (automatiškai aptikta)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Versti iš {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Automatinis ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Nepavyko išversti." + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Šaltinio būsenos redagavimas" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Atsakant į @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Gali dabar uždaryti šį puslapį." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Uždaryti langą" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Privalomas prisijungimas." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Eiti į pagrindinį" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Paskyros įrašai" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ atsakymai)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- pasidalinimai)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (medija)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Valyti filtrus" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Valyti" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Rodomas įrašas su atsakymais" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ atsakymai" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Rodomi įrašai be pasidalinimų" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- pasidalinimai" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Rodomi įrašai su medija" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Rodomi įrašai pažymėti su #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Rodomi įrašai per {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Kol kas nėra čia ką matyti." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Nepavyksta įkelti įrašų." + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Nepavyksta gauti paskyros informacijos." + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Perjungti į paskyros serverį {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Perjungti į mano serverį (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Mėnuo" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Dabartinė" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Numatyta" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Perjungti į šią paskyrą" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Perjungti naujame skirtuke / lange" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Peržiūrėti profilį…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Nustatyti kaip numatytąjį" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Atsijungti iš <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Atsijungti…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Pridėti esančią paskyrą" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Pastaba: <0>Numatytoji</0> paskyra visada bus naudojama pirmajam įkėlimui. Perjungtos paskyros išliks seanso metu." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Kol kas nėra žymių. Eik kažką pridėti į žymes!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Nepavyksta įkelti žymių." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "paskutinės 1 valandos" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "paskutinių 2 valandų" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "paskutinių 3 valandų" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "paskutinių 4 valandų" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "paskutinių 5 valandų" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "paskutinių 6 valandų" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "paskutinių 7 valandų" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "paskutinių 8 valandų" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "paskutinių 9 valandų" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "paskutinių 10 valandų" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "paskutinių 11 valandų" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "paskutinių 12 valandų" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "po 12 valandų" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Sekamos žymės" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Grupės" + +#: 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 "Rodomi {selectedFilterCategory, select, all {visi įrašai} original {originalūs įrašai} replies {atsakymai} boosts {pasidalinimai} followedTags {sekamos žymės} groups {grupės} filtered {filtruojami įrašai}}, {sortBy, select, createdAt {{sortOrder, select, asc {seniausi} desc {naujausi}}} reblogsCount {{sortOrder, select, asc {mažiausiai pasidalinimų} desc {daugiausiai pasidalinimų}}} favouritesCount {{sortOrder, select, asc {mažiausiai patiktukų} desc {daugiausiai patiktukų}}} repliesCount {{sortOrder, select, asc {mažiausiai atsakymų} desc {daugiausiai atsakymų}}} density {{sortOrder, select, asc {mažiausiai tankūs} desc {tankiausi}}}} pirmiausiai {groupBy, select, account {, sugrupuota pagal autorius} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Pasivijimas <0>beta versija</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Žinynas" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Kas tai?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Pasivijimo informacija – tai atskira sekimu laiko skalė, suteikianti aukšto lygio peržiūrą iš pirmo žvilgsnio, su paprasta, el. pašto įkvėpta sąsaja, kad būtų galima lengvai rikiuoti ir filtruoti įrašus." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Pasivijimo naudotojo sąsajos peržiūra" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Pasivykime" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Pasivykime tavo sekimų įrašus." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Rodyti visus įrašus nuo…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "iki didžiausio" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Pasivyti" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Sutampa su paskutiniu pasivijimu" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Iki paskutinio pasivijimo ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Pastaba: tavo serveris gali rodyti ne daugiau kaip 800 įrašų pagrindinėje laiko skalėje, nepaisant laiko intervalo. Gali būti mažiau arba daugiau." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Anksčiau…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# įrašas} few {# įrašai} many {# įrašo} other {# įrašų}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Šalinti šį pasivijimą?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Pašalinima {0} pasivijimas" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Pašalintas {0} pasivijimas" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Pastaba: bus išsaugota tik ne daugiau kaip 3. Likusios bus automatiškai pašalintos." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Gaunami įrašai…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Tai gali šiek tiek užtrukti." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Atkurti filtrus" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Populiariausios nuorodos" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Bendrino {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Viskas" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# autorius} few {# autoriai} many {# autoriaus} other {# autorių}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Rikiuoti" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Data" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Tankumas" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autoriai" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Nieko" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Rodyti visus autorius" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Nebūtina perskaityti viską." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Tai viskas." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Grįžti į viršų" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Nuorodos bendrinamos pagal sekimus, surikiuotos pagal bendrinamų nuorodų skaičių, pasidalinimus ir patiktukus." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Rikiuoti: tankumas" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Įrašai rikiuojami pagal informacijos tankumą arba gilumą. Trumpesni įrašai „lengvesni“, o ilgesni – „sunkesni“. Įrašai su nuotraukomis yra „sunkesni“ nei įrašai be nuotraukų." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Grupuoti: autoriai" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Įrašai sugrupuoti pagal autorius, surikiuoti pagal kiekvieno autoriaus įrašų skaičių." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Kitas autorius" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Ankstesnis autorius" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Slinkti į viršų" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtruota: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Kol kas nėra patiktukų. Eik kažką pamėgti!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Nepavyksta įkelti patiktukų." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Pagrindinis ir sąrašai" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Viešieji laiko skalės" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Pokalbiai" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profiliai" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Niekada" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Naujas filtras" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtras} few {# filtrai} many {# filtro} other {# filtrų}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Nepavyksta įkelti filtrų." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Kol kas nėra filtrų." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Pridėti filtrą" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Redaguoti filtrą" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Nepavyksta redaguoti filtro." + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Nepavyksta sukurti filtro." + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Pavadinimas" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Visas žodis" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Nėra raktažodžių. Pridėk vieną." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Pridėti raktažodį" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# raktažodis} few {# raktažodžiai} many {# raktažodžio} other {# raktažodžių}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtruoti iš…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Kol kas nepadaryta" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Būsena: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Keisti galiojimo laiką" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Galiojimo laikas" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Filtruotas įrašas bus…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "sumažintas" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "paslėptas" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Ištrinti šį filtrą?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Nepavyksta ištrinti filtro." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Nebegalioja" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Baigiasi <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Niekada nesibaigia" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# saitažodis} few {# saitažodžiai} many {# saitažodžio} other {# saitažodžių}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Nepavyksta įkelti sekamų saitažodžių." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Kol kas nėra sekamų saitažodžių." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Nėra ką matyti čia." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Nepavyksta įkelti įrašų." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (tik medija) serveryje {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} serveryje {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (tik medija)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Kol kas niekas nieko su šia žyme nepaskelbė." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Nepavyksta įkelti įrašų su šia žyme." + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Nebesekti #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Nebesekama #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Sekama #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Sekama…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Neberodoma profilyje" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Nepavyksta neberodyti profilyje." + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Rodoma profilyje" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Rodyti profilyje" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, one {Didžiausia # žymė} few {Didžiausia # žymės} many {Didžiausia # žymes}other {Didžiausia # žymių}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Pridėti saitažodį" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Šalinti saitažodį" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Pasiektas didžiausias # trumpojo nuorodos. Nepavyksta pridėti trumposios nuorodos.} few {Pasiekti didžiausias # trumpųjų nuorodų. Nepavyksta pridėti trumposios nuorodos.} many {Pasiekta didžiausias # trumpojo nuorodos. Nepavyksta pridėti trumposios nuorodos.} other {Pasiekta didžiausias # trumpųjų nuorodų. Nepavyksta pridėti trumposios nuorodos.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Ši nuoroda jau egzistuoja." + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Pridėtas trumpasis nuorodos saitažodis" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Pridėti prie trumpųjų nuorodų" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Įvesk naują serverį, pvz., mastodon.social" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Netinkamas serveris." + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Eiti į kitą serverį…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Eiti į mano serverį (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Nepavyksta gauti pranešimų." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Nauji</0> <1>sekimo prašymai</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Žiūrėti viską" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Sprendžiama…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Nepavyksta išspręsti URL." + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Kol kas nieko." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Tvarkyti narius" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Pašalinti <0>@{0}</0> iš sąrašo?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Šalinti…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# sąrašas} few {# sąrašai} many {# sąrašo} other {# sąrašų}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Kol kas nėra sąrašų." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Nepavyko užregistruoti programos." + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "serverio domenas" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "pvz., mastodon.social" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Nepavyko prisijungti. Bandyk dar kartą arba išbandyk kitą serverį." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Tęsti su {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Tęsti" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Neturi paskyros? Susikurk vieną!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Privatūs paminėjimai" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privati" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Niekas tavęs nepaminėjo. :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Nepavyksta įkelti paminėjimų." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Neseki" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Kurie tavęs neseka" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Su nauja paskyra" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Kurie neprašytai privačiai paminėjo tave" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Kurie yra ribojami serverio prižiūrėtojų" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Pranešimų nustatymai" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Nauji pranešimai" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Skelbimas} few {Skelbimai} many {Skelbimo} other {Skelbimų}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Sekimo prašymai" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# sekimo prašymai} few {# sekimo prašymai} many {# sekimo prašymo} other {# sekimo prašymų}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Filtruojami pranešimai iš # žmogaus} few {Filtruojami pranešimai iš # žmonių} many {Filtruojami pranešimai iš # žmogaus} other {Filtruojami pranešimai iš # žmonių}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Tik paminėjimus" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Šiandien" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Viską peržiūrėjai." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Vakar" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Nepavyksta įkelti pranešimų." + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Atnaujinti pranešimų nustatymai" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Filtruoti pranešimus iš žmonių:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtruoti" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignoruoti" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Atnaujinta <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Peržiūrėti pranešimus iš <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Pranešimai iš <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Pranešimai iš @{0} nuo šiol nebus filtruojami." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Nepavyksta priimti pranešimo prašymo." + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Leisti" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Pranešimai iš @{0} nuo šiol nebus rodomi filtruotuose pranešimuose." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Nepavyksta atmesti pranešimo prašymo." + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Atmesti" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Atmesta" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Vietinė laiko skalė ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Federacinė laiko skalė ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Vietinė laiko skalė" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Federacinė laiko skalė" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Kol kas niekas nieko nepaskelbė." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Perjungti į federacinę" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Perjungti į vietinį" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Paieška: {q} (įrašai)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Paieška: {q} (paskyros)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Paieška: {q} (saitažodžiai)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Paieška: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Saitažodžiai" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Žiūrėti daugiau" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Žiūrėti daugiau paskyrų" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Paskyrų nerasta." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Žiūrėti daugiau saitažodžių" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Saitažodžių nerasta." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Žiūrėti daugiau įrašų" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Įrašų nerasta." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Įvesk paieškos terminą arba įklijuok URL, kad pradėtum." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Nustatymai" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Išvaizda" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Šviesi" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Tamsi" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automatinis" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Teksto dydis" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Rodymo kalba" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Atlikti vertimus savanoriškai" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Skelbimas" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Numatytasis matomumas" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Sinchronizuota" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Nepavyko atnaujinti skelbimo privatumo." + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Sinchronizuota su serverio nustatymais. <0>Eiti į savo serverį ({instance}), kad sužinoti daugiau nustatymų.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Eksperimentai" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Automatiškai atnaujinti laiko skalės įrašus" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Pasidalinimų karuselė" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Įrašo vertimas" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Versti į" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Sistemos kalbą ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, one {Slėpti Versti mygtuką (#):} few {Slėpti Versti mygtuką (#):} many {Slėpti Versti mygtuką (#):}=0 {} other {Slėpti Versti mygtuką (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Pastaba: ši funkcija naudoja išorines vertimo paslaugas, veikiančias su <0>„Lingva“ API</0> ir <1>„Lingva Translate“</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Automatinis įterptinis vertimas" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Automatiškai rodyti vertimą įrašams laiko skalėje. Veikia tik <0>trumpiems</0> įrašams be turinio įspėjimo, medijos ir apklausos." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "GIF parinkiklis rengyklei" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Pastaba: ši funkcija naudoja išorinę GIF paieškos paslaugą, veikiančią su <0>„GIPHY“</0>. „G-rated“ (skirta visiems amžiaus grupėms), sekimo parametrai pašalinami, užklausose nepateikiama nukreipiančioji informacija, bet paieškos užklausos ir IP adreso informacija vis tiek pasieks jų serverius." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Vaizdų aprašymo generatorius" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Tik naujiems vaizdams, kai kuriami nauji įrašai." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Pastaba: ši funkcija naudoja išorinę DI paslaugą, veikiančią su <0>„img-alt-api“</0>. Gali veikti netinkamai. Tik vaizdams ir anglų kalba." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Serverio pusėje sugrupuoti pranešimai" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Alfa stadijos funkcija. Galimai patobulintas grupavimo langas, bet bazinė grupavimo logika." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "„Debesis“ importuoti / eksportuoti trumpųjų nuorodų nustatymus" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Labai eksperimentinis.<0/>Įrašyta jūsų profilio pastabose. Profilio (privačios) pastabos daugiausia naudojamos kitiems profiliams, o savo profilyje yra paslėptos." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Pastaba: ši funkcija naudoja šiuo metu prisijungusio serverio API." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Slėpimo režimas <0>(<1>Tekstas</1> → <2>███████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Pakeiskite tekstą blokais – tai naudinga darant ekrano kopijas dėl privatumo priežasčių." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Apie" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Sukūrė</0> <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Remti" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Aukoti" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Privatumo politika" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Svetainė:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versija:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Nukopijuota versijos eilutė" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Nepavyksta nukopijuoti versijos eilutės." + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Nepavyko atnaujinti prenumeratos. Bandykite dar kartą." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Nepavyko pašalinti prenumeratos. Bandykite dar kartą." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Tiesioginiai pranešimai (beta versija)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Tiesioginiai pranešimai yra užblokuoti. Įjunkite juos naršyklės nustatymuose." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Leisti iš <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "bet kieno" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "žmonių, kuriuos seku" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "sekėjų" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Sekimai" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Apklausos" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Įrašų redagavimai" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Nuo paskutinio prisijungimo nebuvo suteiktas tiesioginis leidimas. Turėsite <0><1>prisijungti</1> dar kartą, kad suteiktumėte tiesioginį leidimą</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "Pastaba: tiesioginiai pranešimai veikia tik <0>vienai paskyrai</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Įrašas" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Nesate prisijungę. Sąveikos (atsakyti, pasidalinti ir t. t.) negalimos." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Šis įrašas yra iš kito serverio (<0>{instance}</0>). Sąveikos (atsakyti, pasidalinti ir t. t.) negalimos." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Klaida: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Perjungti į mano serverį, kad būtų įjungtos sąveikos" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Nepavyksta įkelti atsakymų." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Atgal" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Eiti į pagrindinį įrašą" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} įrašų aukščiau – eiti į viršų" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Perjungti į šoninio žvilgsnio rodymą" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Perjungti į visą rodymą" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Rodyti visą jautrų turinį" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Eksperimentinis" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Nepavyksta perjungti." + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Perjungti į įrašo serverį ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Perjungti į įrašo serverį" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Nepavyksta įkelti įrašo." + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# atsakymas} few {<0>{1}</0> atsakymai} many {<0>{1}</0> atsakymo} other {<0>{1}</0> atsakymų}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# komentaras} few {<0>{0}</0> komentarai} many {<0>{0}</0> komentaro} other {<0>{0}</0> komentarų}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Peržiūrėti įrašą su jo atsakymais" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Tendencinga ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Tendencingos naujienos" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Sukūrė {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Atgal į tendencingų įrašų rodymą" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Rodomi įrašai, kuriuose paminimas <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Tendencingi įrašai" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Nėra tendencingų įrašų." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Minimalistinė „Mastodon“ interneto kliento programa." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Prisijungti su „Mastodon“" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Registruotis" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Prijunkite esamą „Mastodon“ / fediverso paskyrą.<0/>Jūsų kredencialai šiame serveryje nėra saugomi." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Sukūrė</0> <1>@cheeaun</1>. <2>Privatumo politika</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Pasidalinimų karuselės ekrano kopija" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Pasidalinimų karuselė" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Vizualiai atskirkite originalius įrašus ir pakartotinai bendrinamus įrašus (pasidalintus įrašus)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Įterptų komentarų gijos ekrano kopija" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Įterptų komentarų gija" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Lengvai sekite pokalbius. Pusiau suskleidžiamieji atsakymai." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Sugrupuotų pranešimų ekrano kopija" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Sugrupuoti pranešimai" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Panašūs pranešimai sugrupuojami ir suskleidžiami, kad būtų mažiau netvarkos." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Daugiastulpelių naudotojo sąsajos ekrano kopija" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Vieno arba daugiastulpelių" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Pagal numatytuosius nustatymus – vienas stulpelis zeno režimo ieškikliams. Galimybė konfigūruoti daugiastulpelius patyrusiems naudotojams." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Daugiasaitažodžių laiko skalės ekrano kopija su forma, kuria galima pridėti daugiau saitažodžių" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Daugiasaitažodžių laiko skalė" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Iki 5 saitažodžių, sujungtų į vieną laiko skalę." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Atrodo, kad jūsų naršyklė blokuoja iškylančiuosius langus." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Įrašo juodraštis šiuo metu sumažintas. Paskelbkite arba atmeskite jį prieš sukuriant naują." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Įrašas šiuo metu atidarytas. Paskelbkite arba atmeskite jį prieš sukuriant naują." + diff --git a/src/locales/nb-NO.po b/src/locales/nb-NO.po new file mode 100644 index 00000000..6f072815 --- /dev/null +++ b/src/locales/nb-NO.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: nb_NO\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Norwegian Bokmal\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: nb\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Låst" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Innlegg: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Sist postet: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automatisert" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Gruppe" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Gjensidig" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Forespurt" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Følger" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Følger deg" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Bekreftet" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Ble med <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "For alltid" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Kunne ikke laste inn konto." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Gå til kontoside" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Følgere" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Innlegg" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Mer" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> har indikert at deres nye konto er nå:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Gå til original profilside" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Vis profilbilde" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "Til minne om" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Denne brukeren har valgt å ikke gjøre denne informasjonen tilgjengelig." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} originale innlegg, {1} svar, {2} fremhevinger" + +#: 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 "" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Original" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Svar" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Fremhevinger" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Innleggsstatistikk ikke tilgjengelig." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Vis innleggsstatistikk" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Siste innlegg: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Dempet" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Blokkert" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Privat notat" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Nevn <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Oversett bio" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Rediger privat notat" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Legg til privat notat" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Varslinger aktivert for @{username} sine innlegg." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Varslinger deaktivert for @{username} sine innlegg." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Deaktiver varsler" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Aktiver varsler" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Fremhevinger fra @{username} er aktivert." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Fremhevinger fra @{username} er deaktivert." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Deaktiver fremhevinger" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Aktiver fremhevinger" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Legg til/fjern fra lister" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Link kopiert" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Kunne ikke kopiere lenke" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopier" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Å dele synes ikke å fungere." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Del…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Demp <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Dempet @{username} i {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Kunne ikke dempe @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Fjern <0>@{username}</0> fra følgere?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} fjernet fra følgere" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Fjern følger…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Blokker <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Blokkerte @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Kunne ikke avblokkere @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Kunne ikke blokkere @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Blokker <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Rapporter <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Rediger profil" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Trekk tilbake følge-forespørsel?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Avfølg @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Avfølg…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Trekk tilbake…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Følg" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Lukk" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Oversatt bio" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Kunne ikke fjerne fra liste." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Kunne ikke legge til i liste." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Kunne ikke laste lister." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Ingen lister." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Ny liste" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Privat notat om <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Kunne ikke oppdatere privat notat." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Avbryt" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Lagre & lukk" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Kunne ikke oppdatere profil." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Navn" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Bio" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Ekstra felter" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etikett" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Innhold" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Lagre" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "brukernavn" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "tjenerens domenenavn" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Hjem" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Skriv ny" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Legg til egendefinert emoji" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Legg til avstemming" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Du har ulagrede endringer. Forkast dette innlegget?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 "" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimer" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Ser ut som du lukket foreldrevinduet." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Svarer til @{0} sitt innlegg (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Svarer på @{0} sitt innlegg" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Avstemning må ha minst 2 alternativer" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Noen avstemningsvalg er tomme" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Noen media mangler beskrivelser. Fortsett?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Vedlegg #{i} mislyktes" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Innholdsvarsel" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Innholdsvarsel eller sensitive media" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Offentlig" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Lokal" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Ikke listet" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Kun følgere" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Privat omtale" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Skriv ditt svar" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Rediger innlegget ditt" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Hva gjør du?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Marker media som sensitivt" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Legg til" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Svar" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Oppdater" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Publiser" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Laster ned GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Kunne ikke laste ned GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Mer…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Lastet opp" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Bildebeskrivelse" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Videobeskrivelse" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Lydbeskrivelse" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Fjern" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Feil" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Rediger bildebeskrivelse" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Rediger videobeskrivelse" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Rediger lydbeskrivelse" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Genererer beskrivelse. Vennligst vent…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Kunne ikke generere beskrivelse: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Kunne ikke generere beskrivelse" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Generer beskrivelse…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Kunne ikke generere beskrivelse{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— eksperimentell</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Ferdig" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Valg {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Flere alternativer" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Varighet" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Fjern avstemming" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Søk konti" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Feil ved lasting av konti" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Egendefinerte emojier" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Søk emojier" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Feil ved lasting av egendefinerte emojier" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Nylig brukt" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Andre" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} fler…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Søk GIFer" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Drevet av GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Skriv for å søke GIFer" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Forrige" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Neste" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Feil ved lasting av GIFer" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Usendte utkast" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Ser ut som du har usendte utkast. La oss fortsette der du slapp." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Slett dette utkastet?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Feil ved sletting av utkast! Prøv igjen." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Slett…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Slette alle utkast?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Feil ved sletting av utkast! Prøv igjen." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Slett alle…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Ingen utkast funnet." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Avstemning" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Media" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Åpne i nytt vindu" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Aksepter" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Avvis" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Akseptert" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Avvist" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Ingenting å vise" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Konti" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Vis mer…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Slutt." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Hurtigtaster" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Hjelp til tastatursnarveier" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Neste innlegg" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Forrige innlegg" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Last inn nye innlegg" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Åpne innleggsdetaljer" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> eller <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Lukk innlegg eller dialoger" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> til <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Skriv nytt innlegg" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Skriv nytt innlegg (nytt vindu)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Send innlegg" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Søk" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Svar (nytt vindu)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Fremhev" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Rediger liste" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Kunne ikke redigere liste." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Kunne ikke opprette liste." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Vis svar til listemedlemmer" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Ikke vis svar" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Opprett" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Slett denne listen?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Kunne ikke slette liste." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Mediabeskrivelse" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Oversett" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Les opp" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Kunne ikke beskrive bildet" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Beskriv bilde…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Vis innlegg" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Sensitive media" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrert" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Meny" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Last siden på nytt for å oppdatere?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Ny oppdatering tilgjengelig…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Omtaler" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Varsler" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Ny" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Bokmerker" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Likte" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Fulgte emneknagger" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtre" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Dempede brukere" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Dempede brukere…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Blokkerte brukere" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Blokkerte brukere…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Konti…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Logg inn" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Populære" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Snarveier / Kolonner…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Innstillinger…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Lister" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Alle lister" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Varsler" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Dette varselet er fra en annen konto." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Vis alle varsler" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} reagerte på ditt innlegg med {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} publiserte et innlegg." + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Kontoen din har blitt deaktivert." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Noen av dine innlegg har blitt slettet." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Les mer →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Stem" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Skjul resultater" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Stem" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Oppdater" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Vis resultater" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Avsluttet <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Avsluttet" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Avslutter <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Avslutter" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}t" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Søppel" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Ikke tillatt" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Bryter loven i ditt eller tjenerens land" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Brudd på tjenerregel" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Brudd på spesifikke tjenerregler" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Brudd" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Annet" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Problemet passer ikke andre kategorier" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Rapporter innlegg" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Rapporter @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Venter på gjennomsyn" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Innlegg rapportert" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Profil rapportert" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Kunne ikke rapportere innlegg" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Kunne ikke rapportere profil" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Hva er problemet med dette innlegget?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Hva er problemet med denne profilen?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Ytterligere informasjon" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Videresend til <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Send rapport" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Dempet {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Kunne ikke dempe {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Konto" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Emneknagg" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "Liste-ID" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Kun lokalt" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instans" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Valgfri, f.eks. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Kun media" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Snarveier" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Flytende knapp" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Flytt opp" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Flytt ned" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Rediger" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Import/eksport" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Legg til kolonne…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Legg til snarvei…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Flere emneknagger støttes. Mellomrom-separert." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Rediger snarvei" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Legg til snarvei" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Tidslinje" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Liste" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importer" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Lim inn snarveier her" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Importere snarveier?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "eller overstyre…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importer…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Eksporter" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Snarveier kopiert" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Kunne ikke kopiere snarveier" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Snarveisinnstillinger kopiert" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Kunne ikke kopiere snarveisinnstillinger" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Del" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Kunne ikke lagre snarveier" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Synkroniser til instanstjener" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Bokmerket @{0} sitt innlegg" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Siter" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Lik" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Fjern bokmerke" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Vis redigeringshistorikk" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Redigert: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Bygg inn innlegg" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Samtale dempet" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Demp samtale" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Likt" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Bokmerket" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Festet" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Slettet" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Tråd{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Vis mindre" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Vis innhold" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Vis media" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Redigert" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Kommentarer" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Mer fra <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Redigeringshistorikk" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Kunne ikke laste inn historikk" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Laster…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML-kode" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML-kode kopiert" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Kunne ikke kopiere HTML-kode" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Mediavedlegg:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Konto-emojier:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojier:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notater:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Nye innlegg" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Prøv igjen" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Festede innlegg" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Tråd" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Oversetter…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Oversett fra {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Automatisk ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Kunne ikke oversette" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Lukk vindu" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Måned" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Sett som standard" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Logg ut <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Logg ut…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Legg til en eksisterende konto" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "siste time" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "siste 2 timer" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "siste 3 timer" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "siste 4 timer" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "siste 5 timer" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "siste 6 timer" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "siste 7 timer" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "siste 8 timer" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "siste 9 timer" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "siste 10 timer" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "siste 11 timer" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "siste 12 timer" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "mer enn 12 timer" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Fulgte emneknagger" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Grupper" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Hjelp" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Hva er dette?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Tidligere…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Henter innlegg…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Dette kan ta litt tid." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Tilbakestill filtre" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Alle" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Sorter" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Dato" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Tetthet" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Forfattere" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Ingen" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Vis alle forfattere" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Du trenger ikke lese alt." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Det var alle." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Tilbake til toppen" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Samtaler" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profiler" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Aldri" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Nytt filter" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filter} other {# filtre}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Kunne ikke laste filtre." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Legg til filter" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Rediger filter" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Kunne ikke redigere filter" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Kunne ikke opprette filter" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Tittel" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Hele ordet" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Utløpt" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Utløper <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Utløper aldri" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# emneknagg} other {# emneknagger}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Kunne ikke laste fulgte emneknagger." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Ingen fulgte emneknagger." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Ingenting å se her." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Kunne ikke laste innlegg." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Fulgte #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Legg til emneknagg" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Fjern emneknagg" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Se alle" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Fjern…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "instanstjener" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "f.eks. «mastodon.social»" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Kunne ikke logge inn. Vennligst prøv igjen, eller prøv en annen instans." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Fortsett" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Har du ikke en konto? Opprett en!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privat" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Nye varsler" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "I dag" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "I går" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filter" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignorer" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Oppdaterte <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Vis varsler fra <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Varsler fra <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Kunne ikke akseptere varselforespørsel" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Tillat" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Avvis" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Avvist" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Lokal tidslinje ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Føderert tidslinje ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Lokal tidslinje" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Søk: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Emneknagger" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Se mer" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Innstillinger" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Utseende" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Lyst" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Mørkt" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automatisk" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Tekststørrelse" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Eksperimenter" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Oversett til" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Systemspråk ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versjon:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Feil: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/nl-NL.po b/src/locales/nl-NL.po new file mode 100644 index 00000000..9d17d1b1 --- /dev/null +++ b/src/locales/nl-NL.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: nl\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Dutch\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Vergrendeld" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Berichten: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Laatst geplaatst: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Geautomatiseerd" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Groep" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Wederzijds" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Aangevraagd" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Volgend" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Volgt jou" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# volger} other {# volgers}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Geverifieerd" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Lid geworden op <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Altijd" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Kan account niet laden." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Ga naar de accountpagina" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Volgers" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Berichten" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "meer" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> heeft aangegeven dat ze een nieuw account hebben:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Kenmerk gekopieerd" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Kan dit kenmerk niet kopiëren" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Kopieer kenmerk" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Ga naar de oorspronkelijke profielpagina" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Bekijk profielfoto" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Bekijk profielkop" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "In Memoriam" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Deze gebruiker heeft ervoor gekozen om deze informatie niet beschikbaar te maken." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} originele berichten, {1} antwoorden, {2} boosts" + +#: 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 {Laatste bericht van de afgelopen dag} other {Laatste 1 bericht van de afgelopen {2} dagen}}} other {{3, plural, one {Laatste {4} berichten van de afgelopen dag} other {Laatste {5} berichten van de afgelopen {6} dagen}}}}" + +#: 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 {Laatste bericht van de afgelopen jaren} other {Laatste {1} berichten van de afgelopen jaren}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Origineel" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Antwoorden" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Boosts" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Berichtstatistieken niet beschikbaar." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Bekijk berichtstatistieken" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Laatste bericht: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Gedempt" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Geblokkeerd" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Privénotitie" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Noem <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Vertaal bio" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Bewerk privénotitie" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Voeg privénotitie toe" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Meldingen ingeschakeld voor berichten van @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Meldingen uitgeschakeld voor berichten van @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Meldingen uitschakelen" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Meldingen inschakelen" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Boosts van @{username} ingeschakeld." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Boosts van @{username} uitgeschakeld." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Boosts uitschakelen" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Boosts inschakelen" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Toevoegen/Verwijderen uit lijsten" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Link gekopieerd" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Kan deze link niet kopiëren" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopiëer" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Delen lijkt niet te werken." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Delen…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Dempen van @{username} opgeheven" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Dempen van <0>@{username}</0> opheffen" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Demp <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} gedempt voor {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Kan @{username} niet dempen" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Verwijder <0>@{username}</0> van volgers?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} verwijderd uit volgers" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Verwijder volger…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Blokkeer <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Blokkeren van @{username} opgeheven" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} geblokkeerd" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Kan @{username} niet ontblokkeren" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Kan @{username} niet blokkeren" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Blokkeren van <0>@{username}</0> opheffen" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Blokkeer <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Rapporteer <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Bewerk profiel" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Volgverzoek annuleren?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Ontvolg @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Ontvolg…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Neem terug…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Volg" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Sluit" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Vertaalde bio" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Kan niet uit lijst verwijderen." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Kan niet aan lijst toevoegen." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Kan lijsten niet laden." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Geen lijsten." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nieuwe lijst" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Privénotitie over <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Kan privénotitie niet bijwerken." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Annuleren" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Opslaan & sluiten" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Kan profiel niet bijwerken." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Naam" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Bio" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Extra velden" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Omschrijving" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Inhoud" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Opslaan" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "gebruikersnaam" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "server domeinnaam" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Cloak-modus uitgeschakeld" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Cloak-modus ingeschakeld" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Startpagina" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Opstellen" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Lokale emoji toevoegen" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Voeg peiling toe" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Je hebt niet-opgeslagen wijzigingen. Wil je dit bericht weggooien?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Je kunt slechts 1 bestand bijvoegen.} other {Je kunt slechts # bestanden bijvoegen.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Uitklappen" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimaliseren" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Het lijkt erop dat je het bovenste venster hebt gesloten." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Je hebt al een opstelveld open in het bovenliggende venster. Als je in dit venster wilt opstellen, worden de wijzigingen die je in het bovenliggende venster hebt aangebracht ongedaan gemaakt. Doorgaan?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Inklappen" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Antwoord op @{0}'s bericht (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Antwoord op @{0}'s bericht" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Bronbericht bewerken" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Peiling moet minstens 2 opties hebben" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Sommige peilingkeuzes zijn leeg" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Bijlage #{i} is mislukt" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Inhoudswaarschuwing" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Inhoudswaarschuwing of gevoelige media" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Openbaar" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Lokaal" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Niet openbaar" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Alleen volgers" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Privévermelding" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Plaats je antwoord" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Bewerk je bericht" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Wat ben je aan het doen?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Markeer media als gevoelig" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Toevoegen" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Beantwoord" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Werk bij" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Plaats" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Download GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Downloaden GIF mislukt" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "meer…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Geüpload" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Afbeeldingsbeschrijving" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Videobeschrijving" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Audiobeschrijving" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Bestandsgrootte is te groot. Uploaden kan problemen opleveren. Probeer de bestandsgrootte van {0} naar {1} of lager te verminderen." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Dimensies is te groot. Uploaden kan problemen opleveren. Probeer de dimensie van {0}x{1}px naar {2}x{3}px te verminderen." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Opnamesnelheid is te hoog. Uploaden kan problemen opleveren." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Verwijder" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Error" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Bewerk afbeeldingsbeschrijving" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Bewerk videobeschrijving" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Bewerk audiobeschrijving" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Omschrijving genereren. Even geduld…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Genereren van beschrijving mislukt: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Genereren van beschrijving mislukt" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Genereer beschrijving…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Genereren van beschrijving mislukt: {0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>– experimenteel</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Gereed" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Keuze {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Meerdere keuzes" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Tijdsduur" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Verwijder peiling" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Zoek accounts" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Fout bij het laden van accounts" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Aangepaste emoji" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Zoek emoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Fout bij het laden van aangepaste emojis" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Recent gebruikt" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Overige" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} meer…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "GIF's zoeken" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Mede mogelijk gemaakt door Giphy" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Typ om GIF's te zoeken" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Vorige" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Volgende" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Fout bij laden van GIF's" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Niet-verzonden concepten" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Het lijkt erop dat je niet-verzonden concepten hebt. Laten we verder gaan waar je gebleven bent." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Verwijder dit concept?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Fout bij verwijderen concept! Probeer het opnieuw." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Verwijder…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Fout bij ophalen van de antwoordstatus!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Verwijder alle concepten?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Fout bij het verwijderen van concepten! Probeer het opnieuw." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Verwijder alles…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Geen concepten gevonden." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Peiling" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Media" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Openen in een nieuw venster" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Accepteren" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Weigeren" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Geaccepteerd" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Geweigerd" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Niets om te tonen" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Accounts" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Toon meer…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Het einde." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Sneltoetsen" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Sneltoetsen help" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Volgend bericht" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Vorig bericht" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Sla carrousel over naar volgend bericht" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Sla carrousel over naar vorig bericht" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Laad nieuwe berichten" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Open berichtdetails" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> of <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Sluit bericht of dialoogvenster" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> of <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Focus kolom in multi-kolommodus" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> tot <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Stel nieuw bericht op" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Stel nieuw bericht op (nieuw venster)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Verstuur bericht" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> of <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Zoeken" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Beantwoord (nieuw venster)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Like (favoriet)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> of <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Boost" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Bladwijzer" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Schakel Cloak-modus" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Bewerk lijst" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Kan lijst niet bewerken." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Kan lijst niet aanmaken." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Toon antwoorden aan ledenlijst" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Toon antwoorden aan mensen die ik volg" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Geen antwoorden tonen" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Aanmaken" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Deze lijst verwijderen?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Kan lijst niet verwijderen." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Mediabeschrijving" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Vertaal" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Spreek uit" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Open originele media in nieuw venster" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Open originele media" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Fout bij het beschrijven van afbeelding" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Beschrijf afbeelding…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Bekijk bericht" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Gevoelige media" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Gefilterd: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Gefilterd" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Bericht geplaatst. Bekijk het eens." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Antwoord geplaatst. Bekijk het eens." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Bericht bijgewerkt. Bekijk het eens." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menu" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Pagina herladen om bij te werken?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nieuwe update beschikbaar…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Inhalen" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Vermeldingen" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Meldingen" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Nieuw" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Profiel" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Bladwijzers" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Likes" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Gevolgde Hashtags" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filters" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Gedempte gebruikers" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Gedempte gebruikers…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Geblokkeerde gebruikers" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Geblokkeerde gebruikers…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Accounts…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Inloggen" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Populair" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Gefedereerd" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Snelkoppelingen / Kolommen…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Instellingen…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Lijsten" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Alle lijsten" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Melding" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Deze melding komt van je andere account." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Toon alle meldingen" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} heeft een bericht gepubliceerd." + +#: src/components/notification.jsx:85 +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} heeft je antwoord gedeeld.} other {{account} heeft je bericht gedeeld.}}} other {{account} heeft {postsCount} van je berichten gedeeld.}}} other {{postType, select, reply {<0><1>{0}</1> mensen</0> hebben je antwoord gedeeld.} other {<2><3>{1}</3> mensen</2> hebben je berichten gedeeld.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} heeft verzocht je te volgen." + +#: src/components/notification.jsx:151 +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} heeft je antwoord geliket.} other {{account} heeft je bericht geliket.}}} other {{account} heeft {postsCount} van je berichten geliket.}}} other {{postType, select, reply {<0><1>{0}</1> mensen</0> hebben je antwoord geliket.} other {<2><3>{1}</3> mensen</2> hebben je bericht geliket.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Een peiling die je hebt aangemaakt of waarin je hebt gestemd is geëindigd." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Een peiling die je hebt aangemaakt is geëindigd." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Een peiling waarin je hebt gestemd is geëindigd." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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} heeft je antwoord geboost & geliket.} other {{account} heeft je bericht geboost & geliket.}}} other {{account} heeft {postsCount} van je berichten geboost & geliket.}}} other {{postType, select, reply {<0><1>{0}</1> mensen</0> hebben je antwoord geboost & geliket.} other {<2><3>{1}</3> mensen</2> hebben je bericht geboost & geliket.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} heeft zich aangemeld." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Verbindingen verbroken met <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Moderatie-waarschuwing" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Een beheerder van <0>{from}</0> heeft <1>{targetName}</1> geschorst, wat betekent dat u geen updates meer van hen kunt ontvangen of met hen kunt communiceren." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Een admin van <0>{from}</0> heeft <1>{targetName}</1> geblokkeerd. Getroffen volgers: {followersCount}, volgt: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Je hebt <0>{targetName}</0> geblokkeerd. Verwijderde volgers: {followersCount}, volgt: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Jouw account heeft een moderatie-waarschuwing ontvangen." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Je account is beperkt." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Je account is geschorst." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Onbekend meldingstype: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Geboost/Geliket door…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Geliket door…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Geboost door…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Gevolgd door…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Leer meer <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Lees meer →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Gestemd" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# stem} other {# stemmen}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Verberg uitslagen" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Stem" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Ververs" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Toon uitslagen" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> stem} other {<1>{1}</1> stemmen}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> stemmer} other {<1>{1}</1> stemmers}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Eindigde <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Geëindigd" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Eindigt <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Eindigt" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0} s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0} m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0} u" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Spam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Illegaal" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Overtreding" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Overig" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Rapporteer bericht" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Rapporteer @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Openstaande review" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Wat is het probleem met dit bericht?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Wat is het probleem met dit profiel?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Extra informatie" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Doorsturen naar <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Verzend rapport" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "{username} gedempt" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Kan {username} niet dempen" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Verzend rapport <0>+ Demp profiel</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "{username} geblokkeerd" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Kan {username} niet blokkeren" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Verzend rapport <0>+ Blokkeer profiel</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ accounts, hashtags & berichten</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Zoek <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Accounts met <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Startpagina / Volgend" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Openbaar (Lokaal / Gefederaliseerd)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Account" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Hashtag" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "Lijst-id" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Alleen lokaal" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instantie" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Optioneel, bijv. mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Zoekterm" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Optioneel, behalve voor de multi-kolommodus" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "bijv. PixelArt (Max 5, spatie gescheiden)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Alleen media" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Snelkoppelingen" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "bèta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Zwevende knop" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Tab-/Menubalk" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Multi-kolom" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Niet beschikbaar in huidige weergavemodus" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Verplaats omhoog" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Verplaats omlaag" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Bewerk" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Geen idee wat je kunt toevoegen?<0/>Probeer eerst <1>Startpagina/Volgend of Meldingen</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Max. {SHORTCUTS_LIMIT} kolommen" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Max. {SHORTCUTS_LIMIT} snelkoppelingen" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importeer/Exporteer" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Voeg kolom toe…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Voeg snelkoppeling toe…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Specifieke lijst is optioneel. Voor de multi-kolommodus is een lijst vereist, anders wordt de kolom niet getoond." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Voor de multi-kolommodus is een zoekterm vereist, anders wordt de kolom niet getoond." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Bewerk snelkoppeling" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Voeg snelkoppeling toe" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Tijdlijn" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Lijst" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importeer/Exporteer <0>Snelkoppelingen</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importeer" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Plak snelkoppelingen hier" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Opgeslagen snelkoppelingen downloaden van instance server…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Kan snelkoppelingen niet downloaden" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Download snelkoppelingen van de instance server" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Geen nieuwe snelkoppelingen om te importeren" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Snelkoppelingen geïmporteerd. De maximum van {SHORTCUTS_LIMIT} is overschreden, de rest wordt niet geïmporteerd." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Snelkoppelingen geïmporteerd" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importeren & toevoegen…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Huidige snelkoppelingen overschrijven?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Snelkoppelingen importeren?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "or overschrijven…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importeer…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exporteer" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Snelkoppelingen gekopieerd" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Kan snelkoppelingen niet kopiëren" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Snelkoppelingsinstellingen gekopieerd" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Kan snelkoppelingsinstellingen niet kopiëren" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Delen" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Snelkoppelingen opslaan naar instance server…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Snelkoppeling opgeslagen" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Kan snelkoppelingen niet opslaan" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Synchroniseer naar de instance server" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# teken} other {# tekens}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Ruwe Snelkoppelingen JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importeer/exporteer instellingen van/naar instance server (zeer experimenteel)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>geboost</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Sorry, je momentieel ingelogde instantie kan niet communiceren met dit bericht van een andere instantie." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "@{0}'s bericht niet langer geliket" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "@{0}'s bericht geliket" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Niet langer boosten" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "@{0}'s bericht niet langer geboost" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "@{0}'s bericht geboost" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Boost…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Niet langer liken" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Like" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Kan bericht niet verwijderen" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Geliket" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Geboost" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Bladwijzer opgeslagen" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Vastgezet" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Verwijderd" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# antwoord} other {# antwoorden}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Draad{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Toon minder" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Toon inhoud" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Toon media" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Bewerkt" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Antwoorden" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Bewerkingsgeschiedenis" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Kon geschiedenis niet laden" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Laden…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML code" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML code gekopieerd" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Kan HTML-code niet kopiëren" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Mediabijlagen:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Account emoji's:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "statische URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emoji's:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notities:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Dit is statisch, zonder vormgeving en scriptloos. Je moet mogelijk je eigen vormgeving toepassen en bewerken waar nodig." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Peilingen zijn niet interactief, wordt een lijst met uitslagen." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Mediabijlagen kunnen afbeeldingen, video's, audiobestanden of andere bestandstypes zijn." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Let op: Deze voorvertoning is licht vormgegeven." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> geboost" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Nieuwe berichten" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Boost} other {# Boosts}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Bron status bewerken" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Antwoorden op @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Naar startpagina" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Berichten van account" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Antwoorden)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Boosts)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Media)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Wis filters" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Wis" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Berichten met antwoorden worden nu getoond" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Antwoorden" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Alle berichten zonder boosts" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Boosts" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Berichten met media worden nu getoond" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Alle berichten met tag #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Alle berichten uit {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Nog niets te zien hier." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Kan berichten niet laden" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Kan accountgegevens niet ophalen" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Overschakelen naar instantie van account {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Overschakelen naar mijn instantie (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Overschakelen naar dit account" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Let op: <0>Standaard</0> account zal altijd bij het het eerste laden worden gebruikt. Overgeschakelde accounts worden onthouden tijdens je sessie." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Kan bladwijzers niet laden." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "het afgelopen uur" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "de afgelopen 2 uur" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "de afgelopen 3 uur" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "de afgelopen 4 uur" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "de afgelopen 5 uur" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "de afgelopen 6 uur" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "de afgelopen 7 uur" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "de afgelopen 8 uur" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "de afgelopen 9 uur" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "de afgelopen 10 uur" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "de afgelopen 11 uur" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "de afgelopen 12 uur" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "meer dan 12 uur geleden" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Gevolgde hashtags" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Groepen" + +#: 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 "{selectedFilterCategory, select, all {Alle berichten} original {Alle originele berichten} replies {Alle antwoorden} boosts {Alle boosts} followedTags {Alle gevolgde tags} groups {Alle groepen} filtered {Alle gefilterde berichten}}, {sortBy, select, createdAt {{sortOrder, select, asc {oudste} desc {nieuwste}}} reblogsCount {{sortOrder, select, asc {minste boosts} desc {meeste boosts}}} favouritesCount {{sortOrder, select, asc {minste likes} desc {meeste likes}}} repliesCount {{sortOrder, select, asc {minste antwoorden} desc {meeste antwoorden}}} density {{sortOrder, select, asc {minst dichte} desc {meest dichte}}}} first{groupBy, select, account {, gegroepeerd per schrijver} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Inhalen <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Hulp" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Wat is dit?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Inhalen is een aparte tijdlijn voor de accounts die je volgt, dat een weergave op hoog niveau in één oogopslag biedt met een eenvoudige, e-mailgeïnspireerde interface om moeiteloos door berichten te sorteren en filteren." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Voorbeeld van de Inhalen UI" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Laten we inhalen" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Laten we de posts van je de accounts die je volgt inhalen." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Toon me alle berichten van…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "tot het maximum" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Catch up" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Overlapt met je laatste catch-up" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Tot aan de laatste catch-up ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Let op: je instantie mag max. 800 berichten in de startpaginatijdlijn tonen, ongeacht het tijdsbereik. Kan minder of meer berichten zijn." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Eerder…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# bericht} other {# berichten}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Deze catch-up verwijderen?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Let op: Max. 3 worden opgeslagen. De rest wordt automatisch verwijderd." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Berichten ophalen…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Dit kan even duren." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Filters terug zetten" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Top links" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Gedeeld door {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Alles" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# auteur} other {# auteurs}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Sorteer" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Datum" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Dichtheid" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Auteurs" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Geen" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Toon alle auteurs" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Je hoeft niet alles te lezen." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Dat was het." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Terug naar boven" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Links gedeeld door volgenden, gesorteerd op hoe vaak het is gedeeld, geboost en geliket." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Sorteer: Dichtheid" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Groep: Auteurs" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Volgende auteur" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Vorige auteur" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Scroll naar boven" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Gefilterd: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Nog geen likes. Ga iets liken!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Kan likes niet laden." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Startpagina en lijsten" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Openbare tijdlijnen" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Discussies" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Profielen" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Nooit" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Nieuw filter" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filter} other {# filters}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Kan filters niet laden." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Nog geen filters." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Voeg filter toe" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Bewerk filter" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Kan filter niet bewerken" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Kan filter niet aanmaken" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Titel" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Volledig woord" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Geen trefwoorden. Voeg er één toe." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Voeg trefwoord toe" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# trefwoord} other {# trefwoorden}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filter op…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Nog niet geïmplementeerd" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Status: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Wijzig vervaldatum" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Vervaldatum" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Gefilterd bericht zal worden…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "geminimaliseerd" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "verborgen" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Verwijder dit filter?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Kan filter niet verwijderen." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Vervallen" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Vervalt op <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Vervalt nooit" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# hashtag} other {# hashtags}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Kan gevolgde hashtags niet laden." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Nog geen hashtags gevolgd." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Niets te zien hier." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Kan berichten niet laden." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (Alleen media) uit {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} uit {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (Alleen media)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Nog niemand heeft iets met deze hashtag geplaatst." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Kan berichten met deze tag niet laden" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Ontvolg #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "#{hashtag} ontvolgd" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "#{hashtag} gevolgd" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Volgend…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Voeg hashtag toe" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Verwijder hashtag" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Voeg aan Snelkoppelingen toe" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Voer een nieuwe instantie in, bijv. \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Ongeldige instantie" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Ga naar een andere instantie…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Ga naar mijn instantie (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Kan meldingen niet ophalen." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Bekijk alles" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Bezig met verwerken…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Kan URL niet vinden" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Nog niks." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Beheer leden" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Verwijder <0>@{0}</0> van lijst?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Verwijder…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# lijst} other {# lijsten}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Nog geen lijsten." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "instantiedomein" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "bijv. “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Inloggen mislukt. Probeer het opnieuw of probeer een andere instantie." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Doorgaan met {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Doorgaan" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Nog geen account? Maak er een aan!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Privévermeldingen" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privé" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Niemand vermeld je :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Kan vermeldingen niet laden." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Die je niet volgt" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Die je niet volgen" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Met een nieuw account" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Die je ongevraagd privé noemen" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Meldingsinstellingen" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Nieuwe meldingen" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Mededeling} other {Mededelingen}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Volgverzoeken" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# volgverzoek} other {# volgverzoeken}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Alleen vermeldingen" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Vandaag" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Je bent weer helemaal bij." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Gisteren" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Kan meldingen niet laden" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Meldingsinstellingen bijgewerkt" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filter" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Negeren" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Sta toe" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Negeer" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Genegeerd" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Lokale tijdlijn ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Federale tijdlijn ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Lokale tijdlijn" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Federale tijdlijn" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Niemand heeft nog iets geplaatst." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Overschakelen naar Federatie" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Overschakelen naar Lokaal" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Zoek: {q} (Berichten)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Zoek: {q} (Accounts)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Zoek: {q} (Hashtags)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Zoeken: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Hashtags" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Bekijk meer" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Bekijk meer accounts" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Geen accounts gevonden." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Bekijk meer hashtags" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Geen hashtags gevonden." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Bekijk meer berichten" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Geen berichten gevonden." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Instellingen" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Weergave" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Licht" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Donker" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automatisch" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Lettergrootte" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Weergavetaal" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Vertalingen van vrijwilligers" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Plaatsen" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Standaard zichtbaarheid" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Gesynchroniseerd" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Gesynchroniseerd met de instellingen van je instance server. <0>Ga naar je instance ({instance}) voor meer instellingen.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Experimenten" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Boosts carrousel" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Berichtvertaling" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Vertaal naar" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Systeemtaal ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Let op: Deze functie maakt gebruik van externe vertaaldiensten, mede mogelijk gemaakt door <0>Lingva API</0> & <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Let op: Deze functie maakt gebruik van een externe GIF zoekdienst, mede mogelijk gemaakt door <0>GIPHY</0>. Geschikt voor alle leeftijden, tracking parameters worden geschrapt, verwijzerinformatie wordt weggelaten uit verzoeken, maar zoekopdrachten en het IP-adres zullen hun servers nog steeds bereiken." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Let op: Deze functie maakt gebruik van externe AI-service, gevoed door <0>img-alt-api</0>. Kan mogelijk niet goed werken. Alleen voor afbeeldingen in het Engels." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "\"Cloud\" import/export voor snelkoppelingsinstellingen" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Zeer experimenteel.<0/>Opgeslagen in je eigen profielnotities. (Privé) profielnotities worden voornamelijk gebruikt voor andere profielen en verborgen voor je eigen profiel." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Let op: Deze functie maakt gebruik van de API van de instance server waar je momenteel bent ingelogd." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Over" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Sponsor" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Doneer" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Privacybeleid" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Site:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versie:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Versiestring gekopieerd" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Pushmeldingen (bèta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Sta toe van <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "iedereen" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "mensen die ik volg" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "volgers" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Volgend" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Peilingen" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Plaats bewerkingen" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "LET OP: Push meldingen werken alleen voor <0>één account</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Je bent niet ingelogd. Interacties (antwoorden, boosten, etc) zijn niet mogelijk." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Dit bericht komt uit een andere instantie (<0>{instance}</0>). Interacties (antwoorden, boosten, etc.) zijn niet mogelijk." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Fout: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Overschakelen naar mijn instantie om interacties in te schakelen" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Kan antwoorden niet laden." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Terug" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Ga naar het hoofdbericht" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} berichten boven - Go naar boven" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Toon alle gevoelige inhoud" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Experimenteel" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Kan niet overschakelen" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Overschakelen naar instantie van bericht ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Overschakelen naar instantie van bericht" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Kan bericht niet laden" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# antwoord} other {<0>{1}</0> antwoorden}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# opmerking} other {<0>{0}</0> opmerkingen}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Bekijk bericht met antwoorden" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Populair ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Populair nieuws" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Terug naar alle populaire berichten" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Alle berichten over <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Populaire berichten" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Geen populaire berichten." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Aanmelden met Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Inschrijven" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Screenshot van Boosts carrousel" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Boosts carrousel" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Visueel scheiden van originele berichten en opnieuw gedeelde berichten (gebooste berichten)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Moeiteloos gesprekken volgen. Semi-inklapbare antwoorden." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Gegroepeerde meldingen" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Schermafbeelding van multi-kolommodus" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Enkel- of multi-kolom" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Standaard enkelvoudige kolom voor zen-moduszoekers. Instelbare multi-kolommodus voor power users." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Het lijkt erop dat je browser popups blokkeert." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/oc-FR.po b/src/locales/oc-FR.po new file mode 100644 index 00000000..77effbbc --- /dev/null +++ b/src/locales/oc-FR.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: oc\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Occitan\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: oc\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "" + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "" + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "" + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "" + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "" + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "" + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "" + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 "" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "" + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "" + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "" + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "" + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/pl-PL.po b/src/locales/pl-PL.po new file mode 100644 index 00000000..74f91fde --- /dev/null +++ b/src/locales/pl-PL.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: pl\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Polish\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Prywatne" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Wpisy: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Najnowszy wpis: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Bot" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Grupa" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Przyjaciele" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Oczekująca prośba" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Obserwujesz" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Obserwuje cię" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# obserwujący} few {# obserwujących} many {# obserwujących} other {# obserwujących}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Zweryfikowany" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Jest tutaj od <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Na zawsze" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Nie można załadować konta." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Przejdź na stronę konta" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Obserwującx" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Wpisy" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Więcej" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Identyfikator skopiowany" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Nie udało się skopiować identyfikatora" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Kopiuj identyfikator" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Przejdź na oryginalną stronę profilową" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Pokaż zdjęcie profilowe" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Pokaż baner profilu" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "In memoriam" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Użytkownix postanowiłx nie udostępnić tych informacji." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Oryginalne" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Odpowiedzi" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Udostępnienia" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Statystyki wpisów nie są dostępne." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Pokaż statystyki wpisów" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Ostatni wpis: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Wyciszono" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Zablokowano" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Osobista notatka" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Wspomnij o <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Przetłumacz opis" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Edytuj osobistą notatkę" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Dodaj osobistą notatkę" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Włączono powiadomienia dla wpisów @{username}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Wyłączono powiadomienia dla wpisów @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Wyłącz powiadomienia" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Włącz powiadomienia" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "" + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Wyłącz udostępnienia" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Włącz udostępnienia" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Dodaj/usuń z list" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Skopiowano odnośnik" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Nie udało się skopiować odnośnika" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Kopiuj" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Udostępnianie zdaje się nie działać." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Udostępnij…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Usuń z obserwujących…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "" + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "" + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nazwa" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Opis" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Dodatkowe pola" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etykieta" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Zawartość" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Zapisz" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "nazwa użytkownika" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "nazwa domeny serwera" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Tryb Cloak jest wyłączony" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Tryb Cloak jest włączony" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Strona główna" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 "" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Odpowiedz na post @{0}(<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Odpowiedz na post @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Edycja postu źródłowego" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Ankieta musi mieć co najmniej 2 opcje" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Niektóre opcje ankiety są puste" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Niektóre media nie posiadają opisów. Kontynuować?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Załącznik #{i} nie powiódł się" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Ostrzeżenie o treściach lub wrażliwych plikach" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Publiczny" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Lokalne" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Niepubliczny" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Tylko dla obserwujących" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Prywatne wzmianki" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Opublikuj odpowiedź" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Odpowiedz" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Zaktualizuj" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Opublikuj" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Pobieram GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Pobieranie GIF'a nie powiodło się" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Więcej…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Opublikowano" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Opis zdjęcia" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Wygeneruj opis…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "" + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "" + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "" + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "" + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/pseudo-LOCALE.po b/src/locales/pseudo-LOCALE.po new file mode 100644 index 00000000..c2748cec --- /dev/null +++ b/src/locales/pseudo-LOCALE.po @@ -0,0 +1,3633 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-05 13:04+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: pseudo-LOCALE\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/components/account-block.jsx:133 +msgid "Locked" +msgstr "" + +#: src/components/account-block.jsx:139 +msgid "Posts: {0}" +msgstr "" + +#: src/components/account-block.jsx:144 +msgid "Last posted: {0}" +msgstr "" + +#: src/components/account-block.jsx:159 +#: src/components/account-info.jsx:635 +msgid "Automated" +msgstr "" + +#: src/components/account-block.jsx:166 +#: src/components/account-info.jsx:640 +#: src/components/status.jsx:439 +#: src/pages/catchup.jsx:1438 +msgid "Group" +msgstr "" + +#: src/components/account-block.jsx:176 +msgid "Mutual" +msgstr "" + +#: src/components/account-block.jsx:180 +#: src/components/account-info.jsx:1658 +msgid "Requested" +msgstr "" + +#: src/components/account-block.jsx:184 +#: src/components/account-info.jsx:417 +#: src/components/account-info.jsx:743 +#: src/components/account-info.jsx:757 +#: src/components/account-info.jsx:1649 +#: src/components/nav-menu.jsx:193 +#: src/components/shortcuts-settings.jsx:137 +#: src/pages/following.jsx:20 +#: src/pages/following.jsx:131 +msgid "Following" +msgstr "" + +#: src/components/account-block.jsx:188 +#: src/components/account-info.jsx:1060 +msgid "Follows you" +msgstr "" + +#: src/components/account-block.jsx:196 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "" + +#: src/components/account-block.jsx:205 +#: src/components/account-info.jsx:681 +msgid "Verified" +msgstr "" + +#: src/components/account-block.jsx:220 +#: src/components/account-info.jsx:778 +msgid "Joined <0>{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:57 +msgid "Forever" +msgstr "" + +#: src/components/account-info.jsx:378 +msgid "Unable to load account." +msgstr "" + +#: src/components/account-info.jsx:386 +msgid "Go to account page" +msgstr "" + +#: src/components/account-info.jsx:414 +#: src/components/account-info.jsx:703 +#: src/components/account-info.jsx:733 +msgid "Followers" +msgstr "" + +#: src/components/account-info.jsx:420 +#: src/components/account-info.jsx:774 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:237 +#: src/pages/search.jsx:384 +msgid "Posts" +msgstr "" + +#: src/components/account-info.jsx:428 +#: src/components/account-info.jsx:1116 +#: src/components/compose.jsx:2444 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:283 +#: src/components/status.jsx:1629 +#: src/components/status.jsx:1646 +#: src/components/status.jsx:1770 +#: src/components/status.jsx:2365 +#: src/components/status.jsx:2368 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:106 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1169 +#: src/pages/trending.jsx:437 +msgid "More" +msgstr "" + +#: src/components/account-info.jsx:440 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "" + +#: src/components/account-info.jsx:585 +#: src/components/account-info.jsx:1272 +msgid "Handle copied" +msgstr "" + +#: src/components/account-info.jsx:588 +#: src/components/account-info.jsx:1275 +msgid "Unable to copy handle" +msgstr "" + +#: src/components/account-info.jsx:594 +#: src/components/account-info.jsx:1281 +msgid "Copy handle" +msgstr "" + +#: src/components/account-info.jsx:600 +msgid "Go to original profile page" +msgstr "" + +#: src/components/account-info.jsx:607 +msgid "View profile image" +msgstr "" + +#: src/components/account-info.jsx:613 +msgid "View profile header" +msgstr "" + +#: src/components/account-info.jsx:630 +msgid "In Memoriam" +msgstr "" + +#: src/components/account-info.jsx:710 +#: src/components/account-info.jsx:748 +msgid "This user has chosen to not make this information available." +msgstr "" + +#: src/components/account-info.jsx:803 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "" + +#: src/components/account-info.jsx:819 +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 "" + +#: src/components/account-info.jsx:832 +msgid "{0, plural, one {Last 1 post in the past year(s)} other {Last {1} posts in the past year(s)}}" +msgstr "" + +#: src/components/account-info.jsx:856 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "" + +#: src/components/account-info.jsx:860 +#: src/components/status.jsx:2156 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1412 +#: src/pages/catchup.jsx:2023 +#: src/pages/status.jsx:892 +#: src/pages/status.jsx:1494 +msgid "Replies" +msgstr "" + +#: src/components/account-info.jsx:864 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1414 +#: src/pages/catchup.jsx:2035 +#: src/pages/settings.jsx:1008 +msgid "Boosts" +msgstr "" + +#: src/components/account-info.jsx:870 +msgid "Post stats unavailable." +msgstr "" + +#: src/components/account-info.jsx:901 +msgid "View post stats" +msgstr "" + +#: src/components/account-info.jsx:1064 +msgid "Last post: <0>{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:1078 +msgid "Muted" +msgstr "" + +#: src/components/account-info.jsx:1083 +msgid "Blocked" +msgstr "" + +#: src/components/account-info.jsx:1092 +msgid "Private note" +msgstr "" + +#: src/components/account-info.jsx:1149 +msgid "Mention @{username}" +msgstr "" + +#: src/components/account-info.jsx:1159 +msgid "Translate bio" +msgstr "" + +#: src/components/account-info.jsx:1170 +msgid "Edit private note" +msgstr "" + +#: src/components/account-info.jsx:1170 +msgid "Add private note" +msgstr "" + +#: src/components/account-info.jsx:1190 +msgid "Notifications enabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1191 +msgid "Notifications disabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1203 +msgid "Disable notifications" +msgstr "" + +#: src/components/account-info.jsx:1204 +msgid "Enable notifications" +msgstr "" + +#: src/components/account-info.jsx:1221 +msgid "Boosts from @{username} enabled." +msgstr "" + +#: src/components/account-info.jsx:1222 +msgid "Boosts from @{username} disabled." +msgstr "" + +#: src/components/account-info.jsx:1233 +msgid "Disable boosts" +msgstr "" + +#: src/components/account-info.jsx:1233 +msgid "Enable boosts" +msgstr "" + +#: src/components/account-info.jsx:1249 +#: src/components/account-info.jsx:1259 +#: src/components/account-info.jsx:1842 +msgid "Add/Remove from Lists" +msgstr "" + +#: src/components/account-info.jsx:1298 +#: src/components/status.jsx:1072 +msgid "Link copied" +msgstr "" + +#: src/components/account-info.jsx:1301 +#: src/components/status.jsx:1075 +msgid "Unable to copy link" +msgstr "" + +#: src/components/account-info.jsx:1307 +#: src/components/shortcuts-settings.jsx:1056 +#: src/components/status.jsx:1081 +#: src/components/status.jsx:3103 +msgid "Copy" +msgstr "" + +#: src/components/account-info.jsx:1322 +#: src/components/shortcuts-settings.jsx:1074 +#: src/components/status.jsx:1097 +msgid "Sharing doesn't seem to work." +msgstr "" + +#: src/components/account-info.jsx:1328 +#: src/components/status.jsx:1103 +msgid "Share…" +msgstr "" + +#: src/components/account-info.jsx:1348 +msgid "Unmuted @{username}" +msgstr "" + +#: src/components/account-info.jsx:1360 +msgid "Unmute @{username}" +msgstr "" + +#: src/components/account-info.jsx:1374 +msgid "Mute @{username}…" +msgstr "" + +#: src/components/account-info.jsx:1404 +msgid "Muted @{username} for {0}" +msgstr "" + +#: src/components/account-info.jsx:1416 +msgid "Unable to mute @{username}" +msgstr "" + +#: src/components/account-info.jsx:1437 +msgid "Remove @{username} from followers?" +msgstr "" + +#: src/components/account-info.jsx:1454 +msgid "@{username} removed from followers" +msgstr "" + +#: src/components/account-info.jsx:1466 +msgid "Remove follower…" +msgstr "" + +#: src/components/account-info.jsx:1477 +msgid "Block @{username}?" +msgstr "" + +#: src/components/account-info.jsx:1496 +msgid "Unblocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1504 +msgid "Blocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1512 +msgid "Unable to unblock @{username}" +msgstr "" + +#: src/components/account-info.jsx:1514 +msgid "Unable to block @{username}" +msgstr "" + +#: src/components/account-info.jsx:1524 +msgid "Unblock @{username}" +msgstr "" + +#: src/components/account-info.jsx:1531 +msgid "Block @{username}…" +msgstr "" + +#: src/components/account-info.jsx:1546 +msgid "Report @{username}…" +msgstr "" + +#: src/components/account-info.jsx:1564 +#: src/components/account-info.jsx:2072 +msgid "Edit profile" +msgstr "" + +#: src/components/account-info.jsx:1600 +msgid "Withdraw follow request?" +msgstr "" + +#: src/components/account-info.jsx:1601 +msgid "Unfollow @{0}?" +msgstr "" + +#: src/components/account-info.jsx:1652 +msgid "Unfollow…" +msgstr "" + +#: src/components/account-info.jsx:1661 +msgid "Withdraw…" +msgstr "" + +#: src/components/account-info.jsx:1668 +#: src/components/account-info.jsx:1672 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "" + +#: src/components/account-info.jsx:1783 +#: src/components/account-info.jsx:1837 +#: src/components/account-info.jsx:1970 +#: src/components/account-info.jsx:2067 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:797 +#: src/components/compose.jsx:2400 +#: src/components/compose.jsx:2873 +#: src/components/compose.jsx:3081 +#: src/components/compose.jsx:3311 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:33 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:247 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:227 +#: src/components/shortcuts-settings.jsx:580 +#: src/components/shortcuts-settings.jsx:780 +#: src/components/status.jsx:2828 +#: src/components/status.jsx:3067 +#: src/components/status.jsx:3565 +#: src/pages/accounts.jsx:33 +#: src/pages/catchup.jsx:1548 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:823 +#: src/pages/notifications.jsx:1055 +#: src/pages/settings.jsx:69 +#: src/pages/status.jsx:1256 +msgid "Close" +msgstr "" + +#: src/components/account-info.jsx:1788 +msgid "Translated Bio" +msgstr "" + +#: src/components/account-info.jsx:1882 +msgid "Unable to remove from list." +msgstr "" + +#: src/components/account-info.jsx:1883 +msgid "Unable to add to list." +msgstr "" + +#: src/components/account-info.jsx:1902 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "" + +#: src/components/account-info.jsx:1906 +msgid "No lists." +msgstr "" + +#: src/components/account-info.jsx:1917 +#: src/components/list-add-edit.jsx:37 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "" + +#: src/components/account-info.jsx:1975 +msgid "Private note about @{0}" +msgstr "" + +#: src/components/account-info.jsx:2002 +msgid "Unable to update private note." +msgstr "" + +#: src/components/account-info.jsx:2025 +#: src/components/account-info.jsx:2195 +msgid "Cancel" +msgstr "" + +#: src/components/account-info.jsx:2030 +msgid "Save & close" +msgstr "" + +#: src/components/account-info.jsx:2123 +msgid "Unable to update profile." +msgstr "" + +#: src/components/account-info.jsx:2143 +msgid "Bio" +msgstr "" + +#: src/components/account-info.jsx:2156 +msgid "Extra fields" +msgstr "" + +#: src/components/account-info.jsx:2162 +msgid "Label" +msgstr "" + +#: src/components/account-info.jsx:2165 +msgid "Content" +msgstr "" + +#: src/components/account-info.jsx:2198 +#: src/components/list-add-edit.jsx:147 +#: src/components/shortcuts-settings.jsx:712 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:910 +msgid "Save" +msgstr "" + +#: src/components/account-info.jsx:2251 +msgid "username" +msgstr "" + +#: src/components/account-info.jsx:2255 +msgid "server domain name" +msgstr "" + +#: src/components/background-service.jsx:138 +msgid "Cloak mode disabled" +msgstr "" + +#: src/components/background-service.jsx:138 +msgid "Cloak mode enabled" +msgstr "" + +#: src/components/columns.jsx:19 +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:137 +#: src/components/timeline.jsx:431 +#: src/pages/catchup.jsx:860 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:52 +#: src/pages/notifications.jsx:488 +msgid "Home" +msgstr "" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:34 +msgid "Compose" +msgstr "" + +#: src/components/compose.jsx:392 +msgid "You have unsaved changes. Discard this post?" +msgstr "" + +#: src/components/compose.jsx:614 +#: src/components/compose.jsx:630 +#: src/components/compose.jsx:1328 +#: src/components/compose.jsx:1582 +msgid "{maxMediaAttachments, plural, one {You can only attach up to 1 file.} other {You can only attach up to # files.}}" +msgstr "" + +#: src/components/compose.jsx:778 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:785 +msgid "Minimize" +msgstr "" + +#: src/components/compose.jsx:821 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:828 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:833 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:875 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:885 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Replying to @{0}’s post" +msgstr "" + +#: src/components/compose.jsx:908 +msgid "Editing source post" +msgstr "" + +#: src/components/compose.jsx:955 +msgid "Poll must have at least 2 options" +msgstr "" + +#: src/components/compose.jsx:959 +msgid "Some poll choices are empty" +msgstr "" + +#: src/components/compose.jsx:972 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1024 +msgid "Attachment #{i} failed" +msgstr "" + +#: src/components/compose.jsx:1118 +#: src/components/status.jsx:1955 +#: src/components/timeline.jsx:975 +msgid "Content warning" +msgstr "" + +#: src/components/compose.jsx:1134 +msgid "Content warning or sensitive media" +msgstr "" + +#: src/components/compose.jsx:1170 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:285 +msgid "Public" +msgstr "" + +#: src/components/compose.jsx:1173 +#: src/components/status.jsx:94 +#: src/pages/settings.jsx:288 +msgid "Unlisted" +msgstr "" + +#: src/components/compose.jsx:1176 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:291 +msgid "Followers only" +msgstr "" + +#: src/components/compose.jsx:1179 +#: src/components/status.jsx:96 +#: src/components/status.jsx:1833 +msgid "Private mention" +msgstr "" + +#: src/components/compose.jsx:1188 +msgid "Post your reply" +msgstr "" + +#: src/components/compose.jsx:1190 +msgid "Edit your post" +msgstr "" + +#: src/components/compose.jsx:1191 +msgid "What are you doing?" +msgstr "" + +#: src/components/compose.jsx:1266 +msgid "Mark media as sensitive" +msgstr "" + +#: src/components/compose.jsx:1364 +msgid "Add poll" +msgstr "" + +#: src/components/compose.jsx:1386 +msgid "Add custom emoji" +msgstr "" + +#: src/components/compose.jsx:1469 +#: src/components/keyboard-shortcuts-help.jsx:143 +#: src/components/status.jsx:1609 +#: src/components/status.jsx:1610 +#: src/components/status.jsx:2261 +msgid "Reply" +msgstr "" + +#: src/components/compose.jsx:1469 +msgid "Update" +msgstr "" + +#: src/components/compose.jsx:1469 +#: src/pages/status.jsx:565 +msgid "Post" +msgstr "" + +#: src/components/compose.jsx:1594 +msgid "Downloading GIF…" +msgstr "" + +#: src/components/compose.jsx:1622 +msgid "Failed to download GIF" +msgstr "" + +#: src/components/compose.jsx:1733 +#: src/components/compose.jsx:1810 +#: src/components/nav-menu.jsx:287 +msgid "More…" +msgstr "" + +#: src/components/compose.jsx:2213 +msgid "Uploaded" +msgstr "" + +#: src/components/compose.jsx:2226 +msgid "Image description" +msgstr "" + +#: src/components/compose.jsx:2227 +msgid "Video description" +msgstr "" + +#: src/components/compose.jsx:2228 +msgid "Audio description" +msgstr "" + +#: src/components/compose.jsx:2264 +#: src/components/compose.jsx:2284 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2276 +#: src/components/compose.jsx:2296 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2304 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2364 +#: src/components/compose.jsx:2614 +#: src/components/shortcuts-settings.jsx:723 +#: src/pages/catchup.jsx:1058 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "" + +#: src/components/compose.jsx:2381 +msgid "Error" +msgstr "" + +#: src/components/compose.jsx:2406 +msgid "Edit image description" +msgstr "" + +#: src/components/compose.jsx:2407 +msgid "Edit video description" +msgstr "" + +#: src/components/compose.jsx:2408 +msgid "Edit audio description" +msgstr "" + +#: src/components/compose.jsx:2453 +#: src/components/compose.jsx:2502 +msgid "Generating description. Please wait…" +msgstr "" + +#: src/components/compose.jsx:2473 +msgid "Failed to generate description: {0}" +msgstr "" + +#: src/components/compose.jsx:2474 +msgid "Failed to generate description" +msgstr "" + +#: src/components/compose.jsx:2486 +#: src/components/compose.jsx:2492 +#: src/components/compose.jsx:2538 +msgid "Generate description…" +msgstr "" + +#: src/components/compose.jsx:2525 +msgid "Failed to generate description{0}" +msgstr "" + +#: src/components/compose.jsx:2540 +msgid "({0}) <0>— experimental</0>" +msgstr "" + +#: src/components/compose.jsx:2559 +msgid "Done" +msgstr "" + +#: src/components/compose.jsx:2595 +msgid "Choice {0}" +msgstr "" + +#: src/components/compose.jsx:2642 +msgid "Multiple choices" +msgstr "" + +#: src/components/compose.jsx:2645 +msgid "Duration" +msgstr "" + +#: src/components/compose.jsx:2676 +msgid "Remove poll" +msgstr "" + +#: src/components/compose.jsx:2890 +msgid "Search accounts" +msgstr "" + +#: src/components/compose.jsx:2931 +#: src/components/shortcuts-settings.jsx:712 +#: src/pages/list.jsx:356 +msgid "Add" +msgstr "" + +#: src/components/compose.jsx:2944 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "" + +#: src/components/compose.jsx:3087 +msgid "Custom emojis" +msgstr "" + +#: src/components/compose.jsx:3107 +msgid "Search emoji" +msgstr "" + +#: src/components/compose.jsx:3138 +msgid "Error loading custom emojis" +msgstr "" + +#: src/components/compose.jsx:3149 +msgid "Recently used" +msgstr "" + +#: src/components/compose.jsx:3150 +msgid "Others" +msgstr "" + +#: src/components/compose.jsx:3188 +msgid "{0} more…" +msgstr "" + +#: src/components/compose.jsx:3326 +msgid "Search GIFs" +msgstr "" + +#: src/components/compose.jsx:3341 +msgid "Powered by GIPHY" +msgstr "" + +#: src/components/compose.jsx:3349 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3447 +#: src/components/media-modal.jsx:387 +#: src/components/timeline.jsx:880 +msgid "Previous" +msgstr "" + +#: src/components/compose.jsx:3465 +#: src/components/media-modal.jsx:406 +#: src/components/timeline.jsx:897 +msgid "Next" +msgstr "" + +#: src/components/compose.jsx:3482 +msgid "Error loading GIFs" +msgstr "" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:664 +msgid "Unsent drafts" +msgstr "" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:100 +msgid "Delete this draft?" +msgstr "" + +#: src/components/drafts.jsx:115 +msgid "Error deleting draft! Please try again." +msgstr "" + +#: src/components/drafts.jsx:125 +#: src/components/list-add-edit.jsx:183 +#: src/components/status.jsx:1244 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "" + +#: src/components/drafts.jsx:144 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:169 +msgid "Delete all drafts?" +msgstr "" + +#: src/components/drafts.jsx:187 +msgid "Error deleting drafts! Please try again." +msgstr "" + +#: src/components/drafts.jsx:199 +msgid "Delete all…" +msgstr "" + +#: src/components/drafts.jsx:207 +msgid "No drafts found." +msgstr "" + +#: src/components/drafts.jsx:243 +#: src/pages/catchup.jsx:1895 +msgid "Poll" +msgstr "" + +#: src/components/drafts.jsx:246 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "" + +#: src/components/follow-request-buttons.jsx:42 +msgid "Accept" +msgstr "" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1171 +msgid "Accepted" +msgstr "" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:429 +#: src/pages/accounts.jsx:38 +#: src/pages/search.jsx:227 +#: src/pages/search.jsx:260 +msgid "Accounts" +msgstr "" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:513 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:803 +#: src/pages/search.jsx:454 +#: src/pages/status.jsx:1289 +msgid "Show more…" +msgstr "" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:518 +#: src/pages/search.jsx:459 +msgid "The end." +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:398 +#: src/pages/catchup.jsx:1586 +msgid "Keyboard shortcuts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1611 +msgid "Next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1619 +msgid "Previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1643 +msgid "Open post details" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Compose new post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Compose new post (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:130 +msgid "Send post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:139 +#: src/components/nav-menu.jsx:367 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:176 +#: src/pages/search.jsx:39 +#: src/pages/search.jsx:209 +msgid "Search" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +msgid "Reply (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:156 +msgid "Like (favourite)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +#: src/components/status.jsx:842 +#: src/components/status.jsx:2287 +#: src/components/status.jsx:2319 +#: src/components/status.jsx:2320 +msgid "Boost" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:927 +#: src/components/status.jsx:2344 +#: src/components/status.jsx:2345 +msgid "Bookmark" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:176 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/list-add-edit.jsx:37 +msgid "Edit list" +msgstr "" + +#: src/components/list-add-edit.jsx:93 +msgid "Unable to edit list." +msgstr "" + +#: src/components/list-add-edit.jsx:94 +msgid "Unable to create list." +msgstr "" + +#: src/components/list-add-edit.jsx:102 +msgid "Name" +msgstr "" + +#: src/components/list-add-edit.jsx:122 +msgid "Show replies to list members" +msgstr "" + +#: src/components/list-add-edit.jsx:125 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:128 +msgid "Don't show replies" +msgstr "" + +#: src/components/list-add-edit.jsx:141 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:147 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "" + +#: src/components/list-add-edit.jsx:154 +msgid "Delete this list?" +msgstr "" + +#: src/components/list-add-edit.jsx:173 +msgid "Unable to delete list." +msgstr "" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:971 +#: src/components/status.jsx:998 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:985 +#: src/components/status.jsx:1012 +msgid "Speak" +msgstr "" + +#: src/components/media-modal.jsx:294 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:298 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:314 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:329 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:339 +msgid "Describe image…" +msgstr "" + +#: src/components/media-modal.jsx:362 +msgid "View post" +msgstr "" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3395 +#: src/components/status.jsx:3491 +#: src/components/status.jsx:3569 +#: src/components/timeline.jsx:964 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1843 +msgid "Filtered" +msgstr "" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:126 +msgid "Menu" +msgstr "" + +#: src/components/nav-menu.jsx:162 +msgid "Reload page now to update?" +msgstr "" + +#: src/components/nav-menu.jsx:174 +msgid "New update available…" +msgstr "" + +#: src/components/nav-menu.jsx:200 +#: src/pages/catchup.jsx:855 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:207 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:143 +#: src/pages/home.jsx:223 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1000 +#: src/pages/trending.jsx:347 +msgid "Mentions" +msgstr "" + +#: src/components/nav-menu.jsx:214 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:149 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:83 +#: src/pages/home.jsx:183 +#: src/pages/notifications.jsx:89 +#: src/pages/notifications.jsx:492 +msgid "Notifications" +msgstr "" + +#: src/components/nav-menu.jsx:217 +msgid "New" +msgstr "" + +#: src/components/nav-menu.jsx:228 +msgid "Profile" +msgstr "" + +#: src/components/nav-menu.jsx:241 +#: src/components/nav-menu.jsx:268 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:155 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "" + +#: src/components/nav-menu.jsx:249 +#: src/components/shortcuts.jsx:209 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "" + +#: src/components/nav-menu.jsx:276 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:192 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "" + +#: src/components/nav-menu.jsx:296 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:198 +#: src/pages/catchup.jsx:1413 +#: src/pages/catchup.jsx:2029 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1004 +msgid "Likes" +msgstr "" + +#: src/components/nav-menu.jsx:302 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "" + +#: src/components/nav-menu.jsx:309 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "" + +#: src/components/nav-menu.jsx:316 +msgid "Muted users" +msgstr "" + +#: src/components/nav-menu.jsx:322 +msgid "Muted users…" +msgstr "" + +#: src/components/nav-menu.jsx:328 +msgid "Blocked users" +msgstr "" + +#: src/components/nav-menu.jsx:335 +msgid "Blocked users…" +msgstr "" + +#: src/components/nav-menu.jsx:346 +msgid "Accounts…" +msgstr "" + +#: src/components/nav-menu.jsx:356 +#: src/pages/login.jsx:142 +#: src/pages/status.jsx:792 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "" + +#: src/components/nav-menu.jsx:373 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:169 +#: src/pages/trending.jsx:407 +msgid "Trending" +msgstr "" + +#: src/components/nav-menu.jsx:379 +#: src/components/shortcuts-settings.jsx:162 +msgid "Local" +msgstr "" + +#: src/components/nav-menu.jsx:385 +#: src/components/shortcuts-settings.jsx:162 +msgid "Federated" +msgstr "" + +#: src/components/nav-menu.jsx:408 +msgid "Shortcuts / Columns…" +msgstr "" + +#: src/components/nav-menu.jsx:418 +#: src/components/nav-menu.jsx:432 +msgid "Settings…" +msgstr "" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "" + +#: src/components/notification.jsx:68 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:75 +msgid "{account} published a post." +msgstr "" + +#: src/components/notification.jsx:83 +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 "" + +#: src/components/notification.jsx:126 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:140 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:149 +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 "" + +#: src/components/notification.jsx:191 +msgid "A poll you have voted in or created has ended." +msgstr "" + +#: src/components/notification.jsx:192 +msgid "A poll you have created has ended." +msgstr "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:194 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:202 +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 "" + +#: src/components/notification.jsx:244 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:246 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:251 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:257 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:267 +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." +msgstr "" + +#: src/components/notification.jsx:273 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:279 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:287 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:288 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:289 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:290 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:291 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:364 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:425 +#: src/components/status.jsx:941 +#: src/components/status.jsx:951 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:426 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:427 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:428 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:484 +#: src/components/notification.jsx:500 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:680 +#: src/components/status.jsx:189 +msgid "Read more →" +msgstr "" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "" + +#: src/components/poll.jsx:135 +#: src/components/poll.jsx:218 +#: src/components/poll.jsx:222 +msgid "Hide results" +msgstr "" + +#: src/components/poll.jsx:184 +msgid "Vote" +msgstr "" + +#: src/components/poll.jsx:204 +#: src/components/poll.jsx:206 +#: src/pages/status.jsx:1158 +#: src/pages/status.jsx:1181 +msgid "Refresh" +msgstr "" + +#: src/components/poll.jsx:218 +#: src/components/poll.jsx:222 +msgid "Show results" +msgstr "" + +#: src/components/poll.jsx:227 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:244 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:264 +msgid "Ended <0/>" +msgstr "" + +#: src/components/poll.jsx:268 +msgid "Ended" +msgstr "" + +#: src/components/poll.jsx:271 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:275 +msgid "Ending" +msgstr "" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:46 +msgid "{0}s" +msgstr "" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:51 +msgid "{0}m" +msgstr "" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:56 +msgid "{0}h" +msgstr "" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "" + +#: src/components/report-modal.jsx:255 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:265 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:274 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:277 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:282 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:293 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:296 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:301 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:146 +msgid "Instance" +msgstr "" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:232 +#: src/components/shortcuts.jsx:186 +msgid "Shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:240 +msgid "beta" +msgstr "" + +#: src/components/shortcuts-settings.jsx:246 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:252 +msgid "Floating button" +msgstr "" + +#: src/components/shortcuts-settings.jsx:257 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:262 +msgid "Multi-column" +msgstr "" + +#: src/components/shortcuts-settings.jsx:329 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:348 +msgid "Move up" +msgstr "" + +#: src/components/shortcuts-settings.jsx:364 +msgid "Move down" +msgstr "" + +#: src/components/shortcuts-settings.jsx:376 +#: src/components/status.jsx:1209 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "" + +#: src/components/shortcuts-settings.jsx:397 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:408 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:409 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:440 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:441 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:455 +msgid "Import/export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:465 +msgid "Add column…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:466 +msgid "Add shortcut…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:513 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:514 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:515 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:584 +msgid "Edit shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:584 +msgid "Add shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:620 +msgid "Timeline" +msgstr "" + +#: src/components/shortcuts-settings.jsx:646 +msgid "List" +msgstr "" + +#: src/components/shortcuts-settings.jsx:785 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:795 +msgid "Import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:803 +msgid "Paste shortcuts here" +msgstr "" + +#: src/components/shortcuts-settings.jsx:819 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:848 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:909 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:914 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:924 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:932 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:957 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:972 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:973 +#: src/components/shortcuts-settings.jsx:997 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:983 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:991 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:992 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1006 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1006 +msgid "Import…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1015 +msgid "Export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1030 +msgid "Shortcuts copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Unable to copy shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1047 +msgid "Shortcut settings copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Unable to copy shortcut settings" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1080 +msgid "Share" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1119 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1126 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1131 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1142 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1154 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1167 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:463 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:562 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:715 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:716 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:755 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:756 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "{repliesCount, plural, =0 {Reply} other {{0}}}" +msgstr "" + +#: src/components/status.jsx:842 +#: src/components/status.jsx:903 +#: src/components/status.jsx:2287 +#: src/components/status.jsx:2319 +msgid "Unboost" +msgstr "" + +#: src/components/status.jsx:858 +#: src/components/status.jsx:2302 +msgid "Quote" +msgstr "" + +#: src/components/status.jsx:866 +#: src/components/status.jsx:2311 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:873 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:892 +#: src/components/status.jsx:1334 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:893 +#: src/components/status.jsx:1335 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:901 +msgid "{reblogsCount, plural, =0 {{0}} other {{1}}}" +msgstr "" + +#: src/components/status.jsx:903 +msgid "Boost…" +msgstr "" + +#: src/components/status.jsx:914 +msgid "{favouritesCount, plural, =0 {{0}} other {{1}}}" +msgstr "" + +#: src/components/status.jsx:916 +#: src/components/status.jsx:1619 +#: src/components/status.jsx:2332 +msgid "Unlike" +msgstr "" + +#: src/components/status.jsx:916 +#: src/components/status.jsx:1619 +#: src/components/status.jsx:1620 +#: src/components/status.jsx:2332 +#: src/components/status.jsx:2333 +msgid "Like" +msgstr "" + +#: src/components/status.jsx:927 +#: src/components/status.jsx:2344 +msgid "Unbookmark" +msgstr "" + +#: src/components/status.jsx:1035 +msgid "View post by @{0}" +msgstr "" + +#: src/components/status.jsx:1053 +msgid "Show Edit History" +msgstr "" + +#: src/components/status.jsx:1056 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1116 +#: src/components/status.jsx:3072 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1136 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1137 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1146 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1153 +msgid "Mute conversation" +msgstr "" + +#: src/components/status.jsx:1169 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1170 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1175 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1175 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1184 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1191 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1220 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1233 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1236 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1264 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1620 +#: src/components/status.jsx:1656 +#: src/components/status.jsx:2333 +msgid "Liked" +msgstr "" + +#: src/components/status.jsx:1653 +#: src/components/status.jsx:2320 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1663 +#: src/components/status.jsx:2345 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1667 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1712 +#: src/components/status.jsx:2164 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1753 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1842 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:1918 +#: src/components/status.jsx:1980 +#: src/components/status.jsx:2065 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:1918 +#: src/components/status.jsx:1980 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2065 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2185 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2262 +msgid "Comments" +msgstr "" + +#: src/components/status.jsx:2833 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:2837 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:2842 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3077 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3094 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3097 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3109 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3131 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3162 +#: src/components/status.jsx:3207 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3176 +msgid "Emojis:" +msgstr "" + +#: src/components/status.jsx:3221 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3225 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3231 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3236 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3242 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3248 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3257 +msgid "Note: This preview is lightly styled." +msgstr "" + +#: src/components/status.jsx:3499 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:447 +#: src/pages/settings.jsx:1028 +msgid "New posts" +msgstr "" + +#: src/components/timeline.jsx:548 +#: src/pages/home.jsx:212 +#: src/pages/notifications.jsx:779 +#: src/pages/status.jsx:945 +#: src/pages/status.jsx:1318 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:937 +#: src/components/timeline.jsx:944 +#: src/pages/catchup.jsx:1860 +msgid "Thread" +msgstr "" + +#: src/components/timeline.jsx:959 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:212 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:228 +msgid "Failed to translate" +msgstr "" + +#: src/compose.jsx:29 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:31 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:55 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:63 +msgid "Close window" +msgstr "" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:415 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:52 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:98 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:117 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:134 +msgid "Set as default" +msgstr "" + +#: src/pages/accounts.jsx:144 +msgid "Log out @{0}?" +msgstr "" + +#: src/pages/accounts.jsx:161 +msgid "Log out…" +msgstr "" + +#: src/pages/accounts.jsx:174 +msgid "Add an existing account" +msgstr "" + +#: src/pages/accounts.jsx:181 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "" + +#: 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 "" + +#: src/pages/catchup.jsx:866 +#: src/pages/catchup.jsx:890 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:880 +#: src/pages/catchup.jsx:1552 +msgid "Help" +msgstr "" + +#: src/pages/catchup.jsx:896 +msgid "What is this?" +msgstr "" + +#: src/pages/catchup.jsx:899 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:910 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:919 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:924 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:928 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:951 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:981 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:987 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:999 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1008 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1018 +msgid "Previously…" +msgstr "" + +#: src/pages/catchup.jsx:1036 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1046 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1067 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1082 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1085 +msgid "This might take a while." +msgstr "" + +#: src/pages/catchup.jsx:1120 +msgid "Reset filters" +msgstr "" + +#: src/pages/catchup.jsx:1128 +#: src/pages/catchup.jsx:1558 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1244 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1283 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:222 +msgid "All" +msgstr "" + +#: src/pages/catchup.jsx:1368 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1380 +msgid "Sort" +msgstr "" + +#: src/pages/catchup.jsx:1411 +msgid "Date" +msgstr "" + +#: src/pages/catchup.jsx:1415 +msgid "Density" +msgstr "" + +#: src/pages/catchup.jsx:1453 +msgid "Authors" +msgstr "" + +#: src/pages/catchup.jsx:1454 +msgid "None" +msgstr "" + +#: src/pages/catchup.jsx:1470 +msgid "Show all authors" +msgstr "" + +#: src/pages/catchup.jsx:1521 +msgid "You don't have to read everything." +msgstr "" + +#: src/pages/catchup.jsx:1522 +msgid "That's all." +msgstr "" + +#: src/pages/catchup.jsx:1530 +msgid "Back to top" +msgstr "" + +#: src/pages/catchup.jsx:1561 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1567 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1570 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1577 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1580 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1627 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1635 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1651 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1842 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:133 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:134 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:444 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:447 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:459 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:470 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:208 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:228 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:234 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:223 +msgid "Go home" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove @{0} from list?" +msgstr "" + +#: src/pages/list.jsx:356 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:185 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:196 +msgid "Failed to log in. Please try again or another instance." +msgstr "" + +#: src/pages/login.jsx:208 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:209 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:217 +msgid "Don't have an account? Create one!" +msgstr "" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:506 +#: src/pages/notifications.jsx:827 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:524 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:535 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:582 +#: src/pages/settings.jsx:1016 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:587 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:642 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:708 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:712 +msgid "Today" +msgstr "" + +#: src/pages/notifications.jsx:716 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:739 +msgid "Yesterday" +msgstr "" + +#: src/pages/notifications.jsx:775 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:854 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:862 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:872 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:883 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:894 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:905 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:973 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1041 +msgid "View notifications from @{0}" +msgstr "" + +#: src/pages/notifications.jsx:1059 +msgid "Notifications from @{0}" +msgstr "" + +#: src/pages/notifications.jsx:1123 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1128 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1133 +msgid "Allow" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1178 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:43 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:46 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:232 +#: src/pages/search.jsx:314 +msgid "Hashtags" +msgstr "" + +#: src/pages/search.jsx:264 +#: src/pages/search.jsx:318 +#: src/pages/search.jsx:388 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:290 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:304 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:360 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:374 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:418 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:432 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:476 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:74 +msgid "Settings" +msgstr "" + +#: src/pages/settings.jsx:83 +msgid "Appearance" +msgstr "" + +#: src/pages/settings.jsx:159 +msgid "Light" +msgstr "" + +#: src/pages/settings.jsx:170 +msgid "Dark" +msgstr "" + +#: src/pages/settings.jsx:183 +msgid "Auto" +msgstr "" + +#: src/pages/settings.jsx:193 +msgid "Text size" +msgstr "" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:198 +#: src/pages/settings.jsx:223 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:236 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:252 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:253 +#: src/pages/settings.jsx:299 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:278 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:301 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:316 +msgid "Experiments" +msgstr "" + +#: src/pages/settings.jsx:329 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:341 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:357 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:368 +msgid "Translate to" +msgstr "" + +#: src/pages/settings.jsx:378 +msgid "System language ({systemTargetLanguageText})" +msgstr "" + +#: src/pages/settings.jsx:404 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:451 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:485 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:489 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:509 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:542 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:547 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:554 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:580 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:584 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:605 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:610 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:621 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:647 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:672 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:711 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:740 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:748 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:756 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:763 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:770 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:785 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:788 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:913 +#: src/pages/settings.jsx:918 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:924 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:931 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:953 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:962 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:971 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:975 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:979 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1012 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1020 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1024 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1045 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1061 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#: src/pages/status.jsx:786 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:799 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:827 +msgid "Error: {e}" +msgstr "" + +#: src/pages/status.jsx:834 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:936 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1048 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1079 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1102 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1145 +#: src/pages/status.jsx:1208 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1209 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1227 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1232 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1241 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1248 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1251 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1309 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1426 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1444 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1466 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:70 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:227 +msgid "Trending News" +msgstr "" + +#: src/pages/trending.jsx:374 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:379 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:391 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:414 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:123 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:127 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:130 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:139 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:143 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:146 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:154 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:158 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:161 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:170 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:174 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:177 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:186 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:190 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:193 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" diff --git a/src/locales/pt-BR.po b/src/locales/pt-BR.po new file mode 100644 index 00000000..a3f11c19 --- /dev/null +++ b/src/locales/pt-BR.po @@ -0,0 +1,3808 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: pt\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 22:00\n" +"Last-Translator: \n" +"Language-Team: Portuguese, Brazilian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Bloqueado" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Publicações: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Última publicação: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automático" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Grupo" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Mútuo" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Solicitado" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Seguindo" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Segue você" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# seguidor} other {# seguidores}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Verificado" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Se juntou em <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Permanente" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Não foi possível carregar a conta." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Ir à página da conta" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Seguidores" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Seguindo" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Publicações" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +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 é:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Identificador copiado" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Não foi possível copiar o identificador" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Copiar identificador" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Ir à página do perfil original" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Ver foto de perfil" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Ver banner de perfil" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +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." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} publicações originais, {1} respostas, {2} impulsos" + +#: 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}}}}" + +#: 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)}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Original" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Respostas" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Impulsos" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "As estatísticas estão indisponíveis." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Ver estatísticas" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Última publicação: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Silenciado" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Bloqueado" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Nota privada" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Mencionar <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Traduzir bio" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Editar nota privada" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +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}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Notificações desativadas para as publicações de @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Desativar notificações" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Ativar notificações" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Impulsos de @{username} ativados." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Impulsos de @{username} desativados." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Desativar impulsos" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Ativar impulsos" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Adicionar/remover das listas" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Link copiado" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Não foi possível copiar link" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Copiar" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Compartilhar não parece estar funcionando." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Compartilhar…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Dessilenciou @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Dessilenciar <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Silenciar <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Silenciou @{username} por {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Não foi possível silenciar @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Excluir <0>@{username}</0> dos seguidores?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} excluído dos seguidores" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Excluir seguidor…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Bloquear <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Desbloqueou @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Bloqueou @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Não foi possível desbloquear @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Não foi possível bloquear @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Desbloquear <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Bloquear <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Denunciar <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Editar perfil" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Excluir solicitação de seguimento?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Parar de seguir @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Parar de seguir…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Excluir…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Seguir" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Fechar" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Bio traduzida" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Não foi possível remover da lista." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Não foi possível adicionar à lista." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Não foi possível carregar listas." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Não há listas." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nova lista" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Nota privada sobre <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Não foi possível atualizar nota privada." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Cancelar" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Salvar e fechar" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Não foi possível atualizar perfil." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nome" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Bio" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Campos adicionais" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etiqueta" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Conteúdo" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Salvar" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "nome de usuário" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "domínio do servidor" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Modo oculto desativado" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Modo oculto ativado" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Início" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Escrever" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Adicionar mídia" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Adicionar emoji personalizado" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Adicionar GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Adicionar enquete" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Você tem mudanças não salvas. Descartar publicação?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {O arquivo {1} não é suportado.} other {Os arquivos {2} não são suportados.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Você só pode anexar até 1 arquivo.} other {Você só pode anexar até # arquivos.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Fechar" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimizar" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Parece que você fechou a janela principal." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Parece que você já tem um campo de edição aberto na janela principal e está atualmente publicando. Espere até terminar e tente novamente mais tarde." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Parece que você já tem um campo de edição aberto na janela principal. Abrir esta janela irá desfazer as mudanças que você fez na janela principal. Continuar?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Abrir" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Respondendo à publicação de @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Respondendo à publicação de @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Editando publicação original" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "A enquete deve ter no mínimo 2 opções" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Algumas opções da enquete estão vazias" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Algumas das mídias não têm descrição. Continuar?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Anexo #{i} falhou" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Aviso de conteúdo" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Aviso de conteúdo ou mídia sensível" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Público" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Local" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Não listado" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Apenas seguidores" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Menção privada" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Publicar resposta" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Editar publicação" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "O que você está fazendo?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Marcar mídia como sensível" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Adicionar" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Responder" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Atualizar" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Publicar" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Baixando GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Houve um erro ao baixar GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Mais…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Enviado" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Descrição da imagem" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Descrição do vídeo" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Descrição do áudio" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +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." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "A dimensão é muito grande. Enviá-lo pode enfrentar problemas. Reduza a dimensão de {0}×{1}px a {2}×{3}px." + +#: src/components/compose.jsx:2451 +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:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Excluir" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Erro" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Editar descrição da imagem" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Editar descrição do vídeo" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Editar descrição do áudio" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Gerando descrição. Por favor, espere…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Houve um erro ao gerar descrição: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Houve um erro ao gerar descrição" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Gerar descrição…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Houve um erro ao gerar descrição{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— experimental</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Concluído" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Escolha {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Várias escolhas" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Duração" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Excluir enquete" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Procurar contas" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Erro ao carregar contas" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Emojis personalizados" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Procurar emoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Erro ao carregar emojis personalizados" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Usado recentemente" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Outros" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} mais…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Procurar GIFs" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Desenvolvido por GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Escreva para pesquisar GIFs" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Anterior" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Seguinte" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Erro ao carregar GIFs" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Rascunhos não enviados" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Parece que você tem alguns rascunhos não enviados. Vamos continuar de onde você parou." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Excluir rascunho?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Erro ao excluir rascunho. Tente novamente." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Excluir…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Erro ao obter estado de resposta!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Excluir rascunhos?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Erro ao excluir rascunhos. Tente novamente." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Excluir tudo…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Não há rascunho encontrado." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Enquete" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Mídia" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Abrir em nova janela" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Aceitar" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Rejeitar" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Aceitado" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Rejeitado" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Nada para mostrar" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Contas" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Mostrar mais…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Fim." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Atalhos do teclado" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Ajuda com atalhos do teclado" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Próxima publicação" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Publicação anterior" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Pular carrossel para a próxima publicação" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Pular carrossel para a publicação anterior" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Carregar novas publicações" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Abrir detalhes da publicação" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> ou <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Expandir aviso de conteúdo ou<0/>alternar tópico expandido/colapsado" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Fechar publicação ou diálogos" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> ou <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Focar coluna no modo multi-coluna" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> a <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Focar na próxima coluna no modo multi-coluna" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Focar na coluna anterior no modo multi-coluna" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Escrever nova publicação" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Escrever nova publicação (nova janela)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Enviar publicação" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> ou <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Buscar" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Responder (nova janela)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Curtida (favorito)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> ou <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Impulsionar" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Favoritar" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Alternar modo oculto" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Editar lista" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Não foi possível editar lista." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Não foi possível criar lista." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Mostrar respostas aos membros da lista" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Mostrar respostas para quem sigo" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Não mostrar respostas" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Ocultar publicações nessa lista do Início/Seguindo" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Criar" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Excluir lista?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Não foi possível excluir lista." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Descrição da mídia" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Traduzir" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Falar" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Abrir mídia original em nova janela" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Abrir mídia original" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Tentando descrever imagem. Por favor, espere…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Houve um erro ao descrever imagem" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Descrever imagem…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Ver publicação" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Mídia sensível" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtrado: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrado" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Publicado. Dê uma conferida." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Resposta publicada. Dê uma conferida." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Publicação atualizada. Dê uma conferida." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menu" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Recarregar página para atualizar?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nova atualização disponível…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Seguindo" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Acompanhar" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Menções" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Notificações" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Novo" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Perfil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Favoritos" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Curtidas" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Hashtags seguidas" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtros" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Usuários silenciados" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Usuários silenciados…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Usuários bloqueados" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Usuários bloqueados…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Contas…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Iniciar sessão" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Tendência" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federado" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Atalhos / Colunas…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Opções…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Listas" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Todas as listas" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Notificação" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Esta notificação é da sua outra conta." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Ver todas as notificações" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} reagiu a sua publicação com {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} fez uma publicação." + +#: src/components/notification.jsx:85 +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 sua resposta.} other {{account} impulsionou sua publicação.}}} other {{account} impulsionou {postsCount} publicações suas.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> impulsionou(aram) sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> impulsionou(aram) sua publicação.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} seguiu você.} other {<0><1>{0}</1> pessoa(s)</0> seguiu você.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} solicitou seguir você." + +#: src/components/notification.jsx:151 +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} curtiu sua resposta.} other {{account} curtiu sua publicação.}}} other {{account} curtiu {postsCount} publicações suas.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> curtiu(ram) sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> curtiu(ram) sua publicação.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "A enquete que você votou ou criou já acabou." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "A enquete que você criou já acabou." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "A enquete que você votou já acabou." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Uma publicação que você interagiu foi editada." + +#: src/components/notification.jsx:204 +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 curtiu sua resposta.} other {{account} impulsionou e curtiu sua publicação.}}} other {{account} impulsionou e curtiu {postsCount} publicações suas.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> impulsionou(aram) e curtiu(ram) sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> impulsionou(aram) e curtiu(ram) sua publicação.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} registrada." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} denunciou {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Perdeu conexões com <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Aviso da moderação" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "Seu #Wrapstodon {year} acaba de chegar!" + +#: src/components/notification.jsx:272 +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." +msgstr "Um administrador de <0>{from}</0> suspendeu <1>{targetName}</1></0>, O que significa que você não receberá atualizações ou interações deles." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Um administrador de <0>{from}</0> bloqueou <1>{targetName}</1>. Seguidores afetados: {followersCount}, seguindo: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Você bloqueou <0>{targetName}</0>.\n" +"Seguidores removidos: {followersCount}, seguindo: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Sua conta recebeu um aviso da moderação." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Sua conta foi desativada." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Algumas de suas publicações foram marcadas como sensíveis." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Algumas publicações suas foram excluídas." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Suas publicações foram marcadas como sensível de agora em diante." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Sua conta foi limitada." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Sua conta foi suspensa." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Tipo de notificação desconhecida: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Impulsionado/Curtido por…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Curtido por…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Impulsionado por…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Seguido por…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Saiba mais <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "Ver #Wrapstodon" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Ler mais →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Votado" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# voto} other {# votos}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Ocultar resultado" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Votar" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Atualizar" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Exibir resultado" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> voto} other {<1>{1}</1> votos}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> votante} other {<1>{1}</1> votantes}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Terminou <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Terminou" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Terminando <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Terminando" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Spam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Links falsos, interações falsas, ou respostas repetitivas" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Ilegal" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Viola a lei do seu país ou do servidor" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Regra de violação do servidor" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Quebra regras específicas do servidor" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Violação" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Outro" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "O problema não se encaixa em outras categorias" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Denunciar publicação" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Denunciar @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Revisão pendente" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Publicação denunciada" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Perfil denunciado" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Não foi possível denunciar publicação" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Não foi possível denunciar perfil" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "O que tem de errado com a publicação?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "O que tem de errado com o perfil?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Informações adicionais" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Encaminhar à <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Enviar relatório" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Silenciou {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Não foi possível silenciar {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Enviar relatório <0>+ Silenciar perfil</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Bloqueou {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Não foi possível bloquear {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Enviar relatório <0>+ Bloquear perfil</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ contas, hashtags e publicações</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Publicações com <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Publicações marcadas com <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Procurar <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Contas com <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Inicio / Seguindo" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Público (Local / Federado)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Conta" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Hashtag" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID de lista" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Apenas local" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instância" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Opcional, ex.: mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Procurar termo" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Opcional, menos para o modo multi-coluna" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "ex.: PixelArt (Máx. 5, separado por espaço)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Apenas mídia" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Atalhos" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Especifique uma lista de atalhos que aparecerá como:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Botão flutuante" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Aba/Barra do menu" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Multi-coluna" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Indisponível no modo de vista atual" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Mover para cima" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Mover para baixo" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Editar" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Adicione mais de um atalho ou coluna para fazer funcionar." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Não há colunas ainda. Clique no botão de adicionar coluna." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Não há atalhos ainda. Clique no botão de adicionar atalho." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Sem certeza do que adicionar?<0/>Tente adicionando as <1>Notificações do Início / Seguindo </1> primeiramente." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Máximo {SHORTCUTS_LIMIT} colunas" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Máximo {SHORTCUTS_LIMIT} atalhos" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importar/Exportar" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Adicionar coluna…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Adicionar atalho…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "A lista específica é opcional. Para o modo multi-coluna a lista é necessária, ou a coluna não será exibida." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Para o modo multi-coluna, procurar o termo é necessário ou a coluna não será exibida." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Várias hashtags são suportadas. Separado por espaço." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Editar atalho" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Adicionar atalho" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Linha do tempo" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Lista" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importar/Exportar <0>atalhos</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importar" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Cole atalhos aqui" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Baixando atalhos salvos do servidor de instância…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Não foi possível baixar atalhos" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Baixar atalhos do servidor de instância" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Existem nos atuais atalhos" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "A lista pode não funcionar se for de uma conta diferente." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Formato de opções inválido" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Anexar aos atalhos atuais?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Apenas atalhos que não existem no atalho atual serão anexados." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Não há atalhos novos para importar" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Atalhos importados. Máximo excedido {SHORTCUTS_LIMIT}, então o resto não será importado." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Atalhos importados" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importar e anexar…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Substituir atalhos atuais?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Importar atalhos?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "ou substituir…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importar…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exportar" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Atalhos copiados" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Não foi possível copiar atalhos" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Opções de atalhos copiados" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Não foi possível copiar as opções de atalho" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Compartilhar" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Salvando atalhos no servidor de instância…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Atalhos salvos" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Não foi possível salvar atalhos" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sincronizar ao servidor de instância" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# carácter} other {# carácteres}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Atalhos brutos JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importar/exportar opções do/para servidor de instância (Muito experimental)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>impulsionou</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Desculpe, a atual instância registrada não pode interagir com esta publicação de outra instância." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Não curtiu a publicação de @{0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Curtiu a publicação de @{0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Removeu dos favoritos a publicação de @{0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Favoritou a publicação de @{0}" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Remover impulso" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Citar" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Algumas das mídias não têm descrição." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Publicação antiga (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Removeu impulso da publicação de @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Impulsionou a publicação de @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Impulsionar…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Remover curtida" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Curtir" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Remover dos favoritos" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Ver publicação de <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Exibir histórico de edições" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Editado: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Incorporar publicação" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Conversa dessilenciada" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Conversa silenciada" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Não foi possível dessilenciar conversa" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Não foi possível silenciar conversa" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Dessilenciar conversa" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Silenciar conversa" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Publicação desafixada do perfil" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Publicação fixada no perfil" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Não foi possível desafixar publicação" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Não foi possível fixar publicação" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Desafixar do perfil" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Fixar ao perfil" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Excluir publicação?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Publicação excluída" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Não foi possível excluir publicação" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Denunciar publicação…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Curtido" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Impulsionado" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Favoritado" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Fixado" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Excluído" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# resposta} other {# respostas}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Tópico{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Mostrar menos" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Mostrar conteúdo" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Mostrar mídia" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Editado" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Comentários" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Mais de <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Histórico de edições" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Houve um erro ao carregar histórico" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Carregando…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "Código HTML" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Código HTML copiado" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Não foi possível copiar código HTML" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Anexos de mídia:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Emojis da conta:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL estático" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojis:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notas:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Isso é estático, instável e sem guião. Você pode precisar para aplicar seus próprios estilos e editar caso necessário." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Enquetes não são interativas, ela se torna uma lista com contagem de votos." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Anexos de mídia pode ser imagens, vídeos, áudios ou qualquer arquivo." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Publicações podem ser editadas ou excluídas depois." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Prévia" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Nota: Esta prévia tem um estilo levemente padronizado." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> impulsionou" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Novas publicações" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Tentar novamente" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Impulso} other {# Impulsos}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Publicações fixadas" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Tópico" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtrado</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Traduzido automaticamente de {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Traduzindo…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Traduzir do {sourceLangText} (detectado automaticamente)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Traduzir do {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Auto ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Houve um erro ao traduzir" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Editando a mensagem original" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Respondendo à @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Você deve fechar esta página agora." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Fechar janela" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Requer iniciar sessão." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Voltar ao início" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Publicações da conta" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Respostas)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Impulsos)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Mídia)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Limpar filtro" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Limpar" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Exibindo publicação com respostas" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Respostas" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Exibindo publicações sem impulsos" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Impulsos" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Exibindo publicações com mídia" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Exibindo publicações marcadas com #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Exibindo publicações em {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Não há nada para ver aqui." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Não foi possível carregar publicações" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Não foi possível obter informações da conta" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Alterar a instância da conta {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Alterar para a minha instância (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Mês" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Atual" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Padrão" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Alterar para esta conta" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Alterar para nova janela/aba" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Ver perfil…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Definir como padrão" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Encerrar sessão <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Encerrar sessão…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Adicionar conta existente" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Nota: as contas <0>padrões</0> sempre serão as primeiras a carregar. Contas alteradas permaneceram durante a sessão." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Não há favoritos ainda. Favorite algo primeiramente!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Não foi possível carregar os favoritos." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "última 1 hora" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "últimas 2 horas" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "últimas 3 horas" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "últimas 4 horas" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "últimas 5 horas" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "últimas 6 horas" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "últimas 7 horas" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "últimas 8 horas" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "últimas 9 horas" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "últimas 10 horas" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "últimas 11 horas" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "últimas 12 horas" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "além de 12 horas" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Tags seguidas" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Grupos" + +#: 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 "Exibindo {selectedFilterCategory, select, all {todas as publicações} original {publicações originais} replies {respostas} boosts {impulsos} followedTags {tags seguidas} groups {grupos} filtered {publicações filtradas}}, {sortBy, select, createdAt {{sortOrder, select, asc {mais antigo} desc {mais recente}}} reblogsCount {{sortOrder, select, asc {menos impulsos} desc {mais impulsos}}} favouritesCount {{sortOrder, select, asc {menos curtidas} desc {mais curtidas}}} repliesCount {{sortOrder, select, asc {menos respostas} desc {mais respostas}}} density {{sortOrder, select, asc {menos denso} desc {mais denso}}}} primeiro{groupBy, select, account {, agrupado por autores} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Acompanhar <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Ajuda" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "O que isso significa?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "A função de acompanhamento é uma linha de tempo separada de seus seguidores, oferecendo uma visão de alto-nível em um relance, com uma interface simples e inspirada em e-mails para ordenar e filtrar publicações sem esforço." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Prévia da interface de acompanhamento" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Vamos acompanhar" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Vamos acompanhar as publicações de seus seguidores." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Exiba as publicações de…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "até o máximo" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Acompanhar" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Sobreposições com o seu último acompanhamento" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Até o último acompanhamento ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Nota: Sua instância talvez mostre um máximo de 800 publicações na linha de tempo do início, independente do intervalo de tempo. Pode ser menos ou mais." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Antes…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# publicação} other {# publicações}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Excluir acompanhamento?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Removendo acompanhamento {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Acompanhamento {0} removido" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Nota: Aqui armazenará um máximo de 3 acompanhamentos. O resto será automaticamente excluído." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Obtendo publicações…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Isso deve levar um tempo." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Redefinir filtros" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Links populares" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Compartilhado por {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Tudo" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# autor} other {# autores}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Ordenar" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Data" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Densidade" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Filtrar" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autores" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Nenhum" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Mostrar autores" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Você não precisa ler tudo." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Isso é tudo." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Voltar ao topo" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Links compartilhados por seguidores, ordenados pela contagem de compartilhamentos, impulsos e curtidas." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Ordenar: Densidade" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "As publicações são ordenadas por informações de densidade ou profundidade. As curtas são mais \"leves\" enquanto as longas são mais \"pesadas\". Publicações com fotos são mais \"pesadas\" do que elas sem fotos." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Grupo: Autores" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Publicações são agrupadas por autores, ordenado por quantidade de publicações por autor." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Próximo autor" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Autor anterior" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Subir" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtrado: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Não há curtidas ainda. Curta algo primeiramente!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Não foi possível carregar curtidas." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Início e listas" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Linhas de tempo públicas" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Conversas" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Perfis" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Nunca" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Novo filtro" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtro} other {# filtros}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Não foi possível carregar filtros." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Não há filtros ainda." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Adicionar filtro" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Editar filtro" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Não foi possível editar filtro" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Não foi possível criar filtro" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Título" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Palavra completa" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Não há palavras-chave. Adicione uma." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Adicionar palavra-chave" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# palavra-chave} other {# palavras-chave}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtrar de…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Não implementado ainda" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Estado: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Alterar expiração" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Expiração" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "A publicação filtrada será…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimizada" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "oculta" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Excluir filtro?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Não foi possível excluir filtro." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Expirado" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Expirando <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Nunca expira" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# hashtag} other {# hashtags}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Não foi possível carregar hashtags seguidas." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Não há hashtags seguidas ainda." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Nada para ver aqui." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Não foi possível carregar publicações." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (Apenas mídia) em {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} em {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (Apenas mídia)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Ninguém publicou nada com esta tag." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Não foi possível carregar publicações com esta tag" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Parar de seguir #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Parou de seguir #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "#{hashtag} seguido" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Seguindo…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Não destacado no perfil" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Não foi possível remover destaque do perfil" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Destacado no perfil" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Destacar no perfil" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, other {Máx. # tag(s)}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Adicionar hashtag" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Excluir hashtag" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Máx. # atalho alcançado. Não foi possível adicionar atalho.} other {Máx. # atalhos alcançados. Não foi possível adicionar atalho.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Este atalho já existe" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Atalho de hashtag adicionada" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Adicionar aos atalhos" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Insira uma nova instância ex. \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Instância inválida" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Ir à outra instância…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Ir à minha instância (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Não foi possível obter notificações." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Novas</0> <1>Solicitações de seguimento</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Ver tudo" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Resolvendo…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Não foi possível resolver URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Nada ainda." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Gerenciar membros" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Excluir <0>@{0}</0> da lista?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Excluir…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# lista} other {# listas}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Não há listas ainda." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Houve um erro ao registrar aplicação" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "domínio de instância" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "ex. “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Houve um erro ao iniciar sessão. Tente novamente ou tente outra instância." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Continuar com {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Continuar" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Não tem uma conta? Crie uma!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Menções privadas" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privado" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Ninguém mencionou você :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Não foi possível carregar menções." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Você não segue" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Quem não segue você" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Com uma conta nova" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Quem mencionou você privadamente sem solicitar" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Quem está limitado por moderadores do servidor" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Opções de notificação" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Novas notificações" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Anúncio} other {Anúncios}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Solicitações de seguimento" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# solicitação de seguimento} other {# solicitações de seguimento}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Notificações filtradas de # pessoa} other {Notificações filtradas de # pessoas}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Apenas menções" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Hoje" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Está tudo em dia." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Ontem" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Não foi possível carregar notificações" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Opções de notificação atualizada" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Filtrar notificações de pessoas:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtrar" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignorar" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Atualizado <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Ver notificações de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Notificações de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "As notificações de @{0} não serão mais filtradas." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Não foi possível aceitar solicitação de notificação" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Permitir" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "As notificações de @{0} não aparecerá em notificações filtradas." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Não foi possível descartar solicitação de notificação" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Descartar" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Descartado" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Linha de tempo local ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Linha de tempo federado ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Linha de tempo local" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Linha de tempo federado" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Ninguém publicou nada ainda." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Alterar para federado" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Alterar para local" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Procurar: {q} (Publicações)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Buscar: {q} (Contas)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Buscar: {q} (Hashtags)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Buscar: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Hashtags" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Ver mais" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Ver mais contas" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Nenhuma conta encontrada." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Ver mais hashtags" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Nenhuma hashtag encontrada." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Ver mais publicações" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Nenhuma publicação encontrada." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Insira o termo de sua busca ou copie um URL acima para iniciar." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Opções" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Tema" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Claro" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Escuro" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automático" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Tamanho do texto" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Idioma de exibição" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Traduções de voluntários" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Publicando" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Visibilidade padrão" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Sincronizado" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Houve um erro ao atualizar privacidade de publicação" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Sincronizado com as opções do servidor de instância. <0>Vá para sua instância ({instance}) para mais opções.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Experimentos" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Atualizar automaticamente publicações da linha do tempo" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Carrossel de impulsos" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Tradução da publicação" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Traduzir para" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Idioma do sistema ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {Ocultar o botão de \"Traduzir\" em:} other {Ocultar o botão de \"Traduzir\" por (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Nota: Esse recurso usa serviços externos de tradução, desenvolvido por <0>Lingva API</0> e <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Tradução automática" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Exibe automaticamente tradução para publicações na linha de tempo. Só funciona para publicações <0>curtas</0> sem aviso de conteúdo, mídia ou enquete." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Selecionador de GIF para escrita" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Nota: Esse recurso usa serviços externos de busca de GIF, desenvolvido por <0>GIPHY</0>. Avaliado bem (adequado para visualização de todas as idades), parâmetros de rastreamento são listrados, informação de referência é omitida de solicitações, porém as consultas de busca e informação de endereço IP ainda poderá alcançar os servidores do GIPHY." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Gerador de descrição de imagem" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Apenas para novas imagens enquanto escreve novas publicações." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Nota: Esse recurso usa serviços externos IA, desenvolvido por <0>img-alt-api</0>. Então ele pode não funcionar bem. Apenas para imagens e em inglês." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Notificações agrupadas do servidor" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Recurso em estágio alpha. Janela potencialmente agrupada e melhorada, porém lógica básica de agrupamento." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Opções de exportação/importação \"nuvem\" para atalhos" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Muito experimental.<0/>Armazenado nas notas do seu perfil. Notas (privadas) do perfil são mais usadas para outros perfis, e oculto para o próprio perfil." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Nota: Esse recurso usa a API do servidor de instância atualmente em uso." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Modo oculto <0>(<1>Texto</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Substituir os textos por blocos, útil ao fazer capturas de tela, por razões de privacidade." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Sobre" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Feito</0> por <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Patrocinar" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Doar" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Política de privacidade" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Site:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versão:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Versão copiada" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Não foi possível copiar versão" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Houve um erro ao atualizar inscrição. Tente novamente." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Houve um erro ao cancelar inscrição. Tente novamente." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Notificações de push (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "As notificações de push estão bloqueadas. Por favor, ative-as nas opções do navegador." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Permitir de <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "qualquer um" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "pessoas que sigo" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "seguidores" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Segue" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Enquetes" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Publicar edições" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "A permissão de push não foi concedida desde a última sessão. Você precisa <0><1>iniciar sessão</1> novamente para conceder a permissão</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "NOTA: Notificações de push só funcionam para <0>uma conta</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Publicação" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Você não está conectado. Interações como (respostas, impulsos, etc.) não são possíveis." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Essa publicação é de outra instância (<0>{instance}</0>). Interações como (respostas, impulsos, etc.) não são possíveis." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Erro: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Alterar para minha instância para ativar interações" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Não foi possível carregar respostas." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Voltar" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Ir à publicação principal" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} publicações acima – Voltar ao topo" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Alterar para vista lateral" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Alterar para vista completa" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Mostrar conteúdo sensível" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Experimental" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Não foi possível alterar" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Alterar para instância da publicação ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Alterar para instância da publicação" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Não foi possível carregar publicação" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# resposta} other {<0>{1}</0> respostas}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# comentário} other {<0>{0}</0> comentários}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Ver publicação com respostas" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Tendência ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Notícias populares" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Por {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Voltar a mostrar publicações populares" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Mostrar publicações mencionando <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Publicações populares" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Não há publicações populares." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Um cliente web minimalista e original para Mastodon." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Iniciar sessão com Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Iniciar sessão" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Conecte com sua conta existente do Mastodon/Fediverse.<0/>Os seus credenciais não serão armazenados neste servidor." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Feito</0> por <1>@cheeaun</1>. <2>Política de privacidade</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Captura de tela do carrossel de impulsos" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Carrossel de impulsos" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Separa visualmente as publicações originais das compartilhadas (publicações impulsionadas)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Captura de tela de tópicos de comentários aninhados" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Tópico de comentários aninhados" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Siga facilmente as conversas. Respostas semi-colapsáveis." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Captura de tela de notificações agrupadas" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Notificações agrupadas" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Notificações similares são agrupadas e colapsadas para evitar desordem." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Captura de tela da interface multi-coluna" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Única ou multi-coluna" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Por padrão, uma única coluna para amadores do modo zen. Multi-coluna configurável para usuários avançados." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Captura de tela da linha de tempo multi-hashtag com uma maneira de adicionar mais hashtags" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Linha de tempo multi-hashtag" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Até 5 hashtags combinadas em uma única linha do tempo." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Parece que o seu navegador está bloqueando popups." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Uma publicação rascunho está atualmente minimizada. Publique-a ou a descarte antes de criar outra." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Uma publicação está atualmente aberta. Publique-a ou a descarte antes de criar outra." + diff --git a/src/locales/pt-PT.po b/src/locales/pt-PT.po new file mode 100644 index 00000000..7e6f8253 --- /dev/null +++ b/src/locales/pt-PT.po @@ -0,0 +1,3808 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: pt\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 22:00\n" +"Last-Translator: \n" +"Language-Team: Portuguese\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: pt-PT\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Bloqueado" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Publicações: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Última publicação: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Automático" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Grupo" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Mútuo" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Pedido" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "A seguir" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Segue tu" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# seguidor} other {# seguidores}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Verificado" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Se juntou em <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Permanente" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Impossível carregar conta." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Ir à página da conta" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Seguidores" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "A seguir" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Publicações" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +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 é:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Identificador copiado" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Impossível copiar identificador" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Copiar identificador" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Ir à página do perfil original" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Ver foto de perfil" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Ver banner de perfil" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +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." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} publicações originais, {1} respostas, {2} impulsos" + +#: 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}}}}" + +#: 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)}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Original" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Respostas" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Impulsos" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "As estatísticas estão indisponíveis." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Ver estatísticas" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Última publicação: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Silenciado" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Bloqueado" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Nota privada" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Mencionar <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Traduzir biografia" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Editar nota privada" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +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}." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Notificações desativadas para as publicações de @{username}." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Desativar notificações" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Ativar notificações" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Impulsos de @{username} ativados." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Impulsos de @{username} desativados." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Desativar impulsos" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Ativar impulsos" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Adicionar/Remover das listas" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Ligação copiada" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Impossível copiar ligação" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Copiar" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Partilhar não parece estar a funcionar." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Partilhar…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "Dessilenciou @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Dessilenciar <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Silenciar <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "Silenciou @{username} por {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Impossível silenciar @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Eliminar <0>@{username}</0> dos seguidores?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} eliminado dos seguidores" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Eliminar seguidor…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Bloquear <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "Desbloqueou @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "Bloqueou @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Impossível desbloquear @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Impossível bloquear @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Desbloquear <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Bloquear <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Reportar <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Editar perfil" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Eliminar pedido de seguimento?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Deixar de seguir @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Deixar de seguir…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Eliminar…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Seguir" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Fechar" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Biografia traduzida" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Impossível remover da lista." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Impossível adicionar na lista." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Impossível carregar listas." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Sem listas." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Nova lista" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Nota privada sobre <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Impossível atualizar nota privada." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Cancelar" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Guardar e fechar" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Impossível atualizar perfil." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Nome" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Biografia" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Campos adicionais" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Etiqueta" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Conteúdo" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Guardar" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "nome de utilizador" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "domínio do servidor" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Modo oculto desativado" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Modo oculto ativado" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Página inicial" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Escrever" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Adicionar media" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Adicionar emoji personalizado" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Adicionar GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Adicionar enquete" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Tem alterações não guardadas. Desfazer publicação?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {O ficheiro {1} não é suportado.} other {Os ficheiros {2} não são suportados.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Fechar" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Minimizar" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Parece que fechaste a janela principal." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Parece que já tem um campo de edição aberto na janela principal e atualmente está a publicar. Espere até que esteja concluído e tenta novamente mais tarde." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Parece que já tem um campo de edição aberto na janela principal. Abrindo esta janela irá desfazer as alterações que fizeste na janela principal. Prosseguir?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Abrir" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "A responder à publicação de @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "A responder à publicação de @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "A editar publicação original" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "A enquete deve ter no mínimo 2 opções" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +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?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Anexo #{i} falhou" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +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" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Público" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Local" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Não listado" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Somente seguidores" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Menção privada" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Publicar resposta" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Editar publicação" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "O que tu fazes?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Marcar media como sensível" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Adicionar" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Responder" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Atualizar" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Publicar" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "A transferir GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Falhou ao transferir GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Mais…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Enviado" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Descrição da imagem" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Descrição do vídeo" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Descrição do áudio" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +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." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "A dimensão é muito grande. Ao enviar pode enfrentar problemas. Tenta reduzir a dimensão de {0}×{1}px para {2}×{3}px." + +#: src/components/compose.jsx:2451 +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:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Eliminar" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Erro" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Editar descrição da imagem" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Editar descrição do vídeo" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Editar descrição do áudio" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "A gerar descrição. Por favor, espere…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Falhou ao gerar descrição: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Falhou ao gerar descrição" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Gerar descrição…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Falhou ao gerar descrição{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— experimental</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Concluído" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Escolha {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Várias escolhas" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Duração" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Eliminar enquete" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Buscar contas" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Erro ao carregar contas" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Emojis personalizados" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Buscar emoji" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Erro ao carregar emojis personalizados" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Usado recentemente" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Outros" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} mais…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Buscar GIFs" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "Desenvolvido por GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Digite para buscar GIFs" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Anterior" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Seguinte" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Erro ao carregar GIFs" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Rascunhos não enviados" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Parece que tem rascunhos não enviados. Vamos continuar onde paraste." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Eliminar rascunho?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Erro ao eliminar rascunho. Tente novamente." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Eliminar…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Erro ao obter estado de resposta!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Eliminar rascunhos?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Erro ao eliminar rascunhos. Tente novamente." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Eliminar tudo…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Nenhum rascunho encontrado." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Enquete" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Media" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Abrir em nova janela" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Aceitar" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Rejeitar" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Aceitado" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Rejeitado" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Nada para exibir" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Contas" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Mostrar mais…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Fim." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Atalhos do teclado" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Ajuda com atalhos do teclado" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Publicação seguinte" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Publicação anterior" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Pular carrossel para a publicação seguinte" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Pular carrossel para a publicação anterior" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Carregar novas publicações" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Abrir detalhes da publicação" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> ou <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Expandir alerta de conteúdo ou<0/>alternar tópico expandido/colapsado" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Fechar publicação ou diálogos" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> ou <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Focar coluna no modo multi-coluna" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> a <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Focar na próxima coluna no modo multi-coluna" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Focar na coluna anterior no modo multi-coluna" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Escrever nova publicação" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Escrever nova publicação (nova janela)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Enviar publicação" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> ou <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Buscar" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Responder (nova janela)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Gosto (favorito)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> ou <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Impulsionar" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Marcar como favorito" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Alternar modo oculto" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Editar lista" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Impossível editar lista." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Impossível criar lista." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Mostrar respostas aos membros da lista" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Mostrar respostas para quem sigo" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Não mostrar respostas" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Ocultar publicações nesta lista da página inicial/A seguir" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Criar" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Eliminar lista?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Impossível eliminar lista." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Descrição da media" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Traduzir" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Falar" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Abrir media original em nova janela" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Abrir media original" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "A tentar descrever imagem. Por favor, espere…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Falhou ao descrever imagem" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Descrever imagem…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Ver publicação" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Media sensível" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Filtrado: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Filtrado" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Publicado. Dê uma olhada." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Resposta publicada. Dê uma olhada." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Publicação atualizada. Dê uma olhada." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Menu" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Recarregar página para atualizar?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Nova atualização disponível…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "A seguir" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Acompanhar" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Menções" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Notificações" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Novo" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Perfil" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Favoritos" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Gostos" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Hashtags seguidas" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Filtros" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Utilizadores silenciados" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Utilizadores silenciados…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Utilizadores bloqueados" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Utilizadores bloqueados…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Contas…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Iniciar sessão" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Tendência" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Federado" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Atalhos / Colunas…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Definições…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Listas" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Todas as listas" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Notificação" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Esta notificação é da sua outra conta." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Ver todas as notificações" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} reagiu a sua publicação com {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} fez uma publicação." + +#: src/components/notification.jsx:85 +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.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} seguiu você.} other {<0><1>{0}</1> pessoa(s)</0> seguiu você.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} pediu para seguir-te." + +#: src/components/notification.jsx:151 +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.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "A enquete que votaste ou criaste já acabou." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Uma enquete que criaste já acabou." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Uma enquete que votaste já acabou." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Uma publicação que interagiste foi editada." + +#: src/components/notification.jsx:204 +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.}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} registrada." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} reportou {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Perdeu conexões com <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Aviso da moderação" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "O seu #Wrapstodon {year} chegou!" + +#: src/components/notification.jsx:272 +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." +msgstr "Um administrador de <0>{from}</0> suspendeu <1>{targetName}</1>, significando que não receberá mais atualizações deles ou interagir com eles." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Um administrador de <0>{from}</0> bloqueou <1>{targetName}</1>. Seguidores afetados: {followersCount}, a seguir: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Bloqueaste <0>{targetName}</0>.\n" +"Seguidores removidos: {followersCount}, a seguir: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "A sua conta recebeu um aviso da moderação." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "A sua conta foi desativada." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Algumas das suas publicações foram marcadas como sensível." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Algumas publicações suas foram eliminadas." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Agora as suas publicações serão marcadas como sensíveis." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "A sua conta foi limitada." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "A sua conta foi suspensa." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Tipo de notificação desconhecida: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Impulsionado/Gostado por…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Gostado por…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Impulsionado por…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Seguido por…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Saiba mais <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "Ver #Wrapstodon" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Leia mais →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Votado" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# voto} other {# votos}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Ocultar resultado" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Votar" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Atualizar" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Mostrar resultado" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> voto} other {<1>{1}</1> votos}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> votante} other {<1>{1}</1> votantes}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Acabou <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Acabou" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "A acabar <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "A acabar" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}s" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}m" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}h" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Spam" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Ligações maliciosas, interações falsas ou respostas repetitivas" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Ilegal" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Viola a lei do seu ou do servidor" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Regra de violação do servidor" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Quebra regras específicas do servidor" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Violação" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Outro" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "O problema não se encaixa em outras categorias" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Relatar publicação" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Relatar @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Revisão pendente" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Publicação relatada" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Perfil relatado" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Impossível reportar publicação" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Impossível reportar perfil" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Qual é o problema com a publicação?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Qual é o problema com o perfil?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Informações adicionais" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Encaminhar para <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Enviar relato" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Silenciou {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Impossível silenciar {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Enviar relato <0>+ Silenciar perfil</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "Bloqueou {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Impossível bloquear {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Enviar relato <0>+ Bloquear perfil</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ contas, hashtags e publicações</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Publicações com <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Publicações marcadas com <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Buscar <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Contas com <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Página inicial / A seguir" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Público (Local / Federado)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Conta" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Hashtag" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID de lista" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Apenas local" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Instância" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Opcional, ex.: mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Buscar termo" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Opcional, menos para o modo multi-coluna" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "ex.: PixelArt (Máx. 5, espaço separado)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Apenas media" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Atalhos" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Especifique uma lista de atalhos que aparecerá como:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Botão flutuante" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Aba/Barra do menu" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Multi-coluna" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Indisponível no modo de visualização atual" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Mover para cima" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Mover para baixo" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Editar" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Adicione mais de um atalho/coluna para fazer funcionar." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Nenhuma coluna ainda. Clique no botão de adicionar coluna." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Nenhum atalho ainda. Clique no botão de adicionar atalho." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Sem certeza do que adicionar?<0/>Tente adicionar as <1>Notificações da Página Inicial / A seguir</1> primeiramente." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Máximo {SHORTCUTS_LIMIT} colunas" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Máximo {SHORTCUTS_LIMIT} atalhos" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Importar/Exportar" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Adicionar coluna…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Adicionar atalho…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "A lista específica é opcional. Para o modo multi-coluna a lista é necessária, ou a coluna não será exibida." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Para o modo multi-coluna, buscar o termo é necessário ou a coluna não será exibida." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Várias hashtags são suportadas. Separado por espaço." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Editar atalho" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Adicionar atalho" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Linha do tempo" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Lista" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Importar/Exportar <0>atalhos</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Importar" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Cole atalhos aqui" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "A transferir atalhos guardados do servidor de instância…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Impossível transferir atalhos" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Transferir atalhos do servidor de instância" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Existem nos atuais atalhos" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "A lista pode não funcionar se for de uma conta diferente." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Formato de definições inválida" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Anexar aos atalhos atuais?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Apenas atalhos que não existem no atalho atual serão anexados." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Nenhum atalho novo para importar" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Atalhos importados. Máximo excedido {SHORTCUTS_LIMIT}, então o resto não será importado." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Atalhos importados" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Importar e anexar…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Substituir atalhos atuais?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Importar atalhos?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "ou substituir…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Importar…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Exportar" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Atalhos copiados" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Impossível copiar atalhos" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Definições de atalho copiado" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Impossível copiar definições de atalho" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Partilhar" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "A guardar atalhos no servidor de instância…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Atalhos guardados" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Impossível guardar atalhos" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Sincronizar ao servidor de instância" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# carácter} other {# carácteres}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Atalhos brutos JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Importar/exportar definições do/para servidor de instância (Muito experimental)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>impulsionou</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "Desculpe, a atual instância registrada não pode interagir com esta publicação de outra instância." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Não gostou da publicação de @{0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Gostou da publicação de @{0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Removeu dos favoritos a publicação de @{0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Adicionou aos favoritos a publicação de @{0}" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Remover impulso" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +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." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Publicação antiga (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Removeu impulso da publicação de @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Impulsionou a publicação de @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Impulsionar…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Remover gosto" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Gosto" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Eliminar dos favoritos" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Ver publicação de <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Exibir histórico de edições" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Editado: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Incorporar publicação" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Conversa dessilenciada" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Conversa silenciada" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Impossível dessilenciar conversa" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Impossível silenciar conversa" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Dessilenciar conversa" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Silenciar conversa" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Publicação desafixada do perfil" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Publicação fixada ao perfil" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Impossível desafixar publicação" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Impossível fixar publicação" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Desafixar do perfil" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Fixar ao perfil" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Eliminar publicação?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Publicação eliminada" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Impossível eliminar publicação" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Relatar publicação…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Gostado" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Impulsionado" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Adicionado aos favoritos" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Fixado" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Eliminado" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# resposta} other {# respostas}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Tópico{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Mostrar menos" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Mostrar conteúdo" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Mostrar media" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Editado" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Comentários" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Mais de <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Histórico de edições" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Falhou ao carregar histórico" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "A carregar…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "Código HTML" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "Código HTML copiado" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Impossível copiar código HTML" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Anexos de media:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Emojis da conta:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "URL estático" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Emojis:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Notas:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Isto é estático, instável e sem guião. Pode precisar para aplicar os seus próprios estilos e editar caso necessário." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Votações não são interativas, ela vira uma lista com contador de votos." + +#: src/components/status.jsx:3400 +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." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Publicações podem ser editadas ou eliminadas depois." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Prévia" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Nota: Esta prévia tem um estilo levemente padronizado." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> impulsionou" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Novas publicações" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Tentar novamente" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Impulso} other {# Impulsos}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Publicações fixadas" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Tópico" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Filtrado</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Traduzido automaticamente de {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "A traduzir…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Traduzir do {sourceLangText} (detetado automaticamente)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Traduzir do {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Auto ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Falhou ao traduzir" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "A editar mensagem original" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Respondendo à @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Deves fechar esta página agora." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Fechar janela" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Requer iniciar sessão." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Voltar à página inicial" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Publicações da conta" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Respostas)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Impulsos)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Media)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Limpar filtro" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Limpar" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "A exibir publicação com respostas" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Respostas" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "A exibir publicações sem impulsos" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Impulsos" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "A exibir publicações com media" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "A exibir publicações marcadas com #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "A exibir publicações em {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Não há nada para ver aqui." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Impossível carregar publicações" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Impossível obter informações da conta" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Alterar a instância da conta {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Alterar para a minha instância (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Mês" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Atual" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "Padrão" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Alterar para esta conta" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Alterar para nova janela/aba" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Ver perfil…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Definir como padrão" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Finalizar sessão <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Finalizar sessão…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Adicionar conta existente" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Nota: as contas <0>padrões</0> sempre serão as primeiras a carregar. Contas alteradas permaneceram durante a sessão." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Sem favoritos ainda. Favorita algo primeiramente!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Impossível carregar favoritos." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "última 1 hora" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "últimas 2 horas" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "últimas 3 horas" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "últimas 4 horas" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "últimas 5 horas" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "últimas 6 horas" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "últimas 7 horas" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "últimas 8 horas" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "últimas 9 horas" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "últimas 10 horas" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "últimas 11 horas" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "últimas 12 horas" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "além de 12 horas" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Marcações seguidas" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Grupos" + +#: 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 "A exibir {selectedFilterCategory, select, all {todas as publicações} original {publicações originais} replies {respostas} boosts {impulsos} followedTags {marcações seguidas} groups {grupos} filtered {publicações filtradas}}, {sortBy, select, createdAt {{sortOrder, select, asc {mais antigo} desc {mais recente}}} reblogsCount {{sortOrder, select, asc {menos impulsos} desc {mais impulsos}}} favouritesCount {{sortOrder, select, asc {menos gostos} desc {mais gostos}}} repliesCount {{sortOrder, select, asc {menos respostas} desc {mais respostas}}} density {{sortOrder, select, asc {menos denso} desc {mais denso}}}} primeiro{groupBy, select, account {, agrupado por autores} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Acompanhar <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Ajuda" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "O que isto significa?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Acompanhar é uma linha de tempo separada dos seus seguidores, oferecendo uma vista de alto-nível num relance, com uma simples interface inspirada em e-mails, para ordenar e filtrar sem esforço através das publicações." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Prévia da interface de acompanhamento" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Vamos acompanhar" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Vamos acompanhar as publicações dos seus seguidores." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Exiba-me as publicações de…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "até o máximo" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Acompanhar" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Sobreposições com o seu último acompanhamento" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "Até o último acompanhamento ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Nota: a sua instância talvez mostre um máximo de 800 publicações na linha de tempo da página inicial, independente do intervalo de tempo. Pode ser menos ou mais." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Antes…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# publicação} other {# publicações}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Eliminar acompanhamento?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "A remover acompanhamento {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Acompanhamento {0} removido" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Nota: Aqui guardará um máximo de 3 acompanhamentos. O resto será automaticamente eliminado." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "A obter publicações…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Isto deve levar um tempo." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Redefinir filtros" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Ligações populares" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Partilhado por {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Tudo" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# autor} other {# autores}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Ordenar" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Data" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Densidade" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Filtrar" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Autores" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Nenhum" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Exibir autores" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Não precisa ler tudo." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Isto é tudo." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Voltar ao topo" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Ligações partilhadas por seus seguidores, ordenadas por contagem de vezes partilhadas, impulsos e gostos." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Ordenar: Densidade" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Publicações são ordenadas por informações de densidade ou profundidade. Publicações curtas são mais \"leves\" enquanto as longas são mais \"pesadas\". Elas com fotos são mais \"pesadas\" do que elas sem fotos." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Grupo: Autores" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Publicações são agrupadas por autores, ordenado por quantidade de publicações por autor." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Próximo autor" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Autor anterior" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Rolar até o topo" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Filtrado: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Sem gostos ainda. Dá um ❤️ em algo!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Impossível carregar gostos." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Página inicial e listas" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Linhas de tempo públicas" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Conversas" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Perfis" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Nunca" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Novo filtro" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# filtro} other {# filtros}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Impossível carregar filtros." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Sem filtro ainda." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Adicionar filtro" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Editar filtro" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Impossível editar filtro" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Impossível criar filtro" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Título" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Palavra completa" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Sem palavras-chave. Adicione uma." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Adicionar palavra-chave" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# palavra-chave} other {# palavras-chave}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Filtrar de…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Não implementado ainda" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Estado: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Alterar expiração" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Expiração" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "A publicação filtrada será…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "minimizada" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "oculta" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Eliminar filtro?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Impossível eliminar filtro." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Expirado" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "A expirar <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Nunca expira" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# hashtag} other {# hashtags}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Impossível carregar hashtags seguidas." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Nenhuma hashtag seguida ainda." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Nada para ver aqui." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Impossível carregar publicações." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (Apenas media) em {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} em {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (Apenas media)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Ninguém publicou nada com esta marcação ainda." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Impossível carregar publicações com esta marcação" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Deixar de seguir #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Deixou de seguir #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "#{hashtag} seguido" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "A seguir…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Não destacado no perfil" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Impossível remover destaque do perfil" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Destacado no perfil" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Destacar no perfil" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, other {Máx. # marcações}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Adicionar hashtag" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Eliminar hashtag" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Máx. # atalho alcançado. Impossível adicionar atalho.} other {Máx. # atalhos alcançados. Impossível adicionar atalho.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Este atalho já existe" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Atalho da hashtag adicionada" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Adicionar aos atalhos" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Digite uma nova instância ex. \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Instância inválida" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Ir à outra instância…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Ir à minha instância (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Impossível obter notificações." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Novos</0> <1>Pedidos de seguir</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Ver tudo" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "A resolver…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Impossível resolver URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Nada ainda." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Gerir membros" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Eliminar <0>@{0}</0> da lista?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Eliminar…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# lista} other {# listas}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Nenhuma lista ainda." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Falhou ao registar aplicação" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "domínio de instância" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "ex. “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Falhou ao iniciar sessão. Tente novamente ou tente outra instância." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Continuar com {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Continuar" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Não tem uma conta? Cria uma!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Menções privadas" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Privado" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Ninguém lhe mencionou... ☹️" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Impossível carregar menções." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Não segues" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Quem não lhe segue" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "Com uma conta nova" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Quem lhe mencionou privadamente sem pedir" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Quem está limitado por moderadores do servidor" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Definições de notificação" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Novas notificações" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Anunciado} other {Anunciados}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Pedidos de seguir" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# pedido de seguir} other {# pedidos de seguir}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Notificações filtradas de # pessoa} other {Notificações filtradas de # pessoas}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Somente menções" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Hoje" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Está tudo em dia." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Ontem" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Impossível carregar notificações" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Definições de notificação atualizada" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Filtrar notificações de pessoas:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Filtrar" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ignorar" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Atualizado <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Ver notificações de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Notificações de <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Notificações de @{0} não serão mais filtradas." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Impossível aceitar pedido de notificação" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Permitir" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Notificações de @{0} não irão mais aparecer em notificações filtradas." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Impossível descartar pedido de notificação" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Descartar" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Descartado" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Linha de tempo local ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Linha de tempo federado ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Linha de tempo local" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Linha de tempo federado" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Ninguém publicou nada ainda." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Alterar para federado" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Alterar para local" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Buscar: {q} (Publicações)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Buscar: {q} (Contas)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Buscar: {q} (Hashtags)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Buscar: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Hashtags" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Ver mais" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Ver mais contas" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Nenhuma conta encontrada." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Ver mais hashtags" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Nenhuma hashtag encontrada." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Ver mais publicações" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Nenhuma publicação encontrada." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Insira o termo da sua busca ou cole um URL acima para iniciar." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Definições" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Aparência" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Claro" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Escuro" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Automático" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Tamanho do texto" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Idioma de exibição" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Traduções de voluntários" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Publicando" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Visibilidade padrão" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Sincronizado" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Falhou ao atualizar a privacidade da publicação" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Sincronizado com as definições de instância do servidor. <0>Vá para a sua instância ({instance}) para mais definições.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Experimentos" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Atualizar automaticamente publicações da linha do tempo" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Carrossel de impulsos" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Tradução da publicação" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Traduzir para" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Idioma do sistema ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {Ocultar o botão de \"Traduzir\" em:} other {Ocultar o botão de \"Traduzir\" por (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Nota: Este recurso usa serviços externos de tradução, desenvolvido por <0>Lingva API</0> e <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Tradução automática" + +#: src/pages/settings.jsx:517 +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." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Selecionador de GIF para escrita" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Nota: Este recurso usa serviços externos de busca de GIF, desenvolvido por <0>GIPHY</0>. Avaliado bem (adequado para visualização de todas as idades), parâmetros de rastreamento são listrados, informação de referência é omitida de pedidos, porém as consultas de busca e informação de endereço IP ainda poderá alcançar os servidores do GIPHY." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Gerador de descrição de imagem" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Apenas para novas imagens enquanto escreve novas publicações." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Nota: Este recurso usa serviços externos IA, desenvolvido por <0>img-alt-api</0>. Pode não funcionar bem. Apenas para imagens e em inglês." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Notificações agrupadas do servidor" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Recurso em estágio alpha. Janela potencialmente agrupada e melhorada, porém lógica básica de agrupamento." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Definições de importação/exportação \"Nuvem\" para atalhos" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Muito experimental.<0/>Guardado nas notas do seu próprio perfil. Notas (privadas) do perfil são mais usadas para outros perfis, e oculto para o próprio perfil." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Nota: Este recurso usa a API do servidor de instância atualmente registrado." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Modo oculto <0>(<1>Texto</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Substitui os textos por blocos, útil quando tirar capturas de ecrã, por razões de privacidade." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Sobre" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Feito</0> por <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Patrocinar" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Doar" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Política de privacidade" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Sítio web:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Versão:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Versão copiada" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Impossível copiar versão" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Falhou ao atualizar subscrição. Tente novamente." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Falhou ao remover subscrição. Tente novamente." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Notificações de push (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "As notificações de push estão bloqueadas. Por favor, habilite-as nas definições do seu navegador." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Permitir de <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "qualquer um" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "pessoas que sigo" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "seguidores" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Segue" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Votações" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Publicar edições" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "A permissão de push não foi concedida desde a última sessão. Precisas <0><1>iniciar sessão</1> novamente para conceder a permissão</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "NOTA: Notificações de push só funcionam para <0>uma conta</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Publicação" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Não estás conectado. Interações como (respostas, impulsos, etc.) não são possíveis." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Esta publicação é de outra instância (<0>{instance}</0>). Interações como (respostas, impulsos, etc.) não são possíveis." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Erro: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Alterar para a minha instância para ativar interações" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Impossível carregar respostas." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Voltar" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Ir à publicação principal" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} publicações acima – Voltar ao topo" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Alterar para visualização lateral" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Alterar para visualização completa" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Mostrar conteúdo sensível" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Experimental" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Impossível alterar" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Alterar para instância da publicação ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Alterar para instância da publicação" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Impossível carregar publicação" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# resposta} other {<0>{1}</0> respostas}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# comentário} other {<0>{0}</0> comentários}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Ver publicação com respostas" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Tendência ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Notícias em tendência" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Por {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Voltar a mostrar publicações em tendência" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Mostrar publicações mencionando <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Publicações em tendência" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Nenhuma publicação em tendência." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Um cliente web minimalista e original para Mastodon." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Iniciar sessão com Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Iniciar sessão" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Conecte com a sua conta existente do Mastodon/Fediverse.<0/>Os seus credenciais não serão guardados neste servidor." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Feito</0> por <1>@cheeaun</1>. <2>Política de privacidade</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Captura de ecrã do carrossel de impulsos" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Carrossel de impulsos" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Separa visualmente as publicações originais das partilhadas (publicações impulsionadas)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Captura de ecrã de tópicos de comentários aninhados" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Tópico de comentários aninhados" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Siga facilmente as conversas. Respostas semi-colapsáveis." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Captura de ecrã de notificações agrupadas" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Notificações agrupadas" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Notificações similares são agrupadas e colapsadas para evitar desordem." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Captura de ecrã do UI multi-coluna" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Única ou multi-coluna" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "Por padrão, uma coluna única para amantes do modo zen. Multi-coluna configurável para utilizadores avançados." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Captura de ecrã da linha de tempo multi-hashtag com uma forma de adicionar mais hashtags" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Linha de tempo multi-hashtag" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "Até 5 hashtags combinadas em uma única linha do tempo." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Parece que o seu navegador está a bloquear pop-ups." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Uma publicação rascunho está atualmente minimizada. Publique-a ou a descarte antes de criar uma." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Uma publicação está atualmente aberta. Publique-a ou a descarte antes de criar uma." + diff --git a/src/locales/ru-RU.po b/src/locales/ru-RU.po new file mode 100644 index 00000000..8c0debc8 --- /dev/null +++ b/src/locales/ru-RU.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: ru\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Закрытый профиль" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Посты: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Последний пост: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Бот" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Группа" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Взаимная подписка" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Запрос отправлен" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Подписка" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Подписан(а) на вас" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# подписчик} many {# подписчиков} other {# подписчика}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Подтверждено" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Присоединил(ся/ась) <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Навсегда" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Не удалось загрузить учётную запись." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Перейти на страницу учётной записи" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Подписчик(а/ов)" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Подпис(ки/ок)" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Посты" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Ещё" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> указал(а), что теперь использует новую учётную запись:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Имя пользователя скопировано" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Не удалось скопировать имя пользователя" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Копировать имя пользователя" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Перейти на страницу оригинального профиля" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Просмотр изображения профиля" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Открыть изображение-шапку" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "Вечная память" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Этот пользователь предпочёл не раскрывать эту информацию." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "Оригинальные посты: {0}. Ответы: {1}. Продвижения: {2}" + +#: 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 {1 последний пост за 1 последний день} other {1 последний пост за {2} последних ден(я/ей)}}} other {{3, plural, one {Последние {4} пост(а/ов) за 1 последний день} other {Последние {5} пост(а/ов) за {6} последних ден(я/ей)}}}}" + +#: 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 {{1} пост} few {{1} поста} many {{1} постов} other {{1} поста}} за последний год или годы" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Оригинальные" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Ответы" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Продвижения" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Статистика публикации постов недоступна." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Показать статистику публикации постов" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Последний пост: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Игнорируется" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Заблокирован(а)" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Личная заметка" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Упомянуть <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Перевести поле «О себе»" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Редактировать личную заметку" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Добавить личную заметку" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Уведомления о новых постах @{username} включены." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Уведомления о новых постах @{username} отключены." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Отключить уведомления" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Включить уведомления" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Продвижения @{username} видны." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Продвижения @{username} скрыты." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Скрыть продвижения" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Включить продвижения" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Управление списками" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Ссылка скопирована" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Не удалось скопировать ссылку" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Копировать" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Кажется, функция «Поделиться» не работает." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Поделиться…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "@{username} убран(а) из списка игнорируемых" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Убрать <0>@{username}</0> из игнорируемых" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Игнорировать <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} добавлен(а) в список игнорируемых на {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Не удалось добавить @{username} в список игнорируемых" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Удалить <0>@{username}</0> из подписчиков?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} убран из подписчиков" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Убрать подписчика…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Заблокировать <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "@{username} разблокирован(а)" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} заблокирован(а)" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Не удалось разблокировать @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Не удалось заблокировать @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Разблокировать <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Заблокировать <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Пожаловаться на <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Редактировать профиль" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Отозвать запрос на подписку?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Отписаться от @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Отписаться…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Отозвать…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Подписаться" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Закрыть" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Перевод поля «О себе»" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Не удалось убрать из списка." + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Не удалось добавить в список." + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Не удалось загрузить списки." + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Списки отсутствуют." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Новый список" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Личная заметка о <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Не удалось обновить личную заметку." + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Отмена" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Сохранить и закрыть" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Не удалось обновить профиль." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Название" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "О себе" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Дополнительные поля" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Заголовок" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Содержание" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Сохранить" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "имя пользователя" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "доменное имя сервера" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Режим маскировки отключён" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Режим маскировки включён" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Домашняя" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Написать" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "Добавить медиафайл" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Добавить пользовательские эмодзи" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "Добавить GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Добавить голосование" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "У вас есть несохраненные изменения. Отменить этот пост?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {Файл {1} не поддерживается.} other {Файлы {2} не поддерживаются.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Вы можете прикрепить только 1 файл.} other {Вы можете прикрепить до # файлов.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "Открыть в отдельном окне" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Свернуть" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Похоже, вы закрыли родительское окно." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Похоже, вы уже публикуете пост в родительском окне. Дождитесь публикации и попробуйте снова." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Похоже, вы уже пишите или редактируете пост в родительском окне. Возвращение этого окна отменит изменения в родительском окне. Продолжить?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Вернуть в родительское окно" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Отвечаем пост @{0}(<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Отвечаем на пост @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Редактирование исходного поста" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Опрос должен иметь не менее 2 вариантов ответа" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Некоторые варианты ответа пусты" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "У некоторых медиафайлов нет описаний. Продолжить?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Не удалось прикрепить вложение №{i}" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Предупреждение о содержании" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Предупреждение о содержании или медиафайлах деликатного характера" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Публичный" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Локальная" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Без включения в поиск" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Только для подписчиков" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Личное упоминание" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Опубликовать ответ" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Редактировать свой пост" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Начните писать свои мысли" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Отметить медиафайл как деликатный" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Добавить" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Ответить" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Сохранить" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Опубликовать" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Загружаем GIF-анимацию…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Не удалось загрузить GIF-анимацию" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Ещё…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Загружено" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Описание изображения" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Описание видео" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Описание аудио" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Файл слишком большой — при загрузке могут возникнуть проблемы. Попробуйте уменьшить размер с {0} до {1} или меньше." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Сильно большое разрешение — при загрузке могут возникнуть проблемы. Попробуйте уменьшить разрешение с {0}×{1}px до {2}×{3}px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Слишком высокая частота кадров — при загрузке могут возникнуть проблемы." + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Убрать" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Ошибка" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Редактировать описание изображения" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Редактировать описание видео" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Редактировать описание аудио" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Создаём описание. Один момент, пожалуйста…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Не удалось создать описание: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Не удалось создать описание" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Автоматическое описание…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Не удалось создать описание: {0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— экспериментальная функция</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Готово" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Вариант №{0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Разрешить несколько ответов" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Продолжительность" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Убрать опрос" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Поиск пользователей" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Ошибка поиска пользователей" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Пользовательские эмодзи" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Поиск эмодзи" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Ошибка загрузки пользовательских эмодзи" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Недавно использованные" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Прочие" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "Ещё {0}…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Поиск GIF-анимации" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "При помощи GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Начните набирать для поиска GIF-анимаций" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Назад" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Вперёд" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Ошибка поиска GIF-анимаций" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Черновики" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "У вас есть незаконченные черновики. Давайте продолжим с места, где вы остановились." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Удалить этот черновик?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Не удалось удалить черновик. Попробуйте снова, пожалуйста." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Удалить…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Не удалось найти пост, к которому относится этот ответ." + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Очистить черновики?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Не удалось очистить черновики. Попробуйте снова, пожалуйста." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Удалить все…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "У вас пока нет черновиков." + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Опрос" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Медиафайлы" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Открыть в новом окне" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Принять" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Отклонить" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Принят" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Отклонён" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Нечего отображать" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Учётные записи" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Показать ещё…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Конец." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Горячие клавиши" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Справка по горячим клавишам" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Следующий пост" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Предыдущий пост" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Перейти к следующему посту в карусели" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Перейти к предыдущему посту в карусели" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Обновить ленту" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Раскрыть пост" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> или <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Развернуть предупреждение о содержимом или<0/>свернуть/развернуть обсуждение" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Закрыть пост или диалоги" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> или <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Фокус столбца в многоколоночном режиме" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> по <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Перейти к следующему столбцу в многоколонном режиме" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Перейти к предыдущему столбцу в многоколонном режиме" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Новый пост" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Создать новый пост (новое окно)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Отправить пост" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> или <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Поиск" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Ответить (в новом окне)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Нравится (избранное)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> или <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Продвинуть" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Закладка" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Включить \"приватный\" режим" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Редактировать список" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Не удалось изменить список." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Не удалось создать список." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Показать ответы участникам списка" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Показать ответы людям, на которых я подписан(а)" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Не показывать ответы" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Скрыть посты этого списка из Домашней ленты/Подписок" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Создать" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Удалить этот список?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Не удалось удалить список." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Описание медиа" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Перевести" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Произнести" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Открыть исходный файл в новом окне" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Открыть исходный файл" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Попытка описать изображение. Пожалуйста, подождите…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Не удалось описать изображение" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Опишите изображение…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Просмотреть публикацию" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Деликатный контент" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Отфильтровано: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Отфильтровано" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Пост опубликован. Проверьте его." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Ответ опубликован. Проверьте его." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Пост обновлен. Проверьте его." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Меню" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Перезагрузить страницу для обновления?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Доступно обновление…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Подписки" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Catch-up" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Упоминания" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Уведомления" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Новые" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Профиль" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Закладки" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Отметки \"нравится\"" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Хэштеги (подписки)" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Фильтры" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Игнорируемые пользователи" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Игнорируемые пользователи…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Заблокированные пользователи" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Заблокированные пользователи…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Учётные записи…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Войти" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "В тренде" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Федеративная" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Ярлыки / Столбцы…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Параметры…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Списки" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Все списки" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Уведомление" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Это уведомление от вашей другой учетной записи." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Просмотреть все уведомления" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} отреагировал(а) на ваш пост при помощи {emojiObject}" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} опубликовал(а) пост." + +#: src/components/notification.jsx:85 +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} продвинул(а) ваш ответ.} other {{account} продвинул(а) ваш пост.}}} other {{account} продвинул(а) {postsCount} ваших пост(а/ов).}}} other {{postType, select, reply {<0><1>{0}</1> человек</0> продвинули ваш ответ.} other {<2><3>{1}</3> человек</2> продвинули ваш пост.}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} подписал(ся/ась) на вас.} other {<0><1>{0}</1> человек(а)</0> подписалось на вас.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} запросил(а) разрешение на подписку." + +#: src/components/notification.jsx:151 +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} понравился ваш ответ.} other {{account} понравился ваш пост.}}} other {{account} понравилось {postsCount} ваших пост(а/ов).}}} other {{postType, select, reply {<0><1>{0}</1> человекам</0> понравился ваш ответ.} other {<2><3>{1}</3> человекам</2> понравился ваш пост.}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Опрос, который вы создавали или в котором принимали участие, был завершён." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Созданный вами опрос завершился." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Опрос, в котором вы проголосовали, завершен." + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Пост, с которым вы ранее взаимодействовали, был отредактирован." + +#: src/components/notification.jsx:204 +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} продвинул(а) ваш ответ и поставил(а) ему отметку \"нравится\".} other {{account} продвинул(а) ваш пост и поставил(а) ему отметку \"нравится\".}}} other {{account} продвинул(а) и поставил(а) отметку \"нравится\" {postsCount} вашим постам.}}} other {{postType, select, reply {<0><1>{0}</1> человек(а)</0> продвинули ваш ответ и поставили ему отметку \"нравится\".} other {<2><3>{1}</3> человек(а)</2> продвинули ваш пост и поставили ему отметку \"нравится\".}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} зарегистрировал(ся/ась)." + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} пожаловался на {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Потеряны соединения с <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Предупреждение о модерации" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Администратор <0>{from}</0> приостановил учётную запись <1>{targetName}</1>, что означает, что вы больше не можете получать обновления или взаимодействовать с этой учётной записи." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Администратор <0>{from}</0> заблокировал <1>{targetName}</1>. Затронуло подписок: {followersCount}, подписок всего: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Вы заблокировали <0>{targetName}</0>. Удалено {followersCount} подпис(ок/ки), подписок всего: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Ваша учетная запись получила предупреждение о модерации." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Ваша учётная запись была отключена." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Некоторые из ваших сообщений были отмечены как деликатные." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Некоторые из ваших записей были удалены." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "С этого момента ваши сообщения будут помечены как деликатные." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Ваша учётная запись была ограничена." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Действие вашей учётной записи приостановлено." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Неизвестный тип уведомления: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Продвинули/Отметили как \"нравится\"…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Нравится…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Продвинули…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Подписались…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Подробнее <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Читать далее →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Проголосовали" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# голос} other {# голос(а/ов)}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Скрыть результаты" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Голосовать" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Обновить" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Показать результаты" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> проголосовал(а)} other {<1>{1}</1> проголосовали}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> голосующ(ий/ая)} other {<1>{1}</1> голосующих}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Завершено <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Завершено" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Завершение <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Завершение" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}с" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}м" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}ч" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Спам" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Вредоносные ссылки, поддельные действия или повторяющиеся ответы" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Нарушение закона/правил" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Нарушает закон вашей страны или сервера" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Нарушение правил сервера" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Нарушение определённых правил сервера" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Нарушение" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Другое" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Проблема не соответствует другим категориям" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Пожаловаться на публикацию" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Пожаловаться на @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Ожидает рассмотрения" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Жалоба на публикацию была отправлена" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Жалоба на профиль была отправлена" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Не удалось пожаловаться на публикацию" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Не удалось пожаловаться на профиль" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "В чем проблема с этой публикацией?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "В чем проблема с этим профилем?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Дополнительная информация" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Переслать <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Пожаловаться" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "Добавить @{username} в игнорируемые" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Не удалось добавить @{username} в список игнорируемых" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Отправить жалобу <0>+ Заглушить профиль</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "{username} заблокирован(а)" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Не удалось заблокировать {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Отправить жалобу <0>+ Заблокировать профиль</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>- аккаунтов, хэштегов и постов</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Посты с <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Посты, помеченные <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Посмотреть <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Учетные записи с <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Домашняя / Подписки" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Публичная (Локальная / Федеративная)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Учетная запись" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Хэштег" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID списка" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Только локальная" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Инстанс" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Необязательно, например, mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Поисковый запрос" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Необязательно, если не выбран многоколоночный режим" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "напр. PixelArt (Макс 5, разделенные пробелом)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Только с медиафайлами" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Ярлыки" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "бета-версия" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Укажите список ярлыков, которые будут отображаться как:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Плавающая кнопка" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Вкладки/Меню" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Многоколоночный" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Недоступно в текущем режиме просмотра" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Переместить вверх" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Переместить вниз" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Редактировать" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Добавьте более одного ярлыка/столбца, чтобы сделать это." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Еще нет столбцов. Нажмите на кнопку Добавить столбец." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Пока нет ярлыков. Нажмите на кнопку Добавить ярлык." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Не уверены, что добавить? <0/>Попробуйте добавить <1>Домашняя / Подписки и Уведомления</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Макс. {SHORTCUTS_LIMIT} столбцов" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Макс. {SHORTCUTS_LIMIT} ярлыков" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Импорт/экспорт" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Добавить столбец…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Добавить ярлык…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Определенный список является необязательным. Для многоколоночного режима требуется список, иначе столбец не будет показан." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Для многоколоночного режима требуется поисковый запрос, иначе столбец не будет показан." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Поддерживаются несколько хэштегов. Разделенные пробелами." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Редактировать ярлык" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Добавить ярлык" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Лента" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Список" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Импорт/Экспорт <0>Ярлыков</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Импорт" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Вставьте ярлыки сюда" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Загрузка сохраненных ярлыков с сервера инстанса…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Не удается загрузить ярлыки" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Скачать ярлыки с сервера инстанса" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Существуют в текущем ярлыке" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Список не может работать, если он из другой учетной записи." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Недопустимый формат настроек" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Добавить в текущие ярлыки?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Будут добавлены только ярлыки, которые не существуют в текущем ярлыке." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Нет новых ярлыков для импорта" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Ярлыки импортированы. Превышен максимальный размер ({SHORTCUTS_LIMIT}), поэтому остальные не импортируются." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Ярлыков импортировано" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Импортировать и добавить…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Заменить текущие ярлыки?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Импортировать ярлыки?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "или заменить…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Импортировать…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Экспорт" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Ярлыки скопированы" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Не удалось скопировать ярлыки" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Настройки ярлыков скопированы" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Не удалось скопировать настройки ярлыка" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Поделиться" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Сохранение ярлыков на сервер инстанса…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Ярлыки сохранены" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Не удалось сохранить ярлыки" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Синхронизировать с сервером инстанса" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# символ} other {# символов}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Исходный JSON ярлыков" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Импорт/экспорт настроек с сервера инстанса (Очень экспериментально)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>продвинул(а)</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "К сожалению, ваша текущая учетная запись не может взаимодействовать с этим постом из другого инстанса." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Удалена отметка \"нравится\" у поста от @{0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Понравился пост от @{0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Удалена закладка поста от @{0}" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Добавлена закладка поста от @{0}" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Прекратить продвигать" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Цитировать" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Некоторые медиа не имеют описаний." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Старый пост (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Прекратил(а) продвигать пост @{0}" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Продвинул(а) пост @{0}" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Продвинуть…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Не нравится" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Нравится" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Удалить закладку" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Посмотреть пост <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Показать историю редактирования" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Отредактировано: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Встроить пост" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Обсуждение не игнорируется" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Обсуждение игнорируется" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Не удалось прекратить игнорировать обсуждение" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Не удалось игнорировать обсуждение" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Не игнорировать обсуждение" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Игнорировать обсуждение" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Пост откреплён из профиля" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Пост прикреплён к профилю" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Не удалось открепить пост" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Не удалось закрепить пост" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Открепить от профиля" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Закрепить в профиле" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Удалить этот пост?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Пост удален" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Не удалось удалить пост" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Пожаловаться на пост…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Нравится" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Продвинут" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Добавлен в закладки" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Закреплён" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Удалён" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# ответ} other {# ответ(а/ов)}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Обсуждение{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Свернуть/скрыть" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Показать содержимое" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Показать медиа" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Отредактировано" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Комментарии" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Больше от <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "История изменений" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Не удалось загрузить историю" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Загрузка…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML-код" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML-код скопирован" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Не удалось скопировать HTML-код" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Медиа-вложения:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Эмодзи пользователя:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "статический URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Эмодзи:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Заметки:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Это статическое, нестилизованное и не требующее сценариев. Возможно, вам придется применить свои собственные стили и отредактировать их по мере необходимости." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Опросы не интерактивны, они представляют собой список с подсчетом голосов." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Медиа-вложения могут быть изображениями, видео, аудио или определёнными типами файлов." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Пост может быть отредактирован или удален позже." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Предпросмотр" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Примечание: Этот предварительный просмотр слегка стилизован." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> продвинули" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Новые посты" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Повторите попытку" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Продвижение} other {# Продвижения}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Закреплённые посты" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Обсуждение" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Отфильтровано</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Автоперевод с {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Переводим…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Перевод с {sourceLangText} (автоопределение)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Перевод с {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Авто ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Не удалось перевести" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Редактирование статуса источника" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Ответить @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Теперь вы можете закрыть эту страницу." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Закрыть окно" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Требуется авторизация." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "Вернуться на главную" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Посты пользователя" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Ответы)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Продвижения)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Медиа)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Очистить фильтры" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Очистить" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Посты с ответами" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Ответы" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Посты без продвижений" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Продвижения" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Посты с медиа-контентом" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Посты, помеченные #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Посты с {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Здесь пока ничего нет." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Не удается загрузить посты" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Не удалось получить информацию об учетной записи" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Переключиться на инстанс {0} учетной записи" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Переключиться на мой инстанс (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Месяц" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Текущий" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "По умолчанию" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Переключить на этот аккаунт" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Переключиться в новой вкладке/окне" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Посмотреть профиль…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Установить по умолчанию" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Выйти из<0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Выйти…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Добавить существующую учетную запись" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Примечание. Учетная запись <0>по умолчанию</0> всегда будет использоваться для первой загрузки. Переключенные учетные записи будут сохраняться в течение сеанса." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Нет закладок. Добавьте какую-нибудь!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Не удалось загрузить закладки." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "за последний час" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "за последние 2 часа" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "за последние 3 часа" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "за последние 4 часа" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "за последние 5 часов" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "за последние 6 часов" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "за последние 7 часов" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "за последние 8 часов" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "за последние 9 часов" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "за последние 10 часов" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "за последние 11 часов" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "за последние 12 часов" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "более 12 часов" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Отслеживаемые хэштеги" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Группы" + +#: 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 "Отображается {selectedFilterCategory, select, all {все посты} original {оригинальные посты} replies {ответы} boosts {продвижения} followedTags {отслеживаемые тэги} groups {группы} filtered {отфильтрованные посты}}, {sortBy, select, createdAt {{sortOrder, select, asc {старые} desc {новейшие}}} reblogsCount {{sortOrder, select, asc {меньше всего продвижений} desc {больше всего продвижений}}} favouritesCount {{sortOrder, select, asc {меньше всего отметок \"нравится\"} desc {больше всего отметок \"нравится\"}}} repliesCount {{sortOrder, select, asc {меньше всего ответов} desc {больше всего ответов}}} density {{sortOrder, select, asc {менее плотные} desc {более плотные}}}} первые{groupBy, select, account {, сгруппированы по авторам} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Catch-up <0>бета</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Справка" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Что это?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Catch-up — это отдельная лента для ваших подписок, предлагающая на первый взгляд высокоуровневый вид, с простым и вдохновленным почтой интерфейсом, позволяющим легко сортировать и фильтровать по постам." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Предпросмотр интерфейса Catch-up" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Давайте приступим" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Давай посмотрим на посты из ваших подписок." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Покажи мне все посты…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "до максимума" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Наверстать упущенное" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Перепишет ваш последний catch-up" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "До последнего catch-up ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Примечание: Ваш инстанс может показывать не более 800 сообщений в домашней ленте, независимо от диапазона времени. Может быть меньше или больше." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Ранее…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# пост} other {# посты}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Удалить этот catch-up?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Убираем Catch-up {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Catch-up {0} убран" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Внимание: Будут сохранены только не более 3. Остальные будут автоматически удалены." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Подгружаем посты…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Это займет некоторое время." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Сбросить фильтры" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Самые популярные ссылки" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Поделил(ся/ась) {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Все" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# автор} other {# авторы}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Сортировка" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Дата" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Плотность" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "Авторы" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Отсутствует" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Показать всех авторов" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Вы не обязаны читать всё." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "Вот и всё!" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "Вернуться к началу" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Ссылки, которыми поделились подписчики, отсортированы по количеству взаимодействий, продвижений и отметок \"нравится\"." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Сортировка: Плотность" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Посты сортируются по плотности или глубине информации. Более короткие сообщения \"легкие\", в то время как длинные сообщения \"тяжелее\". Сообщения с фотографиями \"тяжелее\", чем сообщения без фотографий." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Группа: Авторы" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Посты группируются по авторам, сортируются по количеству сообщений на автора." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Следующий автор" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Предыдущий автор" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Прокрутка к началу" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Отфильтровано: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Нет отметок \"нравится\". Лайкните что-нибудь!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Не удалось загрузить отметки \"нравится\"." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Домашняя лента и списки" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Публичные ленты" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Диалоги" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Профили" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Никогда" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Новый фильтр" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# фильтр} other {# фильтр(а/ов)}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Не удалось загрузить фильтры." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Пока нет фильтров." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Добавить фильтр" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Редактировать фильтр" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Не удалось изменить фильтр" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Не удалось создать фильтр" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Заголовок" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Слово целиком" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Нет ключевых слов. Добавьте их." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Добавить ключевое слово" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# ключевое слово} other {# ключевых слов(а)}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Фильтр от…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Ещё не реализовано" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Состояние: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Изменить срок действия" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Срок действия" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Отфильтрованный пост будет…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "свернуто" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "скрыто" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Удалить этот фильтр?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Не удалось удалить фильтр." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Срок действия истёк" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Истекает <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Никогда не истекает" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, one {# хэштег} other {# хэштеги}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Не удалось загрузить отслеживаемые хэштеги." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Вы не отслеживаете ни одного хэштега." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Здесь пусто." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Не удалось загрузить посты." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (только медиа) на {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} на {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (только медиа)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Никто еще ничего не написал с этим тегом." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Не удается загрузить записи с этим тегом" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Отписаться от #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "Отписаться от #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "Подписаться на #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Подписка…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Не рекомендуется в профиле" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Не удалось отменить рекомендацию в профиле" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Рекомендуется в профиле" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Рекомендовать в профиле" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, other {Предел - # тэг(а/ов)}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Добавить хэштег" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Удалить хэштег" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, one {Достигнут предел в # ярлык. Не удалось добавить ярлык.} other {Достигнут предел в # ярлык(а/ов). Не удалось добавить ярлык.}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Ярлык уже существует" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Ярлык для хэштега добавлен" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Добавить в ярлыки" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Введите новый инстанс, например \"mastodon.social\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Некорректный инстанс" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Перейти к другому инстансу…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Переключиться на мой инстанс (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Не удалось загрузить уведомления." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Новые</0> <1>запросы на подписку</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Показать все" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Определение…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Не удается определить URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Пока что ничего нет." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Управление участниками" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Удалить <0>@{0}</0> из списка?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Удалить…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# список} other {# списк(а/ов)}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Пока нет списков." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Не удалось зарегистрировать приложение" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "домен инстанса" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "например “mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Не удалось войти. Пожалуйста, попробуйте еще раз или попробуйте другой инстанс." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Продолжить на {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Продолжить" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "Нет учетной записи? Создайте её!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Личные упоминания" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Личные" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Никто не упомянул вас :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Не удалось загрузить упоминания." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "Которых вы не читаете" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Кто не подписан на вас" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "С новой учетной записью" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Кому нежелательно лично упоминать вас" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Кто ограничен модераторами сервера" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Параметры уведомлений" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Новые уведомления" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Оповещение} other {Оповещени(я/й)}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Запросы на подписку" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# запрос на подписку} other {# запрос(а/ов) на подписку}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, one {Отфильтрованные уведомления от # человека} other {Отфильтрованные уведомления от # человек}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Только упоминания" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Сегодня" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Вы уловили всё." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Вчера" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Не удалось загрузить уведомления" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Параметры уведомлений обновлены" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Отфильтровать уведомления от людей:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Фильтр" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Игнорировать" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Обновлено <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Просмотр уведомлений от <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Уведомления от <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Уведомления от @{0} теперь не будут отфильтрованы." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Не удалось принять запрос на уведомление" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Разрешить" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Уведомления от @{0} теперь не будут отображаться в отфильтрованных уведомлениях." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Не удалось отклонить запрос на уведомление" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Отклонить" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Отклонено" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Локальная лента ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Федеративная лента ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Локальная лента" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Федеративная лента" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Никто ещё ничего не опубликовал." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Переключиться на Федеративную" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Переключиться на локальную" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Поиск: {q} (Посты)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Поиск: {q} (Учетные записи)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Поиск: {q} (Хэштеги)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Поиск: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Хэштеги" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Показать больше" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Показать больше учётных записей" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Учетные записи не найдены." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Показать больше хэштегов" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Хэштеги не найдены." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Показать больше постов" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Публикации не найдены." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Введите слово для поиска или вставьте URL выше, чтобы начать." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Параметры" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Тема" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Светлая" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Тёмная" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Устройство" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Размер текста" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "A" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Язык интерфейса" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Вы можете помочь с переводом" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Публикация сообщений" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Видимость поста по умолчанию" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Синхронизировано" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Не удалось обновить информацию о постах" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Синхронизировано с настройками сервера инстанса. <0>Перейдите к инстансу ({instance}) для дополнительных настроек.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Э-э-эксперименты" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Автоматически обновлять ленту с постами" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Карусель продвижений" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Перевод поста" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Перевести на" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Системный язык ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {Скрыть кнопку \"Перевести\" для:} other {Скрыть кнопку \"Перевести\" для (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Примечание: Эта функция использует услуги сторонних сервисов перевода, основанных на <0>Lingva API</0> и <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Автоматический встроенный перевод" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Автоматически показывать перевод постов на ленте. Работает только для <0>коротких</0> постов без предупреждения о содержимом, медиа и опросов." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Выбор GIF для исполнителя" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Примечание: Эта функция использует внешний сервис поиска GIF, работающий на <0>GIPHY</0>. Имеет рейтинг G (подходит для просмотра всем возрастам), параметры отслеживания удалены, информация о использовании отсутствует в запросах, но поисковые запросы и информация об IP-адресе все равно будут поступать на их серверы." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Генератор описания изображения" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Только для новых изображений при написании новых постов." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Примечание: Эта функция использует внешний сервис искусственного интеллекта, работающий на <0>img-alt-api</0>. Может работать некорректно. Только для изображений и на английском языке." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Группировка уведомлений на стороне сервера" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Функция находится в состоянии альфа. Потенциально улучшает группировку, однако логика группировки базовая." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "Облачный \"импорт/экспорт\" для настроек ярлыков" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Очень экспериментально.<0/>Хранится в заметках вашего профиля. Личные заметки (которые в профиле) в основном используются для других профилей и скрыты для собственного профиля." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Примечание: Эта функция использует текущий авторизованный API сервера инстанса." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Режим маскировки <0>(<1>Текст</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Замените текст блоками, полезными для изготовления скриншотов по соображениям конфиденциальности." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "О приложении" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Собрано</0> <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Стать спонсором" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Поддержать монеткой" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Политика конфиденциальности" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Сайт:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Версия:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Строка версии скопирована" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Не удалось скопировать строку версии" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Не удалось обновить подписку. Пожалуйста, попробуйте еще раз." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Не удалось удалить подписку. Пожалуйста, попробуйте еще раз." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Push-уведомления (бета)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Push-уведомления заблокированы. Пожалуйста, включите их в настройках браузера." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Разрешить от <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "кто угодно" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "людей, на которых я подписан(а)" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "подписчиков" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Подписки" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Опросы" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Редактирование постов" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Разрешение для Push не было предоставлено с момента вашего последнего входа в систему. Чтобы предоставить разрешение на push-уведомление, вам нужно будет <0><1>войти</1> еще раз</0>." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "ПРИМЕЧАНИЕ: Push-уведомления работают только для <0>одного аккаунта</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Пост" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Вы не вошли в систему. Взаимодействия (ответы, продвижения и т. п.) невозможны." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Это сообщение с другого инстанса (<0>{instance}</0>). Взаимодействия (ответ, продвижение и т. д.) невозможны." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Ошибка: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Переключиться на мой инстанс для включения взаимодействий" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Не удалось загрузить ответы." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Назад" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Перейти к главному посту" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} постов выше - Перейти к началу" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Переключиться на боковую панель" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Переключиться на полный вид" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Показать весь деликатный контент" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Экспериментальные" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Не удалось переключиться" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Переключиться на инстанс поста ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Переключиться на инстанс поста" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Не удалось загрузить пост" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# ответ} other {<0>{1}</0> ответ(а/ов)}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# комментарий} other {<0>{0}</0> комментари(я/ев)}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Просмотреть пост и ответы на него" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Популярное ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Популярные новости" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "От {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Назад к показу популярных сообщений" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Сообщения, упоминающие <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Популярные посты" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Нет популярных постов." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Минималистичный веб-клиент Mastodon со своим видением интерфейса." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Войти через Mastodon" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Регистрация" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Подключите ваш существующий аккаунт Mastodon/Fediverse.<0/>Ваши учетные данные не хранятся на этом сервере." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Собран</0> <1>@cheeaun</1>. <2>Политика конфиденциальности</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Скриншот Карусели продвижений" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Карусель продвижений" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Визуально разделять оригинальные посты и повторно распределяемые посты (посты, которые были продвинуты)." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Скриншот вложенных комментариев обсуждения" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Вложенные комментарии обсуждения" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Легко следить за разговорами. Сворачиваемые ответы." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Скриншот сгруппированных уведомлений" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Сгруппированные уведомления" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Похожие уведомления сгруппированы и свернуты для сокращения путаницы." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Скриншот многоколоночного интерфейса" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Одна или несколько колонок" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "По умолчанию один столбец для искателей в режиме дзен. Настраиваемая многоколоночная система для опытных пользователей." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Скриншот мульти-хэштег ленты с формой, чтобы добавить больше хэштегов" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Мульти-хэштег лента" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "До 5 хэштегов, объединенных в одну ленту." + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Похоже, что ваш браузер блокирует всплывающие окна." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Черновик сообщения в настоящее время минимизирован. Отправьте или удалите его перед созданием нового." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "В настоящее время открыт пост. Опубликуйте его или отмените его перед созданием нового." + diff --git a/src/locales/th-TH.po b/src/locales/th-TH.po new file mode 100644 index 00000000..e6477df5 --- /dev/null +++ b/src/locales/th-TH.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: th\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Thai\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: th\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "ล็อค" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "โพสต์: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "โพสต์ล่าสุด: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "อัตโนมัติ" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "กลุ่ม" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "ร่วมกัน" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "ส่งคำขอแล้ว" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "กำลังติดตาม" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "ติดตามคุณ" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, other {# ผู้ติดตาม}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "ยืนยันแล้ว" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "เข้าร่วมเมื่อ <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "ตลอดไป" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "ไม่สามารถโหลดบัญชีได้" + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "ไปที่หน้าบัญชี" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "ผู้ติดตาม" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "following.stats" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "โพสต์" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "เพิ่มเติม" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> ได้ระบุว่าเปลี่ยนบัญชีใหม่เป็น:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "คัดลอกชื่อเรียกแล้ว" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "ไม่สามารถคัดลอกชื่อเรียก" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "คัดลอกชื่อเรียก" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "ดูภาพโพรไฟล์" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "ในความทรงจำ" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "ผู้ใช้นี้ได้เลือกที่จะไม่ทำให้ข้อมูลนี้พร้อมใช้งาน" + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "ต้นฉบับ" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "การตอบกลับ" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "การดัน" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "สถิติโพสต์ไม่พร้อมใช้งาน" + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "ดูสถิติโพสต์" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "โพสต์ล่าสุด: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "กล่าวถึง <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "" + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "ปิดใช้งานการแจ้งเตือน" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "เปิดใช้งานการแจ้งเตือน" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "" + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "คัดลอกลิงก์แล้ว" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "ไม่สามารถคัดลอกลิงก์" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "คัดลอก" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "" + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "แชร์…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "แก้ไขโปรไฟล์" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "ถอนคำขอติดตามหรือไม่?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "เลิกติดตาม @{0} หรือไม่?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "เลิกติดตาม…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "ถอน…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "ติดตาม" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "ปิด" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "ไม่มีรายการ" + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "รายการใหม่" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "ยกเลิก" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "บันทึกและปิด" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "ไม่สามารถอัปเดตโปรไฟล์" + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "ชื่อ" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "เนื้อหา" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "บันทึก" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "ชื่อผู้ใช้" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "ชื่อโดเมนเซิร์ฟเวอร์" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "หน้าหลัก" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "เขียน" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "คุณมีการเปลี่ยนแปลงที่ไม่ได้บันทึก ละทิ้งโพสต์นี้ไหม?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, other {ไฟล์ {2} เป็นไฟล์ที่ไม่รองรับ}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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, other {คุณสามารถแนบไฟล์ได้สูงสุดเพียง # ไฟล์}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "ย่อขนาด" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "กำลังแก้ไขโพสต์ต้นฉบับ" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "สาธารณะ" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "ในเซิร์ฟเวอร์" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "ไม่อยู่ในรายการ" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "ผู้ติดตามเท่านั้น" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "การกล่าวถึงแบบส่วนตัว" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "แก้ไขโพสต์ของคุณ" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "คุณกำลังทำอะไรอยู่?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "ทำเครื่องหมายสื่อว่าละเอียดอ่อน" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "" + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "" + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "" + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "ถูกใจโดย" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "เลิกถูกใจ" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "ถูกใจ" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "ถูกใจแล้ว" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "" + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "ไม่สามารถโหลดจำนวนที่ถูกใจได้" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "ดูเหมือนว่าเบราเซอร์คุณบล๊อคป๊อปอัพอยู่" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/locales/uk-UA.po b/src/locales/uk-UA.po new file mode 100644 index 00000000..43dc9457 --- /dev/null +++ b/src/locales/uk-UA.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: uk\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "Закритий профіль" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "Дописи: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "Останній допис: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "Автоматизовано" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "Група" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "Взаємно" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "Зроблено запит" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "Ви підписані" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "Підписаний(-на) на вас" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, one {# підписник} many {# підписників} other {# підписники}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "Верифіковано" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "Приєднав(-ла)ся <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "Назавжди" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "Не вдалося завантажити обліковий запис." + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "Перейти на сторінку облікового запису" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "Підписники" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "Підписок" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "Дописів" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "Більше" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> вказав(-ла), що новий обліковий запис зараз:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "Ідентифікатор скопійовано" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "Не вдалося скопіювати ідентифікатор" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "Скопіювати ідентифікатор" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "Перейти на сторінку на сервері" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "Переглянути зображення профілю" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "Переглянути шапку профілю" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "Вічна пам'ять" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "Цей користувач вирішив не розкривати цю інформацію." + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} дописи, {1} відповіді, {2} поширення" + +#: 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 {1 останній допис за 1 останній день} other {1 останній допис за {2} останніх днів}}} other {{3, plural, one {Останні {4} дописів за 1 останній день} other {Останні {5} дописів за {6} останніх днів}}}}" + +#: 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 {{1} допис} few {{1} дописи} many {{1} дописів} other {{1} дописи}} за останній рік чи роки" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "Оригінал" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "Відповіді" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "Поширення" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "Статистика дописів недоступна." + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "Переглянути статистику дописів" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "Останній допис: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "Заглушений(-а)" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "Заблокований(-а)" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "Приватна нотатка" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "Згадати <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "Перекласти біографію" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "Редагувати приватну нотатку" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "Додати приватну нотатку" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "Сповіщення про дописи @{username} увімкнено." + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "Сповіщення про дописи @{username} вимкнено." + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "Вимкнути сповіщення" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "Увімкнути сповіщення" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "Поширення від @{username} увімкнено." + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "Поширення від @{username} вимкнено." + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "Вимкнути поширення" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "Увімкнути поширення" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "Додати/видалити зі Списків" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "Посилання скопійовано" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "Не вдалося скопіювати посилання" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "Скопіювати" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "Здається, поширення не працює." + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "Поширити…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "@{username} більше не глушиться" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "Не глушити <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "Заглушити <0>@{username}</0>" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "@{username} заглушений на {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "Не вдалося заглушити @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "Відписати <0>@{username}</0>?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} відписано" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "Відписати…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "Заблокувати <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "@{username} розблоковано" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "@{username} заблоковано" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "Не вдалося розблокувати @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "Не вдалося заблокувати @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "Розблокувати <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "Заблокувати <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "Поскаржитися на <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "Редагувати профіль" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "Відкликати запит на підписку?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "Відписатися від @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "Відписатися…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "Відкликати…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "Підписатися" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "Закрити" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "Перекладена біографія" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "Не вдалося видалити зі списку" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "Не вдалося додати до списку" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "Не вдалося завантажити список" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "Списки відсутні." + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "Новий список" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "Приватна нотатка про <0>@{0}</0>" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "Не вдалося оновити приватну нотатку" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "Скасувати" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "Зберегти і закрити" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "Не вдалося оновити профіль." + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "Назва" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "Біографія" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "Додаткові поля" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "Заголовок" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "Вміст" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "Зберегти" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "ім'я користувача" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "доменне ім'я сервера" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "Режим маскування вимкнено" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "Режим маскування увімкнено" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "Домашня" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "Написати" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "Додати користувацькі емодзі" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "Додати опитування" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "Є незбережені зміни. Скасувати цей допис?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, one {Файл {1} не підтримується.} other {Файли {2} не підтримуються.}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 {Ви можете прикріпити до 1 файлу.} other {Ви можете прикріпити до # файлів.}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "В окремому вікні" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "Згорнути" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "Здається, ви закрили батьківське вікно." + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "Здається, ви вже публікуєте допис в батьківському вікні. Дочекайтеся публікації та повторіть спробу." + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "Здається, ви вже друкуєте або редагуєте допис в батьківському вікні. Повернення в це вікно скасує зміни, що зроблені в батьківському вікні. Продовжити?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "Повернути в батьківське вікно" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "Відповідаємо на допис @{0} (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "Відповідаємо на допис @{0}" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "Редагування вихідного допису" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "Опитування повинно мати не більше 2 опцій" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "Деякі варіанти опитування порожні" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "Деякі медіа не мають альтернативного тексту. Продовжити?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "Помилка вкладення #{i}" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "Попередження про вміст" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "Попередження про вміст або чутливе медіа" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "Для всіх" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "Локальна" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "Поза списком" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "Лише підписники" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "Лише згадані" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "Опублікувати відповідь" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "Редагувати допис" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "Що ви робите?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "Позначити медіа як чутливе" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "Додати" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "Відповісти" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "Оновити" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "Опублікувати" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "Завантаження GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "Не вдалося завантажити GIF" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "Більше…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "Вивантажено" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "Опис зображення" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "Опис відео" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "Опис аудіо" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "Розмір файлу завеликий. Можуть виникнути проблеми з вивантаженням файлу. Спробуйте зменшити його розмір з {0} до {1} або менше." + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "Розмір зображення завеликий. Можуть виникнути проблеми із вивантаженням. Спробуйте зменшити його з {0}×{1}px до {2}×{3}px." + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "Частота кадрів зависока. Можуть виникнути проблеми із вивантаженням. " + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "Вилучити" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "Помилка" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "Редагувати опис зображення" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "Редагувати опис відео" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "Редагувати опис аудіо" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "Генерується опис. Будь ласка, зачекайте…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "Помилка генерації опису: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "Помилка генерації опису" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "Згенерувати опис…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "Помилка генерації опису{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— експериментально</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "Готово" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "Варіант {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "Кілька варіантів відповідей" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "Тривалість" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "Прибрати опитування" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "Шукати облікові записи" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "Помилка завантаження облікових записів" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "Користувацькі емодзі" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "Шукати емодзі" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "Помилка завантаження емодзі" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "Нещодавно використані" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "Інші" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} більше…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "Пошук GIF-ок" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "На базі GIPHY" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "Почніть набирати для пошуку GIF-ок" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "Попередні" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "Наступні" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "Помилка завантаження GIF-ок" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "Невідправлені чернетки" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "Схоже, у вас є невідправлені чернетки. Ви можете відновити роботу з ними." + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "Видалити цю чернетку?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "Помилка видалення чернетки! Будь ласка, спробуйте ще раз." + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "Видалити…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "Не вдалося отримати допис для відповіді" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "Видалити всі чернетки?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "Помилка видалення чернеток! Будь ласка, спробуйте ще раз." + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "Видалити всі…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "Поки що жодної чернетки" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "Опитування" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "Медіа" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "Відкрити у новому вікні" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "Погодитись" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "Відхилити" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "Погоджено" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "Відхилено" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "Нічого показати" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "Облікові записи" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "Показати більше…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "Кінець." + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "Комбінації клавіш" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "Довідка з комбінацій клавіш" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "Наступний допис" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "Попередній допис" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "Наступний допис (пропустити карусель)" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "Попередній допис (пропустити карусель)" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "Завантажити нові дописи" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "Відкрити подробиці допису" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> або <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "Розгорнути попередження про вміст або<0/>перемкнути розгорнуту/згорнуту нитку" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "Закрити допис або діалоги" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> або <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "Фокус стовпця в режимі декількох стовпців" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> по <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "Перемістити фокус на наступний стовпець в режимі декількох стовпців" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "Перемістити фокус на попередній стовпець в режимі декількох стовпців" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "Створити новий допис" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "Створити новий допис (нове вікно)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "Опублікувати допис" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> або<2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "Пошук" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "Відповісти (нове вікно)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "Вподобати (обране)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> або<1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "Поширити" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "Додати в закладки" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "Перемкнути режим маскування" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "Редагувати список" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "Не вдалось відредагувати список." + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "Не вдалося створити список." + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "Показувати відповіді учасникам списку" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "Показувати відповіді на людей, на яких я підписан(ий/а)" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "Не показувати відповіді" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "Приховати дописи цього списку з Головної/Підписок" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "Створити" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "Видалити цей список?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "Не вдалося видалити список." + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "Опис медіа" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "Перекласти" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "Вимовити" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "Відкрити оригінальне медіа у новому вікні" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "Відкрити оригінальне медіа" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "Пробуємо описати зображення. Будь ласка, зачекайте…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "Не вдалося описати зображення" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "Опишіть зображення…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "Переглянути допис" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "Чутливе медіа" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "Відфільтровано: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "Відфільтровано" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "Допис опубліковано. Перевірте це." + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "Відповідь опубліковано. Перевірте це." + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "Допис оновлено. Перевірте це." + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "Меню" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "Перезавантажити сторінку для оновлення?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "Доступне нове оновлення…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "Підписки" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "Ретроспектива" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "Згадки" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "Сповіщення" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "Нове" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "Профіль" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "Закладки" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "Вподобане" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "Відстежувані хештеґи" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "Фільтри" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "Заглушені користувачі" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "Заглушені користувачі…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "Заблоковані користувачі" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "Заблоковані користувачі…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "Облікові записи…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "Увійти" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "Популярне" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "Федеративна" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "Ярлики / Стовпці…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "Налаштування…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "Списки" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "Всі списки" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "Сповіщення" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "Це сповіщення з вашого іншого облікового запису." + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "Переглянути всі сповіщення" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} відреагував {emojiObject} на ваш допис " + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} опублікував допис" + +#: src/components/notification.jsx:85 +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} пошири(в/ла) вашу відповідь.} other {{account} пошири(в/ла) ваш допис.}}} few {{postType, select, reply {{account} пошири(в/ла) {postsCount} ваші відповіді.} other {{account} пошири(в/ла) {postsCount} ваші дописи.}}} other {{postType, select, reply {{account} пошири(в/ла) {postsCount} ваших відповідей.} other {{account} пошири(в/ла) {postsCount} ваших дописів.}}}}} few {{postsCount, plural, =1 {{postType, select, reply {<0><1>{0}</1> користувачі</0> поширили вашу відповідь.} other {<0><1>{0}</1> користувачі</0> поширили ваш допис.}}} few {{postType, select, reply {<0><1>{0}</1> користувачі</0> поширили {postsCount} ваші відповіді.} other {<0><1>{0}</1> користувачі</0> поширили {postsCount} ваші дописи.}}} other {{postType, select, reply {<0><1>{0}</1> користувачі</0> поширили {postsCount} ваших відповідей.} other {<0><1>{0}</1> користувачі</0> поширили {postsCount} ваших дописів.}}}}} other {{postsCount, plural, =1 {{postType, select, reply {<0><1>{0}</1> користувачів</0> поширили вашу відповідь.} other {<0><1>{0}</1> користувачів</0> поширили ваш допис.}}} few {{postType, select, reply {<0><1>{0}</1> користувачів</0> поширили {postsCount} ваші відповіді.} other {<0><1>{0}</1> користувачів</0> поширили {postsCount} ваші дописи.}}} other {{postType, select, reply {<0><1>{0}</1> користувачів</0> поширили {postsCount} ваших відповідей.} other {<0><1>{0}</1> користувачів</0> поширили {postsCount} ваших дописів.}}}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} підписа(вся/лась) на вас.} few {<0><1>{0}</1> користувачі</0> підписалися на вас.} other {<0><1>{0}</1> користувачів</0> підписалися на вас.}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} подав запит на підписку." + +#: src/components/notification.jsx:151 +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} вподоба(в/ла) вашу відповідь.} other {{account} вподоба(в/ла) ваш допис.}}} few {{postType, select, reply {{account} вподоба(в/ла) {postsCount} ваші відповіді.} other {{account} вподоба(в/ла) {postsCount} ваші дописи.}}} other {{postType, select, reply {{account} вподоба(в/ла) {postsCount} ваших відповідей.} other {{account} вподоба(в/ла) {postsCount} ваших дописів.}}}}} few {{postsCount, plural, =1 {{postType, select, reply {<0><1>{0}</1> користувачі</0> вподобали вашу відповідь.} other {<0><1>{0}</1> користувачі</0> вподобали ваш допис.}}} few {{postType, select, reply {<0><1>{0}</1> користувачі</0> вподобали {postsCount} ваші відповіді.} other {<0><1>{0}</1> користувачі</0> вподобали {postsCount} ваші дописи.}}} other {{postType, select, reply {<0><1>{0}</1> користувачі</0> вподобали {postsCount} ваших відповідей.} other {<0><1>{0}</1> користувачі</0> вподобали {postsCount} ваших дописів.}}}}} other {{postsCount, plural, =1 {{postType, select, reply {<0><1>{0}</1> користувачів</0> вподобали вашу відповідь.} other {<0><1>{0}</1> користувачів</0> вподобали ваш допис.}}} few {{postType, select, reply {<0><1>{0}</1> користувачів</0> вподобали {postsCount} ваші відповіді.} other {<0><1>{0}</1> користувачів</0> вподобали {postsCount} ваші дописи.}}} other {{postType, select, reply {<0><1>{0}</1> користувачів</0> вподобали {postsCount} ваших відповідей.} other {<0><1>{0}</1> користувачів</0> вподобали {postsCount} ваших дописів.}}}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "Опитування, в якому ви проголосували або яке створили, закінчилося." + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "Опитування, яке ви створили, завершено." + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "Опитування, в якому ви проголосували, закінчилося" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "Допис, з яким ви взаємодіяли, був відредагований." + +#: src/components/notification.jsx:204 +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} пошири(в/ла) і вподоба(в/ла) вашу відповідь.} other {{account} пошири(в/ла) і вподоба(в/ла) ваш допис.}}} few {{postType, select, reply {{account} пошири(в/ла) і вподоба(в/ла) {postsCount} ваші відповіді.} other {{account} пошири(в/ла) і вподоба(в/ла) {postsCount} ваші дописи.}}} other {{postType, select, reply {{account} пошири(в/ла) і вподоба(в/ла) {postsCount} ваших відповідей.} other {{account} пошири(в/ла) і вподоба(в/ла) {postsCount} ваших дописів.}}}}} few {{postsCount, plural, =1 {{postType, select, reply {<0><1>{0}</1> користувачі</0> поширили і вподобали вашу відповідь.} other {<0><1>{0}</1> користувачі</0> поширили і вподобали ваш допис.}}} few {{postType, select, reply {<0><1>{0}</1> користувачі</0> поширили і вподобали {postsCount} ваші відповіді.} other {<0><1>{0}</1> користувачі</0> поширили і вподобали {postsCount} ваші дописи.}}} other {{postType, select, reply {<0><1>{0}</1> користувачі</0> поширили і вподобали {postsCount} ваших відповідей.} other {<0><1>{0}</1> користувачі</0> поширили і вподобали {postsCount} ваших дописів.}}}}} other {{postsCount, plural, =1 {{postType, select, reply {<0><1>{0}</1> користувачів</0> поширили і вподобали вашу відповідь.} other {<0><1>{0}</1> користувачів</0> поширили і вподобали ваш допис.}}} few {{postType, select, reply {<0><1>{0}</1> користувачів</0> поширили і вподобали {postsCount} ваші відповіді.} other {<0><1>{0}</1> користувачів</0> поширили і вподобали {postsCount} ваші дописи.}}} other {{postType, select, reply {<0><1>{0}</1> користувачів</0> поширили і вподобали {postsCount} ваших відповідей.} other {<0><1>{0}</1> користувачів</0> поширили і вподобали {postsCount} ваших дописів.}}}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} зареєструвався(-лась)" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} поскаржився(-лась) на {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "Втрачено з'єднання з <0>{name}</0>." + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "Попередження про модерацію" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "Адміністратор з <0>{from}</0> призупинив <1>{targetName}</1>, що означає, що ви більше не зможете отримувати оновлення від них або взаємодіяти з ними." + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "Адміністратор з <0>{from}</0> заблокував <1>{targetName}</1>. Торкнулося підписників: {followersCount}, підписки: {followingCount}." + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "Ви заблокували <0>{targetName}</0>. Видалені підписники: {followersCount}, підписки: {followingCount}." + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "Ваш обліковий запис отримав попередження про модерацію." + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "Ваш обліковий запис було вимкнено." + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "Деякі з ваших дописів було позначено як чутливі." + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "Деякі з ваших дописів було видалено." + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "Відтепер ваші дописи будуть позначатися як чутливі." + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "Ваш обліковий запис було обмежено." + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "Ваш обліковий запис було призупинено." + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[Невідомий тип сповіщення: {type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "Поширили/Вподобали…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "Вподобали…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "Поширили…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "Підписалися…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "Дізнайтеся більше <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "Читати більше →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "Проголосував(-ла)" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, one {# голос} few { # голоси} other {# голосів}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "Приховати результати" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "Проголосувати" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "Оновити" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "Показати результати" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, one {<0>{0}</0> проголосува(в/ла)} other {<1>{1}</1> проголосували}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, one {<0>{0}</0> учасник} few {<1>{1}</1> учасники} other {<1>{1}</1> учасників}} опитування" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "Завершено <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "Завершено" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "Завершення <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "Завершення" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}с" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}хв" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}г" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "Спам" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "Шкідливі посилання, фальшиві взаємодії, або відповіді, що повторюються" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "Нелегал" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "Порушує закон вашої країни чи країни серверу" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "Порушення правил серверу" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "Порушує певні правила серверу" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "Порушення" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "Інше" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "Проблема не відповідає іншим категоріям" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "Поскаржитися на допис" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "Поскаржитися на @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "Очікує перевірки" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "Скарга на допис відправлена" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "Скарга на обліковий запис відправлена" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "Не вдалося поскаржитися на допис" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "Не вдалося поскаржитися на обліковий запис" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "Яка проблема з цим дописом?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "Яка проблема з цим обліковим записом?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "Додаткова інформація" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "Переслати до <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "Надіслати скаргу" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "{username} заглушено" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "Неможливо заглушити {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "Надіслати скаргу <0>+ Заглушити користувача</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "{username} заблоковано" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "Не вдалося заблокувати {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "Надіслати скаргу <0>+ Заблокувати користувача</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>‒ обліківки, хештеґи та дописи</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "Дописи з <0>{query}</0>" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "Дописи, що помічені <0>#{0}</0>" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "Переглянути <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "Облікові записи з <0>{query}</0>" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "Домашня / Підписки" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "Публічна (Локальна / Федеративна)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "Обліковий запис" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "Хештеґ" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "ID списку" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "Лише локальна" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "Інстанс" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "Необов'язково, напр. \"twiukraine.com\"" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "Пошуковий запит" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "Необов'язково для режиму з одним стовпцем" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "напр. PixelArt (Макс 5, розділені пробілом)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "Лише медіа" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "Ярлики" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "бета" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "Вкажіть список ярликів, які будуть виглядати як:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "Кнопка, що плаває" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "Панель Вкладки/Меню" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "Декілька стовпців" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "Недоступно в поточному режимі перегляду" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "Перемістити вгору" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "Пересунути вниз" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "Редагувати" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "Додайте кілька ярликів/стовпців, щоб це працювало." + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "Ще немає стовпців. Натисніть кнопку Додати стовпчик." + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "Ще немає ярликів. Натисніть кнопку Додати ярлик." + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "Не знаєте що додати?<0/> Радимо почати з <1>Додому / Підписки</1> та <1>Сповіщення</1>." + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "Максимум {SHORTCUTS_LIMIT} стовпців" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "Максимум {SHORTCUTS_LIMIT} ярликів" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "Імпорт/Експорт" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "Додати стовпець…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "Додати ярлик…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "Вказаний список не є обов'язковим. Для режиму з кількома стовпцями список необхідний, інакше стовпець не буде показано." + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "Для режиму з кількома стовпцями пошуковий запит необхідний, інакше стовпець не буде показано." + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "Підтримуються декілька гештеґів. Розділені пробілами." + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "Редагувати ярлик" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "Додати ярлик" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "Стрічка" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "Список" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "Імпорт/Експорт <0>Ярликів</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "Імпорт" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "Вставити ярлики сюди" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "Завантаження збережених ярликів з сервера інстансу…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "Не вдалося завантажити ярлики" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "Завантажити ярлики з сервера інстансу" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* Існує в поточних ярликах" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "Список може не працювати, якщо він з іншого облікового запису." + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "Неприпустимий формат налаштувань" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "Додати до поточних ярликів?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "Будуть додані лише ті ярлики, яких немає серед поточних ярликів." + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "Немає нових ярликів для імпорту" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "Ярлики імпортовано. Перевищено ліміт {SHORTCUTS_LIMIT}, тому інші не імпортуються." + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "Ярлики імпортовано" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "Імпортувати й додати…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "Замінити поточні ярлики?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "Імпортувати ярлики?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "або замінити…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "Імпортувати…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "Експорт" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "Ярлики скопійовано" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "Не вдалося скопіювати ярлики" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "Налаштування ярлика скопійовано" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "Не вдалося скопіювати налаштування ярлику" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "Поширити" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "Збереження ярликів до сервера інстансу…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "Ярлики збережено" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "Не вдалося зберегти ярлики" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "Синхронізувати з сервером інстансу" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, one {# символ} few {# символи} other {# символів}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "Вихідний JSON Ярликів" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "Імпорт/експорт налаштувань з/на сервер інстансу (Дуже експериментально)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>пошири(в/ла)</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "На жаль, ваш поточний інстанс не може взаємодіяти з цим дописом з іншого інстансу." + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "Не вподобано допис @{0}" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "Вподобано допис @{0}" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "Допис @{0} прибрано із закладок" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "Допис @{0} додано в закладки" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "Не поширювати" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "Цитувати" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "Деякі медіа не мають альтернативного тексту." + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "Старий допис (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "Допис @{0} більше не поширюється" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "Допис @{0} поширено" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "Поширити…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "Не вподобати" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "Вподобати" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "Вилучити з закладок" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "Переглянути допис від <0>@{0}</0>" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "Показати Історію Змін" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "Відредаговано: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "Вбудувати допис" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "Бесіда більше не глушиться" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "Бесіда заглушена" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "Не вдалося розглушити бесіду" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "Не вдалося заглушити бесіду" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "Розглушити бесіду" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "Заглушити бесіду" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "Допис відкріплено від профілю" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "Допис закріплено в профілі" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "Не вдалося відкріпити допис" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "Не вдалося закріпити допис" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "Відкріпити від профілю" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "Закріпити в профілі" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "Видалити цей допис?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "Допис видалено" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "Не вдалося видалити допис" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "Поскаржитися на допис…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "Вподобано" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "Поширено" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "Додано в закладки" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "Закріплено" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "Видалено" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, one {# відповідь} few {# відповіді} other {# відповідей}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "Нитка{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "Згорнути" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "Показати вміст" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "Показати медіа" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "Відредаговано" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "Коментарі" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "Більше від <0/>" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "Історія Змін" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "Не вдалося завантажити історію" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "Завантаження…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML-код" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "HTML-код скопійовано" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "Не вдалося скопіювати HTML-код" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "Медіа вкладення:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "Емодзі обліківки:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "статичний URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "Емодзі:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "Нотатки:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "Це статичне, не стилізоване та без сценаріїв. Можливо, варто застосувати власні стилі та відредагувати як треба." + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "Опитування не інтерактивні, вони являють собою список з підрахованими голосами." + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "Вкладені медіа можуть бути зображеннями, відео, аудіо чи будь-якими іншими типами файлів." + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "Допис можна відредагувати або видалити пізніше." + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "Попередній перегляд" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "Примітка: Цей попередній перегляд трохи стилізовано." + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> поширили" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "Нові дописи" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "Спробувати знову" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, one {# Поширення} few {# Поширення} other{# Поширень}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "Закріплені дописи" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "Нитка" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>Відфільтровано</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "Автопереклад з {sourceLangText}" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "Перекладаємо…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "Перекласти з {sourceLangText} (автовизначення)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "Перекласти з {sourceLangText}" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "Авто ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "Не вдалося перекласти" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "Редагування вихідного статусу" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "Відповісти @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "Тепер ви можете закрити сторінку." + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "Закрити вікно" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "Необхідно ввійти." + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "На головну" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "Дописи облікового запису" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ Відповіді)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- Поширення)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (Медіа)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "Скинути фільтри" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "Очистити" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "Показ дописів з відповідями" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ Відповіді" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "Показ дописів без поширень" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- Поширення" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "Показ дописів з медіа" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "Показ дописів з теґом #{0}" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "Показ дописів в {0}" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "Поки що тут нічого нема." + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "Не вдалося завантажити дописи" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "Не вдалося отримати інформацію про обліковий запис" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "Перемкнутися на інстанс {0} обліківки" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "Перемкнутися на мій інстанс (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "Місяць" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "Поточний" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "За замовчуванням" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "Перемкнутися на цю обліківку" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "Перемкнутися в новій вкладці/вікні" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "Переглянути профіль…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "Встановити за замовчуванням" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "Вийти з <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "Вийти з…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "Додати існуючий обліковий запис" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "Примітка: При першому завантаженні буде використано обліковий запис <0>за замовчуванням</0>. Перемикання між обліківками буде зберігатися протягом сесії." + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "Жодної закладки. Додаймо якусь!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "Не вдалося завантажити закладки." + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "остання година" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "останні 2 години" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "останні 3 години" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "останні 4 години" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "останні 5 годин" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "останні 6 годин" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "останні 7 годин" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "останні 8 годин" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "останні 9 годин" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "останні 10 годин" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "останні 11 годин" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "останні 12 годин" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "більше 12 годин" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "Відстежувані теґи" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "Групи" + +#: 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 "Показуються {selectedFilterCategory, select, all {усі дописи} original {оригінальні дописи} replies {відповіді} boosts {поширення} followedTags {відстежувані теґи} groups {групи} filtered {відфільтровані дописи}}, {sortBy, select, createdAt {{sortOrder, select, asc {найстаріші} desc {найновіші}}} reblogsCount {{sortOrder, select, asc {найменш поширені} desc {найпоширеніші}}} favouritesCount {{sortOrder, select, asc {найменш вподобані} desc {найвподобаніші}}} repliesCount {{sortOrder, select, asc {найменше відповідей} desc {найбільше відповідей}}} density {{sortOrder, select, asc {найменш наповнені} desc {найбільш наповнені}}}} перші{groupBy, select, account {, згруповані за авторами} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "Ретроспектива <0>бета</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "Довідка" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "Що це?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "Ретроспектива (Cath-Up) - це окрема стрічка ваших підписок, що пропонує їх високорівневий перегляд з простим, натхненний email-ом інтерфейсом для багатофункціонального і легкого сортування і фільтру дописів." + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "Попередній перегляд інтерфейсу Ретроспективи" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "Зрозуміло, до роботи" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "Нумо переглянемо дописи з ваших підписок." + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "Показати мені всі дописи з…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "до максимуму" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "Наздогнати" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "Перетинається з вашою останньою ретроспективою" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "До останньої ретроспективи ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "Примітка: ваш інстанс може показати не більше 800 дописів в Домашній стрічці незалежно від часового діапазону. Може бути менше або більше." + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "Раніше…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, one {# допис} few {# дописи} other {# дописів}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "Видалити цю ретроспективу?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "Видалення ретроспективи {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "Ретроспективу {0} видалено" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "Примітка: Буде збережено не більше 3 останніх ретроспектив." + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "Отримання дописів…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "Це може зайняти деякий час." + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "Скинути фільтри" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "Найпопулярніші посилання" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "Поширили {0}" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "Усе" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, one {# автор} few {# автори} other {# авторів}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "Сортування" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "Дата" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "Наповнення" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "Групування" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "За авторами" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "Не групувати" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "Показати всіх авторів" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "Ви не мусите читати все." + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "На цьому все." + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "На початок" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "Посилання, поширені підписками, відсортовані за кількістю взаємодій, поширень і вподобань." + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "Сортування: Наповнення" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "Дописи відсортовані за наповненням або розміром інформації. Короткі дописи - \"легші\", коли як довші пости - \"важче\". Дописи із зображенням \"важче\", аніж дописи без зображень." + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "Групування: За авторами" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "Дописи згруповані за авторами, відсортовані за кількістю дописів на автора." + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "Наступний автор" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "Попередній автор" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "Прокрутити догори" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "Відфільтровано: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "Жодного вподобання. Нумо вподобайте щось!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "Не вдалося завантажити вподобання." + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "Домашня та Списки" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "Публічна стрічка" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "Бесіди" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "Профілі" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "Ніколи" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "Новий фільтр" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, one {# фільтр} few {# фільтри} other {# фільтрів}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "Не вдалося завантажити фільтри." + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "Немає жодного фільтра." + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "Додати фільтр" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "Редагувати фільтр" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "Не вдалося редагувати фільтр" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "Не вдалося створити фільтр" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "Заголовок" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "Ціле слово" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "Немає ключових слів. Додайте одне." + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "Додати ключове слово" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, one {# ключове слово} few {# ключових слова} other {# ключових слів}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "Фільтрувати з…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* Ще не реалізовано" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "Статус: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "Змінити термін дії" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "Термін дії" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "Відфільтрований допис буде…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "згорнуто" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "приховано" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "Видалити цей фільтр?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "Не вдалося видалити фільтр." + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "Прострочений" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "Минає <0/>" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "Необмежений термін дії" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural,one {# хештеґ} few {# хештеґи} other {# хештеґів}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "Не вдалося завантажити хештеґи, що відстежуються." + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "Жодного хештеґу не відстежується." + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "Немає на що дивитись." + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "Не вдалося завантажити дописи." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{hashtagTitle} (Лише медіа) на {instance}" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{hashtagTitle} на {instance}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (Лише медіа)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "Жодного допису із цим хештеґом." + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "Не вдалося завантажити дописи із цим хештеґом." + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "Не відстежувати #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "#{hashtag} не відстежується" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "#{hashtag} відстежується" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "Відстежуємо…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "Не рекомендовано в профілі" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "Не вдалося скасувати рекомендацію в профілі" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "Рекомендовано в профілі" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "Рекомендувати в профілі" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, few {Макс. # теґи} other {Макс. # теґів}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "Додати хештеґ" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "Видалити хештеґ" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "Досягнуто ліміт в {SHORTCUTS_LIMIT, plural, one {# ярлик.} few {# ярлики.} other {# ярликів.}} Не вдалося додати ярлик." + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "Цей ярлик вже існує" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "Ярлик хештеґу додано" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "Додати в Ярлики" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "Введіть новий інстанс, напр. \"twiukraine.com\"" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "Некоректний інстанс" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "Перейти до іншого інстансу…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "Перейти до мого інстансу (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "Не вдалося отримати сповіщення." + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>Нові</0> <1>Запити на Підписку</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "Переглянути всі" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "Визначається…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "Не вдалося визначити URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "Поки нічого." + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "Керувати учасниками" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "Вилучити <0>@{0}</0> зі списку?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "Вилучити…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, one {# список} few {# списки} other {# списків}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "Списків поки немає." + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "Не вдалося зареєструвати застосунок" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "домен інстансу" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "напр. \"twiukraine.com\"" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "Не вдалося увійти. Будь ласка, повторіть спробу або спробуйте інший екземпляр." + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "Продовжити з {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "Продовжити" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "У вас ще немає облікового запису? Створіть його!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "Особисті згадки" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "Приватне" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "Ніхто не згадував вас :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "Не вдалося завантажити згадки." + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "На кого ви не підписані" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "Хто не підписаний на вас" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "З новим обліковим записом" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "Хто небажано згадав вас" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "Хто обмежений модераторами сервера" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "Налаштування сповіщень" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "Нові сповіщення" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, one {Оголошення} few {Оголошення} other {Оголошень}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "Запити на підписку" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, one {# запит} few {# запити} other {# запитів}} на підписку" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "Відфільтровані сповіщення від {0, plural, one {# користувача} other {# користувачів}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "Лише згадки" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "Сьогодні" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "Ви наздогнали все." + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "Вчора" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "Не вдалося завантажити сповіщення" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "Налаштування сповіщень оновлено" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "Відфільтрувати сповіщення від користувачів:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "Фільтрувати" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "Ігнорувати" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "Оновлено <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "Переглянути сповіщення від <0>@{0}</0>" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "Сповіщення від <0>@{0}</0>" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "Відтепер сповіщення від @{0} не будуть відфільтровані." + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "Не вдалося прийняти запит на сповіщення" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "Дозволити" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "Відтепер сповіщення від @{0} не показуватимуться у відфільтрованих сповіщеннях." + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "Не вдалося відхилити запит на сповіщення" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "Відхилити" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "Відхилено" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "Локальна стрічка ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "Федеративна стрічка ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "Локальна стрічка" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "Федеративна стрічка" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "Ще ніхто нічого не опублікував." + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "Перемкнути на Федеративну" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "Перемкнути на Локальну" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "Пошук: {q} (Дописи)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "Пошук: {q} (Облікові записи)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "Пошук: {q} (Хештеґи)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "Пошук: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "Хештеґи" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "Показати більше" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "Переглянути більше облікових записів" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "Жодного облікового запису не знайдено." + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "Переглянути більше хештеґів" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "Хештеґи не знайдено." + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "Показати більше повідомлень" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "Жодного допису не знайдено." + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "Введіть пошуковий запит або вставте посилання вище, щоб розпочати." + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "Налаштування" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "Тема" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "Світла" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "Темна" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "Автоматична" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "Розмір тексту" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "А" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "Мова інтерфейсу" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "Допомогти з перекладом" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "Публікація" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "Видимість допису за замовчуванням" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "Синхронізовано" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "Не вдалося оновити видимість дописів" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "Синхронізовано з налаштуваннями на вашому інстансі.<0> Перейдіть на сайт вашого інстансу ({instance}) для детальних налаштувань.</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "Експериментальні опції" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "Автоматично оновлювати дописи стрічки" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "Карусель поширень" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "Переклад допису" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "Перекласти на" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "Мова системи ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {Приховати кнопку \"Перекласти\" для:} other {Приховати кнопку \"Перекласти\" для (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "Примітка: Ця функція використовує сервіси зовнішніх перекладів, що працюють на <0>Lingva API</0> & <1>Lingva Translate</1>." + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "Автоматичний вбудований переклад" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "Автоматично показувати переклад постів в стрічці. Працює лише для <0>коротких</0> дописів без чутливого контенту, медіа та опитування." + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "Пошук GIF в редакторі" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "Примітка: Ця функція використовує зовнішній сервіс пошуку GIF від <0>GIPHY</0>. G-рейтинг (підходить для перегляду будь-якому віку), параметри відстеження та інформація про джерело будуть прибрані, але пошукові запити та дані IP-адреси все одно будуть передаватися на їхній сервер." + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "Генератор опису зображення" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "Лише для нових зображень при створенні нових дописів." + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "Примітка: Ця функціональність використовує зовнішній сервіс AI, що базується на <0>img-alt-api</0>. Може не працювати добре. Тільки для зображень та англійською мовою." + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "Згруповані сервером сповіщення" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "Функціональність на етапі альфи. Потенційно покращене групування вікон, але базова логіка групування." + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "\"Хмарний\" імпорт/експорт для налаштувань ярликів" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ Занадто експериментально.<0/>Зберігається в нотатках вашого профілю. (Приватні) нотатки профілю зазвичай використовуються для інших профілів і приховані для власного профілю." + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "Примітка: Ця функціональність використовує API поточно-авторизованого сервера інстансу." + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "Режим маскування <0>(<1>Текст</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "Замінює текст блоками. Корисно при створенні скриншотів (з міркувань конфіденційності)." + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "Про застосунок" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "<0>Створено</0> <1>@cheeaun</1>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "Спонсорувати" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "Підтримати" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "Політика конфіденційності" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>Адреса клієнта:</0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0>Версія:</0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "Версію скопійовано" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "Не вдалося скопіювати версію" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "Не вдалося оновити підписку. Будь ласка, спробуйте ще раз." + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "Не вдалося скасувати підписку. Будь ласка, спробуйте ще раз." + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "Push-сповіщення (бета)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "Push-сповіщення заблоковані. Будь ласка, увімкніть їх у налаштуваннях свого браузеру." + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "Дозволити від <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "будь-кого" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "моїх підписок" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "підписників" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "Підписки" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "Опитування" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "Редагування дописів" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "Дозвіл на push-сповіщення не було надано з моменту останнього входу. Вам потрібно <0><1>увійти в систему</1> знову, щоб надати дозвіл." + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "ПРИМІТКА: Push-сповіщення працюють лише для <0>одного облікового запису</0>." + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "Допис" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "Ви не увійшли в систему. Взаємодія (відповідь, поширення тощо) неможлива." + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "Цей допис з іншого інстансу (<0>{instance}</0>). Взаємодія (відповідь, поширення тощо) неможлива." + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "Помилка: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "Перемкнутися на мій інстанс задля взаємодії" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "Не вдалося завантажити відповіді." + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "Назад" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "Перейти до головного запису" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "{0} дописів вище ‒ Перейти вгору" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "Перемкнутися на вигляд з Боковою Панеллю" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "Перемкнутися на Повний вигляд" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "Показати весь чутливий вміст" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "Експериментальне" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "Не вдалося перемкнутися" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "Перемкнутися на інстанс допису ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "Перемкнутися на інстанс допису" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "Не вдалося завантажити дописи" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, one {# відповідь} few {<0>{1}</0> відповіді} other {<0>{1}</0> відповідей}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, one {# коментар} few {<0>{0}</0> коментарі} other {<0>{0}</0> коментарів}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "Переглянути допис і відповіді на нього" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "Популярне ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "Популярні Новини" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "Від {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "Назад до популярних дописів" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "Показ дописів зі згадкою <0>{0}</0>" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "Популярні дописи" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "Немає популярних дописів." + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "Мінімалістичний вдумливий клієнт для багатьох платформ Федиверсу." + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "Увійти через Федиверс" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "Зареєструватися" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "Під'єднайте ваш обліковий запис Федиверсу (Mastodon, Pleroma тощо).<0/>Ваші облікові дані не зберігаються на цьому сервері." + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "<0>Створений</0> <1>@cheeaun</1>. <2>Політика Конфіденційності</2>." + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "Скриншот Каруселі Поширень" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "Карусель Поширень" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "Візуально розділяє оригінальні та повторно поширені дописи." + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "Скриншот вкладених коментарів нитки" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "Вкладені коментарі нитки" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "Легке відстежування бесід. Відповіді, що напів згортаються." + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "Скриншот згрупованих сповіщень" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "Згруповані сповіщення" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "Подібні сповіщення групуються і згортаються, щоб зменшити захаращення." + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "Скриншот інтерфейсу з кількома стовпцями" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "Один або декілька стовпців" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "За замовченням, один стовпець - для шукачів сконцентрованого перегляду. Декілька стовпців - для просунутих користувачів." + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "Скриншот стрічки з кількома хештеґами з формою для додавання хештеґів" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "Стрічка з кількома хештеґами" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "До 5 хештеґів, об'єднаних в одну стрічку" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "Схоже, ваш браузер блокує вікна, що спливають." + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "Чернетка допису наразі мінімізована. Опублікуйте або видаліть його перед створенням нового." + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "Допис наразі відкрито. Опублікуйте або видаліть його перед створенням нового." + diff --git a/src/locales/zh-CN.po b/src/locales/zh-CN.po new file mode 100644 index 00000000..d1c942d7 --- /dev/null +++ b/src/locales/zh-CN.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: zh\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Chinese Simplified\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: zh-CN\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "已锁嘟" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "嘟文: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "上次发嘟: {0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "机器人" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "群组" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "互相关注" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "已请求" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "正在关注" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "关注了你" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, other {# 粉丝}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "已认证" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "加入于 <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "永久" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "无法加载账户。" + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "转到账户页" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "粉丝" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "关注" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "嘟文" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "更多" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> 已声明 Ta 现在的新账户是:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "已复制用户名" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "无法复制用户名" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "复制用户名" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "转到原始账户页" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "查看头像" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "查看横幅图片" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "悼念账户" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "该用户选择不提供此信息。" + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} 为原创嘟文,{1} 为回复,{2} 为转嘟" + +#: 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, other {{3, plural, other {最近 {6} 天发了 {5} 条嘟文}}}}" + +#: 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, other {近几年的 {1} 条嘟文}}" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "原创" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "回复" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "转嘟" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "嘟文统计不可用" + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "查看嘟文统计" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "上次发嘟: <0>{0}</0>" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "已静音" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "已屏蔽" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "私人备注" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "提及 <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "翻译简介" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "编辑私人备注" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "添加私人备注" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "已启用 @{username} 的嘟文通知。" + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "已停用 @{username} 的发嘟通知。" + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "停用通知" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "启用通知" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "将显示 @{username} 的转嘟。" + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "将不再显示 @{username} 的转嘟。" + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "不显示转嘟" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "显示转嘟" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "加入/移出列表" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "已复制链接" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "无法复制链接" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "复制" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "分享似乎无法正常工作。" + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "分享…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "已取消静音 @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "取消静音 <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "静音 <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "已静音 @{username} {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "无法静音 @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "是否将 <0>@{username}</0> 从粉丝中移除?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "@{username} 已被从粉丝中移除" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "移除粉丝…" + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "是否屏蔽 <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "已解除屏蔽 @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "已屏蔽 @{username}" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "无法解除屏蔽 @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "无法屏蔽 @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "取消屏蔽 <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "屏蔽 <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "举报 <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "编辑个人资料" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "是否撤回关注请求?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "是否取关 @{0} ?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "取关…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "撤回…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "关注" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "关闭" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "简介(已翻译)" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "无法从列表中移除。" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "无法添加到列表。" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "无法加载列表。" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "暂无列表。" + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "新建列表" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "对 <0>@{0}</0> 的私人备注" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "无法更新私人备注。" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "取消" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "保存并关闭" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "无法更新个人资料。" + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "名称" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "简介" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "附加信息" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "名称" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "内容" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "保存" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "用户名" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "实例域名" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "已停用文字打码模式" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "已启用文字打码模式" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "主页" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "发嘟" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "添加媒体" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "添加自定义表情" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "添加GIF" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "发起投票" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "你有尚未保存的更改。是否丢弃这条嘟文?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "{0, plural, other {文件 {2} 的类型不受支持。}}" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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, other {你最多可以添加 # 个附件。}}" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "弹出" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "最小化" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "你似乎关闭了上级窗口。" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "你似乎已在上级窗口打开了一个撰写框并正在发布内容。请等待其完成后再试。" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "你似乎已在上级窗口中打开了一个撰写框。如果在此窗口中新建撰写框,你在上级窗口中所做的更改将丢失。是否继续?" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "弹回" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "正在回复 @{0} 的嘟文 (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "正在回复 @{0} 的嘟文" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "编辑原嘟" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "投票必须至少包含 2 个选项" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "某些投票项为空" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "某些媒体附件没有描述文本。是否继续?" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "附加附件 #{i} 失败" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "内容警告" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "内容警告或敏感媒体" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "公开" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "本站" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "不列出" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "仅粉丝" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "私信" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "发送回复" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "编辑嘟文" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "在做什么呢?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "将媒体标记为敏感" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "添加" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "回复" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "更新" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "发布" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "正在下载 GIF…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "GIF 下载失败" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "更多…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "已上传" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "图片描述" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "视频描述" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "音频描述" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "文件大小过大。上传将有可能出现问题。可尝试将文件大小从 {0} 压缩至 {1} 或更小。" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "文件尺寸过大。上传将有可能出现问题。可尝试将尺寸从 {0}×{1}px 裁剪至 {2}×{3}px。" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "帧率过高。上传将有可能出现问题。" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "移除" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "错误" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "编辑图片描述" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "编辑视频描述" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "编辑音频描述" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "正在生成描述。请稍候…" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "描述生成失败: {0}" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "描述生成失败" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "生成描述…" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "描述生成失败{0}" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "({0}) <0>— 实验性功能</0>" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "已完成" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "选项 {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "多选" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "时长" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "删除投票" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "搜索账户" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "加载账户时出错" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "自定义表情" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "搜索表情" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "加载自定义表情时出错" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "最近使用" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "其它" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "更多 {0} 个…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "搜索 GIF" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "由 GIPHY 驱动" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "输入以搜索 GIF" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "上一页" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "下一页" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "加载 GIF 时出错" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "未发送的草稿" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "你似乎有未发送的草稿。让我们从你上次离开的地方继续。" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "是否删除该草稿?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "删除草稿时出错!请重试。" + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "删除…" + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "获取回复的上级嘟文时出错!" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "是否删除全部草稿?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "删除草稿时出错!请重试。" + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "删除全部…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "暂无草稿。" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "投票" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "媒体" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "在新窗口打开" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "接受" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "拒绝" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "已接受" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "已拒绝" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "暂无内容" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "账号" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "显示更多…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "到底了。" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "快捷键" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "快捷键帮助" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "下一条嘟文" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "上一条嘟文" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "跳转到下一条嘟文" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "<0>Shift</0> + <1>j</1>" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "跳转到上一条嘟文" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "<0>Shift</0> + <1>k</1>" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "加载新嘟文" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "打开嘟文详情页" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "<0>Enter</0> 或 <1>o</1>" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "展开内容警告或<0/>展开/折叠嘟文串" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "关闭嘟文或对话" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "<0>Esc</0> 或 <1>Backspace</1>" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "在多栏模式中选中对应栏" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "<0>1</0> 到 <1>9</1>" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "在多栏模式中选中下一栏" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "在多栏模式中选中上一栏" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "撰写新嘟文" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "撰写新嘟文(新窗口)" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "<0>Shift</0> + <1>c</1>" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "发送嘟文" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "<0>Ctrl</0> + <1>Enter</1> 或 <2>⌘</2> + <3>Enter</3>" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "搜索" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "回复(新窗口)" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "<0>Shift</0> + <1>r</1>" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "喜欢(点赞)" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "<0>l</0> 或 <1>f</1>" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "转嘟" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "<0>Shift</0> + <1>b</1>" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "收藏" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "切换文字打码模式" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "<0>Shift</0> + <1>Alt</1> + <2>k</2>" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "编辑列表" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "无法编辑列表。" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "无法创建列表。" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "显示对列表成员的回复" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "显示对我关注的人的回复" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "不显示回复" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "将此列表下的嘟文从主页/关注时间线隐藏" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "创建" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "是否删除该列表?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "无法删除列表。" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "媒体描述" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "翻译" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "朗读" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "在新窗口中打开原始媒体" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "打开原始媒体" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "正在尝试描述图像。请稍候…" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "描述图像失败" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "描述图像" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "查看嘟文" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "敏感媒体" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "已过滤: {filterTitleStr}" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "已过滤" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "嘟文已发布。点击查看。" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "回复已发送。点击查看。" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "嘟文已更新。点击查看。" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "菜单" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "是否现在刷新页面以更新?" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "有更新可用…" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "关注" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "补看" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "提及" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "通知" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "新" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "个人资料" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "收藏夹" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "点赞列表" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "关注的话题标签" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "过滤规则" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "已静音的用户" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "已静音的用户…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "已屏蔽的用户" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "已屏蔽的用户…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "账号…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "登录" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "热门" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "跨站" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "快捷方式 / 栏…" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "设置…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "列表" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "全部列表" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "通知" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "此通知来自你的其他账号。" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "查看所有通知" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "{account} 对你的嘟文进行了 {emojiObject} 的回应" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "{account} 发布了一条嘟文。" + +#: src/components/notification.jsx:85 +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}转嘟了你的回复。} other {{account} 转嘟了你的嘟文。}}} other {{account} 转嘟了你的 {postsCount} 条嘟文}}} other {{postType, select, reply {<0><1>{0}</1> 人</0> 转嘟了你的回复。} other {<2><3>{1}</3> 人</2> 转嘟了你的嘟文。}}}}" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "{count, plural, =1 {{account} 关注了你。} other {<0><1>{0}</1> 人</0> 关注了你。}}" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "{account} 请求关注你。" + +#: src/components/notification.jsx:151 +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} 点赞了你的回复。} other {{account} 点赞了你的嘟文。}}} other {{account} 点赞了你的 {postsCount} 条嘟文}}} other {{postType, select, reply {<0><1>{0}</1> 人</0> 点赞了你的回复。} other {<2><3>{1}</3> 人</2> 点赞了你的嘟文。}}}}" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "你参与或创建的投票已结束。" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "你创建的投票已结束。" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "你参与的投票已结束。" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "你互动过的嘟文已被编辑。" + +#: src/components/notification.jsx:204 +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} 转嘟和点赞了你的回复。} other {{account} 转嘟和点赞了你的嘟文。}}} other {{account} 转嘟和点赞了你的 {postsCount} 条嘟文。}}} other {{postType, select, reply {<0><1>{0}</1> 人</0> 转嘟和点赞了你的回复。} other {<2><3>{1}</3> 人</2> 转嘟和点赞了你的嘟文。}}}}" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "{account} 已注册。" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "{account} 举报了 {targetAccount}" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "失去了与 <0>{name}</0> 的联系。" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "管理警告" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "<0>{from}</0> 的一位管理员封禁了 <1>{targetName}</1> 的账户,你不再能接收其更新或与之互动。" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "一名来自<0>{from}</0>的管理员已屏蔽<1>{targetName}</1>。受影响的粉丝数:{followersCount},关注数:{followingCount}。" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "你已屏蔽<0>{targetName}</0>。被移除的粉丝数:{followersCount},关注数:{followingCount}。" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "你的账号收到了一次管理警告。" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "你的账号已被禁用。" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "你的某些嘟文已被标记为敏感内容。" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "你的某些嘟文已被删除。" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "今后你的嘟文将被标记为敏感内容。" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "你的账户已被限制。" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "你的账户已被封禁。" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "[未知通知类型:{type}]" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "查看转嘟/点赞…" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "查看点赞…" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "查看转嘟…" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "被关注…" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "了解更多 <0/>" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "阅读更多 →" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "已投票" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "{optionVotesCount, plural, other {# 票}}" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "隐藏结果" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "投票" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "刷新" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "显示结果" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "{votesCount, plural, other {<1>{1}</1> 票}}" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "{votersCount, plural, other {<1>{1}</1> 人投票}}" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "结束于 <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "已结束" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "<0/>后结束" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "即将结束" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0} 秒" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0} 分钟" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0} 小时" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "骚扰信息" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "恶意链接、虚假互动或重复回复" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "违法" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "违反你或你的实例所在国的法律" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "违反实例规则" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "违反特定的实例规则" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "违规" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "其它" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "问题不适合其它的类别" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "举报嘟文" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "举报 @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "等待审核" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "已举报该嘟文" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "已举报该账户" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "无法举报该嘟文" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "无法举报该账户" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "这条嘟文有什么问题?" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "这个账户有什么问题?" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "附加信息" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "转发到 <0>{domain}</0>" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "发送举报" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "已静音 {username}" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "无法静音 {username}" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "发送举报 <0>+ 静音账户</0>" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "已屏蔽 {username}" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "无法屏蔽 {username}" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "发送举报 <0>并屏蔽账户</0>" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "{query} <0>- 账户、话题标签与嘟文</0>" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "包含 <0>{query}</0> 的嘟文" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "带有 <0>#{0}</0> 话题标签的嘟文" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "查找 <0>{query}</0>" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "包含 <0>{query}</0> 的账户" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "主页 / 关注" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "公共 (本站 / 跨站)" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "账户" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "话题标签" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "列表ID" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "仅限本站" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "实例" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "可选,如 mastodon.social" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "搜索关键词" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "可选,除非为多栏模式" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "例如:像素艺术 (最多 5 个,用空格分隔)" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "仅媒体" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "快捷方式" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "beta" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "指定一组快捷方式,显示样式为:" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "悬浮按钮" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "标签/菜单栏" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "多栏" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "在当前视图模式下不可用" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "向上移动" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "向下移动" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "编辑" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "需要添加一个以上快捷方式/栏以使其正常工作。" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "尚未添加任何栏。点击以添加栏。" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "尚未添加任何快捷方式。点击以添加快捷方式。" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "不确定要添加哪些?<0/>可以先尝试添加<1>主页 / 关注和通知</1>。" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "最多 {SHORTCUTS_LIMIT} 栏" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "最多 {SHORTCUTS_LIMIT} 个快捷方式" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "导入/导出" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "添加栏…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "添加快捷方式…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "特定的某个列表是可选的。但在多栏模式下,必须添加列表,否则对应的栏将不会显示。" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "在多栏模式下,搜索关键词是必须的,否则对应的栏将不会显示。" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "支持添加多个话题标签。以空格分隔。" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "编辑快捷方式" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "添加快捷方式" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "时间线" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "列表" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "导入/导出 <0>快捷方式</0>" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "导入" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "在此粘贴快捷方式配置" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "从实例服务器下载保存的快捷方式…" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "无法下载快捷方式" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "从实例服务器下载快捷方式" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "* 已存在于当前快捷方式中" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "如果列表来自不同的账户,则可能无法使用。" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "设置格式非法" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "是否追加到当前快捷方式?" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "只有不存在于当前快捷方式中的快捷方式才会被追加。" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "没有新的快捷方式可供导入" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "已导入快捷方式。但总数超出最大限制 {SHORTCUTS_LIMIT},因此超出的部分未被导入。" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "已导入快捷方式" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "导入并追加…" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "是否覆盖当前快捷方式配置?" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "是否导入快捷方式?" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "或覆盖…" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "导入…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "导出" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "已复制快捷方式" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "无法复制快捷方式" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "已复制快捷方式设置" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "无法复制快捷方式设置" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "分享" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "将快捷方式保存到实例服务器…" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "已保存快捷方式" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "无法保存快捷方式" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "同步到实例服务器" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "{0, plural, other {# 个字符}}" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "原始快捷方式 JSON" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "导入/导出配置到实例服务器(很不稳定)" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "<0/> <1>转嘟了</1>" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "抱歉,你当前登录的实例无法与该外站嘟文互动。" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "已取消点赞 @{0} 的嘟文" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "已点赞 @{0} 的嘟文" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "已取消收藏 @{0} 的嘟文" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "已收藏 @{0} 的嘟文" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "取消转嘟" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "引用" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "某些媒体附件没有描述文本。" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "旧嘟文 (<0>{0}</0>)" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "已取消转嘟 @{0} 的嘟文" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "已转嘟 @{0} 的嘟文" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "转嘟…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "取消喜欢" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "赞" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "取消收藏" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "查看 <0>@{0}</0> 的嘟文" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "显示编辑记录" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "编辑于: {editedDateText}" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "嵌入嘟文" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "已取消静音该对话" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "已静音该对话" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "无法取消静音该对话" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "无法静音该对话" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "取消静音对话" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "静音对话" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "已取消置顶该嘟文" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "已置顶该嘟文" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "无法取消置顶该嘟文" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "无法置顶该嘟文" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "取消置顶" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "置顶" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "是否删除此嘟文?" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "嘟文已删除" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "无法删除嘟文" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "举报嘟文…" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "已点赞" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "已转嘟" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "已收藏" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "已置顶" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "已删除" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "{repliesCount, plural, other {# 条回复}}" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "嘟文串{0}" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "折叠" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "显示内容" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "显示媒体" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "已编辑" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "评论" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "<0/> 的更多内容" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "编辑记录" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "无法加载编辑记录" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "正在加载…" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "HTML 代码" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "已复制 HTML 代码" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "无法复制 HTML 代码" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "媒体附件:" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "账户表情:" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "静态URL" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "表情:" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "注意:" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "此代码是静态代码,不包含样式和脚本。你可能需要进行编辑并按需应用自己的样式。" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "代码中的投票无法交互,将显示为一个带有投票数的列表。" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "媒体附件可以是图片、视频、音频或任何文件类型。" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "嘟文可以稍后编辑或删除。" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "预览" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "注意: 此预览带有少量额外的样式" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "<0/> <1/> 转嘟了" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "新嘟文" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "重试" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "{0, plural, other {# 转嘟}}" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "置顶嘟文" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "嘟文串" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "<0>已过滤</0>: <1>{0}</1>" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "已自动从 {sourceLangText} 翻译" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "正在翻译…" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "从 {sourceLangText} 翻译 (语言为自动检测)" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "从 {sourceLangText} 翻译" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "自动 ({0})" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "翻译失败" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "正在编辑原嘟" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "正在回复 @{0}" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "你现在可以关闭此页面。" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "关闭窗口" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "需要登录。" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "返回主页" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "该账户的嘟文" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "{accountDisplay} (+ 回复)" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "{accountDisplay} (- 转嘟)" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "{accountDisplay} (#{tagged})" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "{accountDisplay} (媒体)" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "{accountDisplay} ({monthYear})" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "清除过滤规则" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "清除" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "已展示回复" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "+ 回复" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "已隐藏转嘟" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "- 转嘟" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "已展示媒体" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "已展示带有 #{0} 话题标签的嘟文" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "已显示 {0} 中的嘟文" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "空空如也" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "无法加载嘟文" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "无法获取账户信息" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "切换到该账户所在实例 {0}" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "切换到我的实例 (<0>{currentInstance}</0>)" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "月" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "当前账号" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "默认" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "切换到此账户" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "在新标签页/窗口中切换" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "查看个人资料…" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "设为默认账号" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "是否退出 <0>@{0}</0>?" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "登出…" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "添加现有账号" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "注意: 首次加载时始终使用<0>默认</0>帐户。当前帐户被切换后将在会话期间保持有效。" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "尚无收藏。去收藏一些嘟文吧!" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "无法加载收藏夹。" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "最近 1 小时" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "最近 2 小时" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "最近 3 小时" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "最近 4 小时" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "最近 5 小时" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "最近 6 小时" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "最近 7 小时" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "最近 8 小时" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "最近 9 小时" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "最近 10 小时" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "最近 11 小时" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "最近 12 小时" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "12 小时之前" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "关注的话题标签" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "分组" + +#: 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 "已显示 {selectedFilterCategory, select, all {所有嘟文} original {原创嘟文} replies {回复} boosts {转嘟} followedTags {关注的话题标签} groups {群组} filtered {过滤后的嘟文}}, {sortBy, select, createdAt {{sortOrder, select, asc {最旧嘟文} desc {最新嘟文}}} reblogsCount {{sortOrder, select, asc {转嘟最少} desc {转嘟最多}}} favouritesCount {{sortOrder, select, asc {点赞最少} desc {点赞最多}}} repliesCount {{sortOrder, select, asc {回复最少} desc {回复最多}}} density {{sortOrder, select, asc {内容最少} desc {内容最多}}}} first{groupBy, select, account {, 按作者分组} other {}}" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "补看 <0>beta</0>" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "帮助" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "这是什么?" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "“补看”是你关注的内容的一个独立时间线,提供一种一目了然的高级视图,它拥有灵感来源于电子邮件的简洁界面,能够让你轻松对嘟文进行排序和筛选。" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "补看界面预览" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "让我们开始补看吧" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "让我们补看你所关注的人的嘟文。" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "选择要显示的嘟文的时间范围…" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "尽可能多" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "补看" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "与上次补看的时间范围重叠" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "直至上次补看 ({0})" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "注意: 无论时间范围如何,你的实例可能在主页时间线中最多只显示800条嘟文。这个值可能会更少或更多。" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "之前的补看…" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "{0, plural, other {# 条嘟文}}" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "是否删除这次补看?" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "正在移除补看 {0}" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "补看 {0} 已被移除" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "注意: 最多只存储 3 次。更早的补看将被自动删除。" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "正在获取嘟文…" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "这可能需要一段时间。" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "重置过滤规则" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "热门链接" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "由 {0} 分享" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "全部" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "{0, plural, other {# 名作者}}" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "排序" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "日期" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "内容" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "分组" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "作者" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "无" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "显示所有作者" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "你不必阅读所有内容。" + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "这就是全部内容。" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "返回顶部" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "你关注的人分享的链接,按分享次数、转嘟次数和点赞数排序。" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "排序: 内容" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "嘟文按信息密度或深度排序。较短的嘟文“更轻”,而较长的嘟文“更重”。带图嘟文比不带图的嘟文“更重”。" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "分组: 作者" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "嘟文按作者分组,按每位作者的嘟文数量排序。" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "下一位作者" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "上一位作者" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "返回顶部" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "已过滤: {0}" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "尚无点赞。去点赞一些嘟文吧!" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "无法加载点赞列表。" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "主页与列表" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "公共时间线" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "对话" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "账户" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "永不" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "新建过滤规则" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "{0, plural, other {# 条过滤规则}}" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "无法加载过滤规则。" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "尚无过滤规则。" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "添加过滤规则。" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "编辑过滤规则" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "无法编辑过滤规则" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "无法创建过滤规则" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "标题" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "整词匹配" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "尚无关键词。请添加一个。" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "添加关键词" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "{0, plural, other {# 个关键词}}" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "过滤范围…" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "* 此功能尚未实现" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "状态: <0><1/></0>" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "更改到期时间" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "到期时间" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "过滤后的嘟文将被…" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "最小化" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "隐藏" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "是否删除此过滤规则?" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "无法删除过滤规则。" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "已到期" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "将于 <0/> 到期" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "永不到期" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "{0, plural, other {# 个话题标签}}" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "无法加载已关注的话题标签。" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "尚无关注的话题标签。" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "这里空空如也。" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "无法加载嘟文." + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "{instance} 上的 {hashtagTitle} (仅查看媒体)" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "{instance} 上的 {hashtagTitle}" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "{hashtagTitle} (仅查看媒体)" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "{hashtagTitle}" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "尚无任何用户在此话题标签下发布内容。" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "无法加载此话题标签下的嘟文" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "是否取关 #{hashtag}?" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "已取消关注 #{hashtag}" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "已关注 #{hashtag}" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "正在关注…" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "已从个人页精选中移除" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "无法从个人页精选中移除" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "已加入个人页精选" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "加入个人页精选" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "{TOTAL_TAGS_LIMIT, plural, other {最多 # 个话题标签}}" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "添加话题标签" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "移除话题标签" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "{SHORTCUTS_LIMIT, plural, other {已达到最多 # 个快捷方式的限制。无法添加快捷方式。}}" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "此快捷方式已存在" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "已添加话题标签快捷方式" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "添加到快捷方式" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "输入一个新实例地址,例如 ”mastodon.social“" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "实例地址无效" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "转到其它实例…" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "转到我所在的实例 (<0>{currentInstance}</0>)" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "无法获取通知。" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "<0>新的</0> <1>关注请求</1>" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "查看全部" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "正在解析…" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "无法解析 URL" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "空空如也。" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "管理成员" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "是否从列表中移除 <0>@{0}</0>?" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "移除…" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "{0, plural, other {# 个列表}}" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "尚无列表。" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "注册应用失败" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "实例域名" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "例如:“mastodon.social”" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "登录失败。请重试或登录其它实例。" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "继续登录并使用 {selectedInstanceText}" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "继续" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "还没有账户?创建一个吧!" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "私信" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "私信" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "没有他人提到你的记录 :(" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "无法加载提及列表。" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "你没有关注的人" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "没有关注你的人" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "新注册的账户" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "不请自来地提及你的人" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "被实例管理员限制的人" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "通知设置" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "新通知" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "{0, plural, other {公告}}" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "关注请求" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "{0, plural, other {# 个关注请求}}" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "{0, plural, other {过滤了 # 人的通知}}" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "仅提及" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "今天" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "你已经全读完了。" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "昨天" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "无法加载通知" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "通知设置已更新" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "过滤来自这些人的通知:" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "过滤规则" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "忽略" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "更新于 <0>{0}</0>" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "查看来自 <0>@{0}</0> 的通知" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "来自 <0>@{0}</0> 的通知" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "现在起,将不在过滤来自 @{0} 的通知。" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "无法接受通知请求。" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "允许" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "现在起,将过滤来自 @{0} 的通知。" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "无法忽略通知请求" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "忽略" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "已忽略" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "本站时间线 ({instance})" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "跨站时间线 ({instance})" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "本站时间线" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "跨站时间线" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "还没有人发布内容。" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "切换到跨站时间线" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "切换到本站时间线" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "搜索: {q} (嘟文)" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "搜索: {q} (账户)" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "搜索: {q} (话题标签)" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "搜索: {q}" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "话题标签" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "查看更多" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "查看更多账户" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "未找到账户。" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "查看更多话题标签" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "未找到话题标签。" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "查看更多嘟文" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "未找到嘟文。" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "输入你要搜索的关键词或粘贴一条 URL 以开始搜索。" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "设置" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "外观" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "浅色" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "深色" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "自动" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "文字大小" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "字" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "界面语言" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "贡献翻译" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "发嘟" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "默认可见性" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "已同步" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "更新默认可见性失败" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "已同步到你账号所在的实例服务端的设置。<0>前往你所在的实例 ({instance}) 查看更多设置。</0>" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "实验性功能" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "实时刷新时间线嘟文" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "转嘟轮播" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "嘟文翻译" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "翻译为" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "系统语言 ({systemTargetLanguageText})" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "{0, plural, =0 {对下列语言隐藏“翻译”按钮: } other {对下列语言隐藏“翻译”按钮 (#):}}" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "注意: 此功能使用外部翻译服务,由 <0>Lingva API</0> 和 <1>Lingva 翻译</1> 驱动。" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "自动翻译" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "自动显示时间线中的嘟文的翻译。仅适用于不含内容警告、媒体或投票的<0>短</0>嘟文。" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "为嘟文撰写框集成 GIF 选择器" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "注意: 此功能使用外部 GIF 搜索服务,由 <0>GIPHY</0> 驱动。该服务为 G 级(适合所有年龄浏览),请求已去除跟踪参数,并省略了 referrer 信息,但搜索关键词和 IP 地址信息仍会到达 GIPHY 的服务器。" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "图片描述文本生成器" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "仅适用于发布新嘟文时新插入的图片。" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "注意: 此功能使用外部人工智能服务,由 <0>img-alt-api</0> 驱动。可能效果不佳。仅适用于图像,描述文本内容为英文。" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "服务端通知分组" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "开发阶段特性。启用该功能可能会为通知窗口的分组带来改进,但分组逻辑较为简单。" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "“云”导入/导出快捷方式配置。" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "⚠️⚠️⚠️ 非常不稳定。<0/>配置存储于你对自己账户的备注中。账户的(私人)备注主要用于其他账户,对自己的账户是隐藏的。" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "注意: 此功能使用了当前登录实例的服务端 API。" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "文字打码模式 <0>(<1>文本</1> → <2>████</2>)</0>" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "将文字替换为块,在截图时保护隐私。" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "关于" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "由 <1>@cheeaun</1> <0>开发</0>" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "赞助者" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "赞助" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "隐私政策" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "<0>站点: </0> {0}" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "<0> 版本: </0> <1/> {0}" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "已复制版本号" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "无法复制版本号" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "订阅更新失败。请重试。" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "订阅删除失败。请重试。" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "通知推送 (beta)" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "通知推送已被阻止。请在你的浏览器设置中授予相关权限。" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "推送范围 <0>{0}</0>" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "任何人" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "我关注的人" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "粉丝" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "关注" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "投票" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "嘟文被编辑" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "本次登录未授予通知推送权限。你需要<0>再次<1>登录</1>以授予推送权限</0>。" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "注意: 只能推送 <0>一个账户</0> 的通知。" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "嘟文" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "你尚未登录。互动 ()" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "此嘟文加载自其它实例 (<0>{instance}</0>)。 无法进行互动 (回复、转嘟等)。" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "错误: {e}" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "切换到我所在的实例以进行互动" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "无法加载回复。" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "返回" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "跳转到主嘟文" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "还有 {0} 条上级嘟文 ‒ 转到顶部" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "切换至侧边预览视图" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "切换至完整视图" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "显示所有敏感内容" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "实验性功能" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "无法切换" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "切换到原嘟所属的实例 ({0})" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "切换到原嘟所属实例" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "无法加载嘟文" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "{0, plural, other {<0>{1}</0> 条回复}}" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "{totalComments, plural, other {<0>{0}</0> 条评论}}" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "查看嘟文及其回复" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "热门 ({instance})" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "热门新闻" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "作者 {0}" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "返回热门嘟文页" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "已显示提到 <0>{0}</0> 的嘟文" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "热门嘟文" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "没有热门嘟文。" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "简约、有特点的 Mastodon 网页客户端。" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "使用 Mastodon 登录" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "注册" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "连接你现有的 Mastodon/Fediverse 账户。<0/>你的凭据不会在此客户端的服务器上存储。" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "由 <1>@cheeaun</1> <0>开发</0>。<2>隐私政策</2>。" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "转嘟轮播功能的效果图" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "转嘟轮播" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "在视觉上区分原创嘟文和被再次分享的嘟文 (转嘟)。" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "带嵌套评论的嘟文串的显示效果图" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "带嵌套评论的嘟文串" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "轻松跟踪对话。半可折叠式回复。" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "通知分组的效果图" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "通知分组" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "相似的通知被分组并折叠,以减少混乱度。" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "多栏界面的效果图" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "单栏或多栏" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "默认使用单栏视图,满足沉浸体验需求。为高级用户提供可配置的多栏视图。" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "多话题标签时间线的显示效果图,包含一个添加更多标签的配置表" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "多话题标签时间线" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "将最多 5 个话题标签合并为一个单独的时间线显示。" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "你的浏览器似乎阻止了弹出窗口。" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "当前已有被最小化的嘟文草稿。在创建新嘟文之前,请发布或丢弃它。" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "当前已打开一个嘟文撰写框。在创建新嘟文之前,请发布或丢弃它。" + diff --git a/src/locales/zh-TW.po b/src/locales/zh-TW.po new file mode 100644 index 00000000..149d60ce --- /dev/null +++ b/src/locales/zh-TW.po @@ -0,0 +1,3807 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-08-04 21:58+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: zh\n" +"Project-Id-Version: phanpy\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-12-03 18:15\n" +"Last-Translator: \n" +"Language-Team: Chinese Traditional\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: phanpy\n" +"X-Crowdin-Project-ID: 703337\n" +"X-Crowdin-Language: zh-TW\n" +"X-Crowdin-File: /main/src/locales/en.po\n" +"X-Crowdin-File-ID: 18\n" + +#: src/components/account-block.jsx:135 +msgid "Locked" +msgstr "已鎖定" + +#: src/components/account-block.jsx:141 +msgid "Posts: {0}" +msgstr "嘟文: {0}" + +#: src/components/account-block.jsx:146 +msgid "Last posted: {0}" +msgstr "最新嘟文:{0}" + +#: src/components/account-block.jsx:161 +#: src/components/account-info.jsx:636 +msgid "Automated" +msgstr "機器人" + +#: src/components/account-block.jsx:168 +#: src/components/account-info.jsx:641 +#: src/components/status.jsx:514 +msgid "Group" +msgstr "群組" + +#: src/components/account-block.jsx:178 +msgid "Mutual" +msgstr "互相關注" + +#: src/components/account-block.jsx:182 +#: src/components/account-info.jsx:1682 +msgid "Requested" +msgstr "已請求" + +#: src/components/account-block.jsx:186 +#: src/components/account-info.jsx:1673 +msgid "Following" +msgstr "跟隨" + +#: src/components/account-block.jsx:190 +#: src/components/account-info.jsx:1064 +msgid "Follows you" +msgstr "跟隨了你" + +#: src/components/account-block.jsx:198 +msgid "{followersCount, plural, one {# follower} other {# followers}}" +msgstr "{followersCount, plural, other {# 跟隨者}}" + +#: src/components/account-block.jsx:207 +#: src/components/account-info.jsx:682 +msgid "Verified" +msgstr "已驗證" + +#: src/components/account-block.jsx:222 +#: src/components/account-info.jsx:782 +msgid "Joined <0>{0}</0>" +msgstr "加入於 <0>{0}</0>" + +#: src/components/account-info.jsx:58 +msgid "Forever" +msgstr "永久" + +#: src/components/account-info.jsx:379 +msgid "Unable to load account." +msgstr "無法載入帳號" + +#: src/components/account-info.jsx:387 +msgid "Go to account page" +msgstr "前往帳號頁" + +#: src/components/account-info.jsx:415 +#: src/components/account-info.jsx:704 +#: src/components/account-info.jsx:734 +msgid "Followers" +msgstr "粉絲" + +#. js-lingui-explicit-id +#: src/components/account-info.jsx:418 +#: src/components/account-info.jsx:744 +#: src/components/account-info.jsx:761 +msgid "following.stats" +msgstr "" + +#: src/components/account-info.jsx:421 +#: src/components/account-info.jsx:778 +#: src/pages/account-statuses.jsx:484 +#: src/pages/search.jsx:327 +#: src/pages/search.jsx:474 +msgid "Posts" +msgstr "嘟文" + +#: src/components/account-info.jsx:429 +#: src/components/account-info.jsx:1120 +#: src/components/compose.jsx:2591 +#: src/components/media-alt-modal.jsx:45 +#: src/components/media-modal.jsx:357 +#: src/components/status.jsx:1737 +#: src/components/status.jsx:1754 +#: src/components/status.jsx:1878 +#: src/components/status.jsx:2490 +#: src/components/status.jsx:2493 +#: src/pages/account-statuses.jsx:528 +#: src/pages/accounts.jsx:109 +#: src/pages/hashtag.jsx:199 +#: src/pages/list.jsx:157 +#: src/pages/public.jsx:114 +#: src/pages/status.jsx:1212 +#: src/pages/trending.jsx:471 +msgid "More" +msgstr "更多" + +#: src/components/account-info.jsx:441 +msgid "<0>{displayName}</0> has indicated that their new account is now:" +msgstr "<0>{displayName}</0> 他們的新帳號現在是:" + +#: src/components/account-info.jsx:586 +#: src/components/account-info.jsx:1278 +msgid "Handle copied" +msgstr "已複製用戶名" + +#: src/components/account-info.jsx:589 +#: src/components/account-info.jsx:1281 +msgid "Unable to copy handle" +msgstr "無法複製用戶名" + +#: src/components/account-info.jsx:595 +#: src/components/account-info.jsx:1287 +msgid "Copy handle" +msgstr "複製用戶名" + +#: src/components/account-info.jsx:601 +msgid "Go to original profile page" +msgstr "前往原始帳號頁面" + +#: src/components/account-info.jsx:608 +msgid "View profile image" +msgstr "查看頭像" + +#: src/components/account-info.jsx:614 +msgid "View profile header" +msgstr "查看個人資料標題" + +#: src/components/account-info.jsx:631 +msgid "In Memoriam" +msgstr "紀念帳戶" + +#: src/components/account-info.jsx:711 +#: src/components/account-info.jsx:752 +msgid "This user has chosen to not make this information available." +msgstr "此用戶選擇不提供資訊。" + +#: src/components/account-info.jsx:807 +msgid "{0} original posts, {1} replies, {2} boosts" +msgstr "{0} 原創嘟文,{1} 回覆,{2} 轉嘟" + +#: 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, other {{3, plural, other {最近 {6} 天內的 {5} 條嘟文}}}}" + +#: 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 "" + +#: src/components/account-info.jsx:860 +#: src/pages/catchup.jsx:70 +msgid "Original" +msgstr "原文" + +#: src/components/account-info.jsx:864 +#: src/components/status.jsx:2268 +#: src/pages/catchup.jsx:71 +#: src/pages/catchup.jsx:1445 +#: src/pages/catchup.jsx:2056 +#: src/pages/status.jsx:935 +#: src/pages/status.jsx:1557 +msgid "Replies" +msgstr "回覆" + +#: src/components/account-info.jsx:868 +#: src/pages/catchup.jsx:72 +#: src/pages/catchup.jsx:1447 +#: src/pages/catchup.jsx:2068 +#: src/pages/settings.jsx:1153 +msgid "Boosts" +msgstr "轉嘟" + +#: src/components/account-info.jsx:874 +msgid "Post stats unavailable." +msgstr "" + +#: src/components/account-info.jsx:905 +msgid "View post stats" +msgstr "查看貼文統計" + +#: src/components/account-info.jsx:1068 +msgid "Last post: <0>{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:1082 +msgid "Muted" +msgstr "已靜音" + +#: src/components/account-info.jsx:1087 +msgid "Blocked" +msgstr "已封鎖" + +#: src/components/account-info.jsx:1096 +msgid "Private note" +msgstr "私人備註" + +#: src/components/account-info.jsx:1153 +msgid "Mention <0>@{username}</0>" +msgstr "提及 <0>@{username}</0>" + +#: src/components/account-info.jsx:1165 +msgid "Translate bio" +msgstr "翻譯簡介" + +#: src/components/account-info.jsx:1176 +msgid "Edit private note" +msgstr "編輯私人備註" + +#: src/components/account-info.jsx:1176 +msgid "Add private note" +msgstr "加上私人備註" + +#: src/components/account-info.jsx:1196 +msgid "Notifications enabled for @{username}'s posts." +msgstr "已開啟 @{username} 的貼文通知" + +#: src/components/account-info.jsx:1197 +msgid "Notifications disabled for @{username}'s posts." +msgstr "已關閉 @{username} 的貼文通知" + +#: src/components/account-info.jsx:1209 +msgid "Disable notifications" +msgstr "關閉通知" + +#: src/components/account-info.jsx:1210 +msgid "Enable notifications" +msgstr "開啟通知" + +#: src/components/account-info.jsx:1227 +msgid "Boosts from @{username} enabled." +msgstr "觀看 @{username} 的轉嘟" + +#: src/components/account-info.jsx:1228 +msgid "Boosts from @{username} disabled." +msgstr "取消觀看 @{username} 的轉嘟" + +#: src/components/account-info.jsx:1239 +msgid "Disable boosts" +msgstr "不閱覽轉嘟" + +#: src/components/account-info.jsx:1239 +msgid "Enable boosts" +msgstr "閱覽轉嘟" + +#: src/components/account-info.jsx:1255 +#: src/components/account-info.jsx:1265 +#: src/components/account-info.jsx:1866 +msgid "Add/Remove from Lists" +msgstr "從列表中新增/刪除" + +#: src/components/account-info.jsx:1304 +#: src/components/status.jsx:1177 +msgid "Link copied" +msgstr "連結已複製" + +#: src/components/account-info.jsx:1307 +#: src/components/status.jsx:1180 +msgid "Unable to copy link" +msgstr "無法複製連結" + +#: src/components/account-info.jsx:1313 +#: src/components/shortcuts-settings.jsx:1059 +#: src/components/status.jsx:1186 +#: src/components/status.jsx:3267 +msgid "Copy" +msgstr "複製" + +#: src/components/account-info.jsx:1328 +#: src/components/shortcuts-settings.jsx:1077 +#: src/components/status.jsx:1202 +msgid "Sharing doesn't seem to work." +msgstr "" + +#: src/components/account-info.jsx:1334 +#: src/components/status.jsx:1208 +msgid "Share…" +msgstr "分享…" + +#: src/components/account-info.jsx:1354 +msgid "Unmuted @{username}" +msgstr "取消靜音 @{username}" + +#: src/components/account-info.jsx:1366 +msgid "Unmute <0>@{username}</0>" +msgstr "取消靜音 <0>@{username}</0>" + +#: src/components/account-info.jsx:1382 +msgid "Mute <0>@{username}</0>…" +msgstr "靜音 <0>@{username}</0>…" + +#: src/components/account-info.jsx:1414 +msgid "Muted @{username} for {0}" +msgstr "已將 @{username} 靜音 {0}" + +#: src/components/account-info.jsx:1426 +msgid "Unable to mute @{username}" +msgstr "無法靜音 @{username}" + +#: src/components/account-info.jsx:1447 +msgid "Remove <0>@{username}</0> from followers?" +msgstr "要把 <0>@{username}</0> 從跟隨者中移除嗎?" + +#: src/components/account-info.jsx:1467 +msgid "@{username} removed from followers" +msgstr "已把 @{username} 從跟隨者中移除" + +#: src/components/account-info.jsx:1479 +msgid "Remove follower…" +msgstr "移除跟隨者..." + +#: src/components/account-info.jsx:1490 +msgid "Block <0>@{username}</0>?" +msgstr "封鎖 <0>@{username}</0>?" + +#: src/components/account-info.jsx:1514 +msgid "Unblocked @{username}" +msgstr "取消封鎖 @{username}" + +#: src/components/account-info.jsx:1522 +msgid "Blocked @{username}" +msgstr "已把 @{username} 封鎖" + +#: src/components/account-info.jsx:1530 +msgid "Unable to unblock @{username}" +msgstr "無法取消封鎖 @{username}" + +#: src/components/account-info.jsx:1532 +msgid "Unable to block @{username}" +msgstr "無法封鎖 @{username}" + +#: src/components/account-info.jsx:1542 +msgid "Unblock <0>@{username}</0>" +msgstr "取消封鎖 <0>@{username}</0>" + +#: src/components/account-info.jsx:1551 +msgid "Block <0>@{username}</0>…" +msgstr "封鎖 <0>@{username}</0>…" + +#: src/components/account-info.jsx:1568 +msgid "Report <0>@{username}</0>…" +msgstr "檢舉 <0>@{username}</0>…" + +#: src/components/account-info.jsx:1588 +#: src/components/account-info.jsx:2099 +msgid "Edit profile" +msgstr "編輯個人資料" + +#: src/components/account-info.jsx:1624 +msgid "Withdraw follow request?" +msgstr "收回跟隨請求?" + +#: src/components/account-info.jsx:1625 +msgid "Unfollow @{0}?" +msgstr "取消跟隨 @{0}?" + +#: src/components/account-info.jsx:1676 +msgid "Unfollow…" +msgstr "取消跟隨…" + +#: src/components/account-info.jsx:1685 +msgid "Withdraw…" +msgstr "丟棄…" + +#: src/components/account-info.jsx:1692 +#: src/components/account-info.jsx:1696 +#: src/pages/hashtag.jsx:261 +msgid "Follow" +msgstr "跟隨" + +#: src/components/account-info.jsx:1807 +#: src/components/account-info.jsx:1861 +#: src/components/account-info.jsx:1994 +#: src/components/account-info.jsx:2094 +#: src/components/account-sheet.jsx:37 +#: src/components/compose.jsx:859 +#: src/components/compose.jsx:2547 +#: src/components/compose.jsx:3020 +#: src/components/compose.jsx:3228 +#: src/components/compose.jsx:3458 +#: src/components/drafts.jsx:58 +#: src/components/embed-modal.jsx:12 +#: src/components/generic-accounts.jsx:142 +#: src/components/keyboard-shortcuts-help.jsx:39 +#: src/components/list-add-edit.jsx:35 +#: src/components/media-alt-modal.jsx:33 +#: src/components/media-modal.jsx:321 +#: src/components/notification-service.jsx:156 +#: src/components/report-modal.jsx:75 +#: src/components/shortcuts-settings.jsx:230 +#: src/components/shortcuts-settings.jsx:583 +#: src/components/shortcuts-settings.jsx:783 +#: src/components/status.jsx:2992 +#: src/components/status.jsx:3231 +#: src/components/status.jsx:3731 +#: src/pages/accounts.jsx:36 +#: src/pages/catchup.jsx:1581 +#: src/pages/filters.jsx:224 +#: src/pages/list.jsx:274 +#: src/pages/notifications.jsx:868 +#: src/pages/notifications.jsx:1082 +#: src/pages/settings.jsx:77 +#: src/pages/status.jsx:1299 +msgid "Close" +msgstr "關閉" + +#: src/components/account-info.jsx:1812 +msgid "Translated Bio" +msgstr "翻譯簡介" + +#: src/components/account-info.jsx:1906 +msgid "Unable to remove from list." +msgstr "無法從列表移除" + +#: src/components/account-info.jsx:1907 +msgid "Unable to add to list." +msgstr "無法新增到列表" + +#: src/components/account-info.jsx:1926 +#: src/pages/lists.jsx:104 +msgid "Unable to load lists." +msgstr "無法載入列表" + +#: src/components/account-info.jsx:1930 +msgid "No lists." +msgstr "" + +#: src/components/account-info.jsx:1941 +#: src/components/list-add-edit.jsx:39 +#: src/pages/lists.jsx:58 +msgid "New list" +msgstr "新增列表" + +#: src/components/account-info.jsx:1999 +msgid "Private note about <0>@{0}</0>" +msgstr "" + +#: src/components/account-info.jsx:2029 +msgid "Unable to update private note." +msgstr "" + +#: src/components/account-info.jsx:2052 +#: src/components/account-info.jsx:2222 +msgid "Cancel" +msgstr "取消" + +#: src/components/account-info.jsx:2057 +msgid "Save & close" +msgstr "儲存並關閉" + +#: src/components/account-info.jsx:2150 +msgid "Unable to update profile." +msgstr "無法更新個人資料" + +#: src/components/account-info.jsx:2157 +#: src/components/list-add-edit.jsx:104 +msgid "Name" +msgstr "名稱" + +#: src/components/account-info.jsx:2170 +msgid "Bio" +msgstr "簡介" + +#: src/components/account-info.jsx:2183 +msgid "Extra fields" +msgstr "額外欄位" + +#: src/components/account-info.jsx:2189 +msgid "Label" +msgstr "標籤" + +#: src/components/account-info.jsx:2192 +msgid "Content" +msgstr "內容" + +#: src/components/account-info.jsx:2225 +#: src/components/list-add-edit.jsx:149 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/filters.jsx:554 +#: src/pages/notifications.jsx:934 +msgid "Save" +msgstr "儲存" + +#: src/components/account-info.jsx:2279 +msgid "username" +msgstr "使用者名稱" + +#: src/components/account-info.jsx:2283 +msgid "server domain name" +msgstr "伺服器域名" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode disabled" +msgstr "" + +#: src/components/background-service.jsx:149 +msgid "Cloak mode enabled" +msgstr "" + +#: src/components/columns.jsx:26 +#: src/components/nav-menu.jsx:175 +#: src/components/shortcuts-settings.jsx:139 +#: src/components/timeline.jsx:437 +#: src/pages/catchup.jsx:876 +#: src/pages/filters.jsx:89 +#: src/pages/followed-hashtags.jsx:40 +#: src/pages/home.jsx:53 +#: src/pages/notifications.jsx:520 +msgid "Home" +msgstr "主頁" + +#: src/components/compose-button.jsx:49 +#: src/compose.jsx:37 +msgid "Compose" +msgstr "" + +#: src/components/compose.jsx:206 +msgid "Add media" +msgstr "" + +#: src/components/compose.jsx:207 +msgid "Add custom emoji" +msgstr "新增自訂表情符號" + +#: src/components/compose.jsx:208 +msgid "Add GIF" +msgstr "" + +#: src/components/compose.jsx:209 +msgid "Add poll" +msgstr "新增投票" + +#: src/components/compose.jsx:402 +msgid "You have unsaved changes. Discard this post?" +msgstr "您尚未儲存變更,是否丟棄這則貼文?" + +#: src/components/compose.jsx:630 +msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" +msgstr "" + +#: src/components/compose.jsx:640 +#: src/components/compose.jsx:658 +#: 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 "" + +#: src/components/compose.jsx:840 +msgid "Pop out" +msgstr "彈出" + +#: src/components/compose.jsx:847 +msgid "Minimize" +msgstr "最小化" + +#: src/components/compose.jsx:883 +msgid "Looks like you closed the parent window." +msgstr "" + +#: src/components/compose.jsx:890 +msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." +msgstr "" + +#: src/components/compose.jsx:895 +msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" +msgstr "" + +#: src/components/compose.jsx:937 +msgid "Pop in" +msgstr "" + +#: src/components/compose.jsx:947 +msgid "Replying to @{0}’s post (<0>{1}</0>)" +msgstr "正在回覆 @{0} 的文章 (<0>{1}</0>)" + +#: src/components/compose.jsx:957 +msgid "Replying to @{0}’s post" +msgstr "正在回覆 @{0} 的文章" + +#: src/components/compose.jsx:970 +msgid "Editing source post" +msgstr "" + +#: src/components/compose.jsx:1017 +msgid "Poll must have at least 2 options" +msgstr "投票必須至少含有兩個選項" + +#: src/components/compose.jsx:1021 +msgid "Some poll choices are empty" +msgstr "部份投票選項空白" + +#: src/components/compose.jsx:1034 +msgid "Some media have no descriptions. Continue?" +msgstr "" + +#: src/components/compose.jsx:1086 +msgid "Attachment #{i} failed" +msgstr "" + +#: src/components/compose.jsx:1180 +#: src/components/status.jsx:2063 +#: src/components/timeline.jsx:984 +msgid "Content warning" +msgstr "內容警告" + +#: src/components/compose.jsx:1196 +msgid "Content warning or sensitive media" +msgstr "" + +#: src/components/compose.jsx:1232 +#: src/components/status.jsx:93 +#: src/pages/settings.jsx:305 +msgid "Public" +msgstr "公開" + +#: src/components/compose.jsx:1237 +#: src/components/nav-menu.jsx:337 +#: src/components/shortcuts-settings.jsx:165 +#: src/components/status.jsx:94 +msgid "Local" +msgstr "本地" + +#: src/components/compose.jsx:1241 +#: src/components/status.jsx:95 +#: src/pages/settings.jsx:308 +msgid "Unlisted" +msgstr "不公開" + +#: src/components/compose.jsx:1244 +#: src/components/status.jsx:96 +#: src/pages/settings.jsx:311 +msgid "Followers only" +msgstr "僅限跟隨者" + +#: src/components/compose.jsx:1247 +#: src/components/status.jsx:97 +#: src/components/status.jsx:1941 +msgid "Private mention" +msgstr "私人訊息" + +#: src/components/compose.jsx:1256 +msgid "Post your reply" +msgstr "張貼你的回覆" + +#: src/components/compose.jsx:1258 +msgid "Edit your post" +msgstr "編輯您的貼文" + +#: src/components/compose.jsx:1259 +msgid "What are you doing?" +msgstr "你在做什麼?" + +#: src/components/compose.jsx:1337 +msgid "Mark media as sensitive" +msgstr "標記媒體為敏感內容" + +#: src/components/compose.jsx:1381 +#: src/components/compose.jsx:3078 +#: src/components/shortcuts-settings.jsx:715 +#: src/pages/list.jsx:359 +msgid "Add" +msgstr "新增" + +#: src/components/compose.jsx:1555 +#: src/components/keyboard-shortcuts-help.jsx:151 +#: src/components/status.jsx:929 +#: src/components/status.jsx:1717 +#: src/components/status.jsx:1718 +#: src/components/status.jsx:2386 +msgid "Reply" +msgstr "回覆" + +#: src/components/compose.jsx:1557 +msgid "Update" +msgstr "更新" + +#: src/components/compose.jsx:1558 +msgctxt "Submit button in composer" +msgid "Post" +msgstr "貼文" + +#: src/components/compose.jsx:1686 +msgid "Downloading GIF…" +msgstr "GIF下載中…" + +#: src/components/compose.jsx:1714 +msgid "Failed to download GIF" +msgstr "GIF 下載失敗" + +#: src/components/compose.jsx:1878 +#: src/components/compose.jsx:1955 +#: src/components/nav-menu.jsx:238 +msgid "More…" +msgstr "更多…" + +#: src/components/compose.jsx:2360 +msgid "Uploaded" +msgstr "已上傳" + +#: src/components/compose.jsx:2373 +msgid "Image description" +msgstr "圖片說明" + +#: src/components/compose.jsx:2374 +msgid "Video description" +msgstr "影片說明" + +#: src/components/compose.jsx:2375 +msgid "Audio description" +msgstr "" + +#: src/components/compose.jsx:2411 +#: src/components/compose.jsx:2431 +msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." +msgstr "檔案大小太大,上載可能會遇到問題。請嘗試把檔案大小從 {0} 縮小到 {1} 或更小" + +#: src/components/compose.jsx:2423 +#: src/components/compose.jsx:2443 +msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." +msgstr "" + +#: src/components/compose.jsx:2451 +msgid "Frame rate too high. Uploading might encounter issues." +msgstr "" + +#: src/components/compose.jsx:2511 +#: src/components/compose.jsx:2761 +#: src/components/shortcuts-settings.jsx:726 +#: src/pages/catchup.jsx:1074 +#: src/pages/filters.jsx:412 +msgid "Remove" +msgstr "刪除" + +#: src/components/compose.jsx:2528 +#: src/compose.jsx:83 +msgid "Error" +msgstr "錯誤" + +#: src/components/compose.jsx:2553 +msgid "Edit image description" +msgstr "編輯圖片說明" + +#: src/components/compose.jsx:2554 +msgid "Edit video description" +msgstr "編輯影像說明" + +#: src/components/compose.jsx:2555 +msgid "Edit audio description" +msgstr "" + +#: src/components/compose.jsx:2600 +#: src/components/compose.jsx:2649 +msgid "Generating description. Please wait…" +msgstr "" + +#: src/components/compose.jsx:2620 +msgid "Failed to generate description: {0}" +msgstr "" + +#: src/components/compose.jsx:2621 +msgid "Failed to generate description" +msgstr "" + +#: src/components/compose.jsx:2633 +#: src/components/compose.jsx:2639 +#: src/components/compose.jsx:2685 +msgid "Generate description…" +msgstr "" + +#: src/components/compose.jsx:2672 +msgid "Failed to generate description{0}" +msgstr "" + +#: src/components/compose.jsx:2687 +msgid "({0}) <0>— experimental</0>" +msgstr "" + +#: src/components/compose.jsx:2706 +msgid "Done" +msgstr "完成" + +#: src/components/compose.jsx:2742 +msgid "Choice {0}" +msgstr "選擇 {0}" + +#: src/components/compose.jsx:2789 +msgid "Multiple choices" +msgstr "多種選擇" + +#: src/components/compose.jsx:2792 +msgid "Duration" +msgstr "持續時間" + +#: src/components/compose.jsx:2823 +msgid "Remove poll" +msgstr "移除投票" + +#: src/components/compose.jsx:3037 +msgid "Search accounts" +msgstr "搜索帳號" + +#: src/components/compose.jsx:3091 +#: src/components/generic-accounts.jsx:227 +msgid "Error loading accounts" +msgstr "載入帳戶時發生錯誤" + +#: src/components/compose.jsx:3234 +msgid "Custom emojis" +msgstr "自訂 emoji 表情符號" + +#: src/components/compose.jsx:3254 +msgid "Search emoji" +msgstr "搜尋表情符號" + +#: src/components/compose.jsx:3285 +msgid "Error loading custom emojis" +msgstr "" + +#: src/components/compose.jsx:3296 +msgid "Recently used" +msgstr "最近使用" + +#: src/components/compose.jsx:3297 +msgid "Others" +msgstr "其他" + +#: src/components/compose.jsx:3335 +msgid "{0} more…" +msgstr "{0} 更多…" + +#: src/components/compose.jsx:3473 +msgid "Search GIFs" +msgstr "搜尋 GIF" + +#: src/components/compose.jsx:3488 +msgid "Powered by GIPHY" +msgstr "由 GIPHY 提供" + +#: src/components/compose.jsx:3496 +msgid "Type to search GIFs" +msgstr "" + +#: src/components/compose.jsx:3594 +#: src/components/media-modal.jsx:461 +#: src/components/timeline.jsx:889 +msgid "Previous" +msgstr "上一個" + +#: src/components/compose.jsx:3612 +#: src/components/media-modal.jsx:480 +#: src/components/timeline.jsx:906 +msgid "Next" +msgstr "下一個" + +#: src/components/compose.jsx:3629 +msgid "Error loading GIFs" +msgstr "" + +#: src/components/drafts.jsx:63 +#: src/pages/settings.jsx:692 +msgid "Unsent drafts" +msgstr "" + +#: src/components/drafts.jsx:68 +msgid "Looks like you have unsent drafts. Let's continue where you left off." +msgstr "" + +#: src/components/drafts.jsx:102 +msgid "Delete this draft?" +msgstr "是否刪除此草稿?" + +#: src/components/drafts.jsx:117 +msgid "Error deleting draft! Please try again." +msgstr "" + +#: src/components/drafts.jsx:127 +#: src/components/list-add-edit.jsx:185 +#: src/components/status.jsx:1352 +#: src/pages/filters.jsx:587 +msgid "Delete…" +msgstr "移除..." + +#: src/components/drafts.jsx:146 +msgid "Error fetching reply-to status!" +msgstr "" + +#: src/components/drafts.jsx:171 +msgid "Delete all drafts?" +msgstr "刪除所有草稿?" + +#: src/components/drafts.jsx:189 +msgid "Error deleting drafts! Please try again." +msgstr "" + +#: src/components/drafts.jsx:201 +msgid "Delete all…" +msgstr "刪除所有…" + +#: src/components/drafts.jsx:209 +msgid "No drafts found." +msgstr "找不到草稿" + +#: src/components/drafts.jsx:245 +#: src/pages/catchup.jsx:1928 +msgid "Poll" +msgstr "投票" + +#: src/components/drafts.jsx:248 +#: src/pages/account-statuses.jsx:365 +msgid "Media" +msgstr "媒體" + +#: src/components/embed-modal.jsx:22 +msgid "Open in new window" +msgstr "在新視窗中開啟" + +#: src/components/follow-request-buttons.jsx:42 +#: src/pages/notifications.jsx:918 +msgid "Accept" +msgstr "同意" + +#: src/components/follow-request-buttons.jsx:68 +msgid "Reject" +msgstr "拒絕" + +#: src/components/follow-request-buttons.jsx:75 +#: src/pages/notifications.jsx:1201 +msgid "Accepted" +msgstr "已同意" + +#: src/components/follow-request-buttons.jsx:79 +msgid "Rejected" +msgstr "已拒絕" + +#: src/components/generic-accounts.jsx:24 +msgid "Nothing to show" +msgstr "沒有可顯示的內容" + +#: src/components/generic-accounts.jsx:145 +#: src/components/notification.jsx:446 +#: src/pages/accounts.jsx:41 +#: src/pages/search.jsx:317 +#: src/pages/search.jsx:350 +msgid "Accounts" +msgstr "帳號" + +#: src/components/generic-accounts.jsx:205 +#: src/components/timeline.jsx:519 +#: src/pages/list.jsx:293 +#: src/pages/notifications.jsx:848 +#: src/pages/search.jsx:544 +#: src/pages/status.jsx:1332 +msgid "Show more…" +msgstr "顯示更多…" + +#: src/components/generic-accounts.jsx:210 +#: src/components/timeline.jsx:524 +#: src/pages/search.jsx:549 +msgid "The end." +msgstr "結尾" + +#: src/components/keyboard-shortcuts-help.jsx:43 +#: src/components/nav-menu.jsx:356 +#: src/pages/catchup.jsx:1619 +msgid "Keyboard shortcuts" +msgstr "鍵盤快捷鍵" + +#: src/components/keyboard-shortcuts-help.jsx:51 +msgid "Keyboard shortcuts help" +msgstr "鍵盤快速鍵提示" + +#: src/components/keyboard-shortcuts-help.jsx:55 +#: src/pages/catchup.jsx:1644 +msgid "Next post" +msgstr "下一則貼文" + +#: src/components/keyboard-shortcuts-help.jsx:59 +#: src/pages/catchup.jsx:1652 +msgid "Previous post" +msgstr "上一則貼文" + +#: src/components/keyboard-shortcuts-help.jsx:63 +msgid "Skip carousel to next post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:65 +msgid "<0>Shift</0> + <1>j</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:71 +msgid "Skip carousel to previous post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:73 +msgid "<0>Shift</0> + <1>k</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:79 +msgid "Load new posts" +msgstr "載入新的貼文" + +#: src/components/keyboard-shortcuts-help.jsx:83 +#: src/pages/catchup.jsx:1676 +msgid "Open post details" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:85 +msgid "<0>Enter</0> or <1>o</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:92 +msgid "Expand content warning or<0/>toggle expanded/collapsed thread" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:101 +msgid "Close post or dialogs" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:103 +msgid "<0>Esc</0> or <1>Backspace</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:109 +msgid "Focus column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:111 +msgid "<0>1</0> to <1>9</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:117 +msgid "Focus next column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:121 +msgid "Focus previous column in multi-column mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:125 +msgid "Compose new post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:129 +msgid "Compose new post (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:132 +msgid "<0>Shift</0> + <1>c</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:138 +msgid "Send post" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:140 +msgid "<0>Ctrl</0> + <1>Enter</1> or <2>⌘</2> + <3>Enter</3>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:147 +#: src/components/nav-menu.jsx:325 +#: src/components/search-form.jsx:72 +#: src/components/shortcuts-settings.jsx:52 +#: src/components/shortcuts-settings.jsx:179 +#: src/pages/search.jsx:45 +#: src/pages/search.jsx:299 +msgid "Search" +msgstr "搜尋" + +#: src/components/keyboard-shortcuts-help.jsx:155 +msgid "Reply (new window)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:158 +msgid "<0>Shift</0> + <1>r</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:164 +msgid "Like (favourite)" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:166 +msgid "<0>l</0> or <1>f</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:172 +#: src/components/status.jsx:937 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +#: src/components/status.jsx:2445 +msgid "Boost" +msgstr "轉發" + +#: src/components/keyboard-shortcuts-help.jsx:174 +msgid "<0>Shift</0> + <1>b</1>" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:180 +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +#: src/components/status.jsx:2470 +msgid "Bookmark" +msgstr "書籤" + +#: src/components/keyboard-shortcuts-help.jsx:184 +msgid "Toggle Cloak mode" +msgstr "" + +#: src/components/keyboard-shortcuts-help.jsx:186 +msgid "<0>Shift</0> + <1>Alt</1> + <2>k</2>" +msgstr "" + +#: src/components/list-add-edit.jsx:39 +msgid "Edit list" +msgstr "編輯列表" + +#: src/components/list-add-edit.jsx:95 +msgid "Unable to edit list." +msgstr "無法編輯列表" + +#: src/components/list-add-edit.jsx:96 +msgid "Unable to create list." +msgstr "無法建立列表" + +#: src/components/list-add-edit.jsx:124 +msgid "Show replies to list members" +msgstr "" + +#: src/components/list-add-edit.jsx:127 +msgid "Show replies to people I follow" +msgstr "" + +#: src/components/list-add-edit.jsx:130 +msgid "Don't show replies" +msgstr "" + +#: src/components/list-add-edit.jsx:143 +msgid "Hide posts on this list from Home/Following" +msgstr "" + +#: src/components/list-add-edit.jsx:149 +#: src/pages/filters.jsx:554 +msgid "Create" +msgstr "建立" + +#: src/components/list-add-edit.jsx:156 +msgid "Delete this list?" +msgstr "是否刪除此列表?" + +#: src/components/list-add-edit.jsx:175 +msgid "Unable to delete list." +msgstr "無法此列表" + +#: src/components/media-alt-modal.jsx:38 +#: src/components/media.jsx:50 +msgid "Media description" +msgstr "圖片描述" + +#: src/components/media-alt-modal.jsx:57 +#: src/components/status.jsx:1066 +#: src/components/status.jsx:1093 +#: src/components/translation-block.jsx:195 +msgid "Translate" +msgstr "翻譯" + +#: src/components/media-alt-modal.jsx:68 +#: src/components/status.jsx:1080 +#: src/components/status.jsx:1107 +msgid "Speak" +msgstr "" + +#: src/components/media-modal.jsx:368 +msgid "Open original media in new window" +msgstr "" + +#: src/components/media-modal.jsx:372 +msgid "Open original media" +msgstr "" + +#: src/components/media-modal.jsx:388 +msgid "Attempting to describe image. Please wait…" +msgstr "" + +#: src/components/media-modal.jsx:403 +msgid "Failed to describe image" +msgstr "" + +#: src/components/media-modal.jsx:413 +msgid "Describe image…" +msgstr "描述圖像…" + +#: src/components/media-modal.jsx:436 +msgid "View post" +msgstr "查看貼文" + +#: src/components/media-post.jsx:127 +msgid "Sensitive media" +msgstr "標記為敏感之媒體" + +#: src/components/media-post.jsx:132 +msgid "Filtered: {filterTitleStr}" +msgstr "" + +#: src/components/media-post.jsx:133 +#: src/components/status.jsx:3561 +#: src/components/status.jsx:3657 +#: src/components/status.jsx:3735 +#: src/components/timeline.jsx:973 +#: src/pages/catchup.jsx:75 +#: src/pages/catchup.jsx:1876 +msgid "Filtered" +msgstr "" + +#: src/components/modals.jsx:72 +msgid "Post published. Check it out." +msgstr "" + +#: src/components/modals.jsx:73 +msgid "Reply posted. Check it out." +msgstr "" + +#: src/components/modals.jsx:74 +msgid "Post updated. Check it out." +msgstr "" + +#: src/components/nav-menu.jsx:117 +msgid "Menu" +msgstr "選單" + +#: src/components/nav-menu.jsx:153 +msgid "Reload page now to update?" +msgstr "" + +#: src/components/nav-menu.jsx:165 +msgid "New update available…" +msgstr "" + +#. js-lingui-explicit-id +#: src/components/nav-menu.jsx:184 +#: src/components/shortcuts-settings.jsx:140 +#: src/pages/following.jsx:22 +#: src/pages/following.jsx:141 +msgid "following.title" +msgstr "" + +#: src/components/nav-menu.jsx:191 +#: src/pages/catchup.jsx:871 +msgid "Catch-up" +msgstr "" + +#: src/components/nav-menu.jsx:198 +#: src/components/shortcuts-settings.jsx:58 +#: src/components/shortcuts-settings.jsx:146 +#: src/pages/home.jsx:224 +#: src/pages/mentions.jsx:20 +#: src/pages/mentions.jsx:167 +#: src/pages/settings.jsx:1145 +#: src/pages/trending.jsx:381 +msgid "Mentions" +msgstr "" + +#: src/components/nav-menu.jsx:205 +#: src/components/shortcuts-settings.jsx:49 +#: src/components/shortcuts-settings.jsx:152 +#: src/pages/filters.jsx:24 +#: src/pages/home.jsx:84 +#: src/pages/home.jsx:184 +#: src/pages/notifications.jsx:112 +#: src/pages/notifications.jsx:524 +msgid "Notifications" +msgstr "" + +#: src/components/nav-menu.jsx:208 +msgid "New" +msgstr "" + +#: src/components/nav-menu.jsx:219 +msgid "Profile" +msgstr "個人檔案" + +#: src/components/nav-menu.jsx:227 +#: src/components/shortcuts-settings.jsx:54 +#: src/components/shortcuts-settings.jsx:195 +#: src/pages/bookmarks.jsx:11 +#: src/pages/bookmarks.jsx:23 +msgid "Bookmarks" +msgstr "書籤" + +#: src/components/nav-menu.jsx:247 +#: src/components/shortcuts-settings.jsx:55 +#: src/components/shortcuts-settings.jsx:201 +#: src/pages/catchup.jsx:1446 +#: src/pages/catchup.jsx:2062 +#: src/pages/favourites.jsx:11 +#: src/pages/favourites.jsx:23 +#: src/pages/settings.jsx:1149 +msgid "Likes" +msgstr "喜歡" + +#: src/components/nav-menu.jsx:253 +#: src/pages/followed-hashtags.jsx:14 +#: src/pages/followed-hashtags.jsx:44 +msgid "Followed Hashtags" +msgstr "已跟隨的主題標籤" + +#: src/components/nav-menu.jsx:261 +#: src/pages/account-statuses.jsx:331 +#: src/pages/filters.jsx:54 +#: src/pages/filters.jsx:93 +#: src/pages/hashtag.jsx:339 +msgid "Filters" +msgstr "篩選條件" + +#: src/components/nav-menu.jsx:269 +msgid "Muted users" +msgstr "已靜音的使用者" + +#: src/components/nav-menu.jsx:277 +msgid "Muted users…" +msgstr "已靜音的使用者…" + +#: src/components/nav-menu.jsx:284 +msgid "Blocked users" +msgstr "已封鎖用戶" + +#: src/components/nav-menu.jsx:292 +msgid "Blocked users…" +msgstr "已封鎖用戶…" + +#: src/components/nav-menu.jsx:304 +msgid "Accounts…" +msgstr "帳號…" + +#: src/components/nav-menu.jsx:314 +#: src/pages/login.jsx:189 +#: src/pages/status.jsx:835 +#: src/pages/welcome.jsx:64 +msgid "Log in" +msgstr "登入" + +#: src/components/nav-menu.jsx:331 +#: src/components/shortcuts-settings.jsx:57 +#: src/components/shortcuts-settings.jsx:172 +#: src/pages/trending.jsx:441 +msgid "Trending" +msgstr "趨勢" + +#: src/components/nav-menu.jsx:343 +#: src/components/shortcuts-settings.jsx:165 +msgid "Federated" +msgstr "" + +#: src/components/nav-menu.jsx:366 +msgid "Shortcuts / Columns…" +msgstr "" + +#: src/components/nav-menu.jsx:376 +#: src/components/nav-menu.jsx:390 +msgid "Settings…" +msgstr "設定…" + +#: src/components/nav-menu.jsx:420 +#: src/components/nav-menu.jsx:447 +#: src/components/shortcuts-settings.jsx:50 +#: src/components/shortcuts-settings.jsx:158 +#: src/pages/list.jsx:126 +#: src/pages/lists.jsx:16 +#: src/pages/lists.jsx:50 +msgid "Lists" +msgstr "清單" + +#: src/components/nav-menu.jsx:428 +#: src/components/shortcuts.jsx:215 +#: src/pages/list.jsx:133 +msgid "All Lists" +msgstr "所有清單" + +#: src/components/notification-service.jsx:160 +msgid "Notification" +msgstr "通知" + +#: src/components/notification-service.jsx:166 +msgid "This notification is from your other account." +msgstr "" + +#: src/components/notification-service.jsx:195 +msgid "View all notifications" +msgstr "查看所有通知" + +#: src/components/notification.jsx:70 +msgid "{account} reacted to your post with {emojiObject}" +msgstr "" + +#: src/components/notification.jsx:77 +msgid "{account} published a post." +msgstr "" + +#: src/components/notification.jsx:85 +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 "" + +#: src/components/notification.jsx:128 +msgid "{count, plural, =1 {{account} followed you.} other {<0><1>{0}</1> people</0> followed you.}}" +msgstr "" + +#: src/components/notification.jsx:142 +msgid "{account} requested to follow you." +msgstr "" + +#: src/components/notification.jsx:151 +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 "" + +#: src/components/notification.jsx:193 +msgid "A poll you have voted in or created has ended." +msgstr "你參與或創立的投票已結束" + +#: src/components/notification.jsx:194 +msgid "A poll you have created has ended." +msgstr "你創立的投票已結束" + +#: src/components/notification.jsx:195 +msgid "A poll you have voted in has ended." +msgstr "你參與的投票已結束" + +#: src/components/notification.jsx:196 +msgid "A post you interacted with has been edited." +msgstr "" + +#: src/components/notification.jsx:204 +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 "" + +#: src/components/notification.jsx:246 +msgid "{account} signed up." +msgstr "" + +#: src/components/notification.jsx:248 +msgid "{account} reported {targetAccount}" +msgstr "" + +#: src/components/notification.jsx:253 +msgid "Lost connections with <0>{name}</0>." +msgstr "與 <0>{name}</0> 失去連線" + +#: src/components/notification.jsx:259 +msgid "Moderation warning" +msgstr "" + +#: src/components/notification.jsx:265 +msgid "Your {year} #Wrapstodon is here!" +msgstr "" + +#: src/components/notification.jsx:272 +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." +msgstr "" + +#: src/components/notification.jsx:278 +msgid "An admin from <0>{from}</0> has blocked <1>{targetName}</1>. Affected followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:284 +msgid "You have blocked <0>{targetName}</0>. Removed followers: {followersCount}, followings: {followingCount}." +msgstr "" + +#: src/components/notification.jsx:292 +msgid "Your account has received a moderation warning." +msgstr "" + +#: src/components/notification.jsx:293 +msgid "Your account has been disabled." +msgstr "您的帳號已被停用。" + +#: src/components/notification.jsx:294 +msgid "Some of your posts have been marked as sensitive." +msgstr "您的某些嘟文已被標記為敏感內容。" + +#: src/components/notification.jsx:295 +msgid "Some of your posts have been deleted." +msgstr "您的某些嘟文已被刪除。" + +#: src/components/notification.jsx:296 +msgid "Your posts will be marked as sensitive from now on." +msgstr "" + +#: src/components/notification.jsx:297 +msgid "Your account has been limited." +msgstr "您的帳號已被限制。" + +#: src/components/notification.jsx:298 +msgid "Your account has been suspended." +msgstr "您的帳號已被停用" + +#: src/components/notification.jsx:373 +msgid "[Unknown notification type: {type}]" +msgstr "" + +#: src/components/notification.jsx:442 +#: src/components/status.jsx:1036 +#: src/components/status.jsx:1046 +msgid "Boosted/Liked by…" +msgstr "" + +#: src/components/notification.jsx:443 +msgid "Liked by…" +msgstr "" + +#: src/components/notification.jsx:444 +msgid "Boosted by…" +msgstr "" + +#: src/components/notification.jsx:445 +msgid "Followed by…" +msgstr "" + +#: src/components/notification.jsx:516 +#: src/components/notification.jsx:532 +msgid "Learn more <0/>" +msgstr "" + +#: src/components/notification.jsx:540 +msgid "View #Wrapstodon" +msgstr "" + +#: src/components/notification.jsx:769 +#: src/components/status.jsx:267 +msgid "Read more →" +msgstr "" + +#: src/components/poll.jsx:110 +msgid "Voted" +msgstr "已投票" + +#: src/components/poll.jsx:116 +msgid "{optionVotesCount, plural, one {# vote} other {# votes}}" +msgstr "" + +#: src/components/poll.jsx:136 +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Hide results" +msgstr "" + +#: src/components/poll.jsx:185 +msgid "Vote" +msgstr "投票" + +#: src/components/poll.jsx:205 +#: src/components/poll.jsx:207 +#: src/pages/status.jsx:1201 +#: src/pages/status.jsx:1224 +msgid "Refresh" +msgstr "重新整理" + +#: src/components/poll.jsx:219 +#: src/components/poll.jsx:223 +msgid "Show results" +msgstr "顯示結果" + +#: src/components/poll.jsx:228 +msgid "{votesCount, plural, one {<0>{0}</0> vote} other {<1>{1}</1> votes}}" +msgstr "" + +#: src/components/poll.jsx:245 +msgid "{votersCount, plural, one {<0>{0}</0> voter} other {<1>{1}</1> voters}}" +msgstr "" + +#: src/components/poll.jsx:265 +msgid "Ended <0/>" +msgstr "已結束 <0/>" + +#: src/components/poll.jsx:269 +msgid "Ended" +msgstr "已結束" + +#: src/components/poll.jsx:272 +msgid "Ending <0/>" +msgstr "結束 <0/>" + +#: src/components/poll.jsx:276 +msgid "Ending" +msgstr "結束" + +#. Relative time in seconds, as short as possible +#: src/components/relative-time.jsx:57 +msgid "{0}s" +msgstr "{0}秒" + +#. Relative time in minutes, as short as possible +#: src/components/relative-time.jsx:62 +msgid "{0}m" +msgstr "{0}分" + +#. Relative time in hours, as short as possible +#: src/components/relative-time.jsx:67 +msgid "{0}h" +msgstr "{0}小時" + +#: src/components/report-modal.jsx:29 +msgid "Spam" +msgstr "垃圾訊息" + +#: src/components/report-modal.jsx:30 +msgid "Malicious links, fake engagement, or repetitive replies" +msgstr "" + +#: src/components/report-modal.jsx:33 +msgid "Illegal" +msgstr "非法的" + +#: src/components/report-modal.jsx:34 +msgid "Violates the law of your or the server's country" +msgstr "" + +#: src/components/report-modal.jsx:37 +msgid "Server rule violation" +msgstr "" + +#: src/components/report-modal.jsx:38 +msgid "Breaks specific server rules" +msgstr "" + +#: src/components/report-modal.jsx:39 +msgid "Violation" +msgstr "" + +#: src/components/report-modal.jsx:42 +msgid "Other" +msgstr "" + +#: src/components/report-modal.jsx:43 +msgid "Issue doesn't fit other categories" +msgstr "" + +#: src/components/report-modal.jsx:68 +msgid "Report Post" +msgstr "檢舉貼文" + +#: src/components/report-modal.jsx:68 +msgid "Report @{username}" +msgstr "檢舉 @{username}" + +#: src/components/report-modal.jsx:104 +msgid "Pending review" +msgstr "等待審核中" + +#: src/components/report-modal.jsx:146 +msgid "Post reported" +msgstr "已檢舉貼文" + +#: src/components/report-modal.jsx:146 +msgid "Profile reported" +msgstr "已檢舉個人檔案" + +#: src/components/report-modal.jsx:154 +msgid "Unable to report post" +msgstr "無法檢舉貼文" + +#: src/components/report-modal.jsx:155 +msgid "Unable to report profile" +msgstr "無法檢舉個人檔案" + +#: src/components/report-modal.jsx:163 +msgid "What's the issue with this post?" +msgstr "" + +#: src/components/report-modal.jsx:164 +msgid "What's the issue with this profile?" +msgstr "" + +#: src/components/report-modal.jsx:233 +msgid "Additional info" +msgstr "" + +#: src/components/report-modal.jsx:256 +msgid "Forward to <0>{domain}</0>" +msgstr "" + +#: src/components/report-modal.jsx:266 +msgid "Send Report" +msgstr "" + +#: src/components/report-modal.jsx:275 +msgid "Muted {username}" +msgstr "" + +#: src/components/report-modal.jsx:278 +msgid "Unable to mute {username}" +msgstr "" + +#: src/components/report-modal.jsx:283 +msgid "Send Report <0>+ Mute profile</0>" +msgstr "" + +#: src/components/report-modal.jsx:294 +msgid "Blocked {username}" +msgstr "" + +#: src/components/report-modal.jsx:297 +msgid "Unable to block {username}" +msgstr "" + +#: src/components/report-modal.jsx:302 +msgid "Send Report <0>+ Block profile</0>" +msgstr "" + +#: src/components/search-form.jsx:202 +msgid "{query} <0>‒ accounts, hashtags & posts</0>" +msgstr "" + +#: src/components/search-form.jsx:215 +msgid "Posts with <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:227 +msgid "Posts tagged with <0>#{0}</0>" +msgstr "" + +#: src/components/search-form.jsx:241 +msgid "Look up <0>{query}</0>" +msgstr "" + +#: src/components/search-form.jsx:252 +msgid "Accounts with <0>{query}</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:48 +msgid "Home / Following" +msgstr "" + +#: src/components/shortcuts-settings.jsx:51 +msgid "Public (Local / Federated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:53 +msgid "Account" +msgstr "帳號" + +#: src/components/shortcuts-settings.jsx:56 +msgid "Hashtag" +msgstr "主題標籤" + +#: src/components/shortcuts-settings.jsx:63 +msgid "List ID" +msgstr "清單編號" + +#: src/components/shortcuts-settings.jsx:70 +msgid "Local only" +msgstr "只顯示本站" + +#: src/components/shortcuts-settings.jsx:75 +#: src/components/shortcuts-settings.jsx:84 +#: src/components/shortcuts-settings.jsx:122 +#: src/pages/login.jsx:193 +msgid "Instance" +msgstr "站台" + +#: src/components/shortcuts-settings.jsx:78 +#: src/components/shortcuts-settings.jsx:87 +#: src/components/shortcuts-settings.jsx:125 +msgid "Optional, e.g. mastodon.social" +msgstr "" + +#: src/components/shortcuts-settings.jsx:93 +msgid "Search term" +msgstr "搜尋字詞" + +#: src/components/shortcuts-settings.jsx:96 +msgid "Optional, unless for multi-column mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:113 +msgid "e.g. PixelArt (Max 5, space-separated)" +msgstr "" + +#: src/components/shortcuts-settings.jsx:117 +#: src/pages/hashtag.jsx:355 +msgid "Media only" +msgstr "" + +#: src/components/shortcuts-settings.jsx:235 +#: src/components/shortcuts.jsx:192 +msgid "Shortcuts" +msgstr "捷徑" + +#: src/components/shortcuts-settings.jsx:243 +msgid "beta" +msgstr "測試版" + +#: src/components/shortcuts-settings.jsx:249 +msgid "Specify a list of shortcuts that'll appear as:" +msgstr "" + +#: src/components/shortcuts-settings.jsx:255 +msgid "Floating button" +msgstr "" + +#: src/components/shortcuts-settings.jsx:260 +msgid "Tab/Menu bar" +msgstr "" + +#: src/components/shortcuts-settings.jsx:265 +msgid "Multi-column" +msgstr "" + +#: src/components/shortcuts-settings.jsx:332 +msgid "Not available in current view mode" +msgstr "" + +#: src/components/shortcuts-settings.jsx:351 +msgid "Move up" +msgstr "" + +#: src/components/shortcuts-settings.jsx:367 +msgid "Move down" +msgstr "" + +#: src/components/shortcuts-settings.jsx:379 +#: src/components/status.jsx:1314 +#: src/pages/list.jsx:170 +msgid "Edit" +msgstr "編輯" + +#: src/components/shortcuts-settings.jsx:400 +msgid "Add more than one shortcut/column to make this work." +msgstr "" + +#: src/components/shortcuts-settings.jsx:411 +msgid "No columns yet. Tap on the Add column button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:412 +msgid "No shortcuts yet. Tap on the Add shortcut button." +msgstr "" + +#: src/components/shortcuts-settings.jsx:415 +msgid "Not sure what to add?<0/>Try adding <1>Home / Following and Notifications</1> first." +msgstr "" + +#: src/components/shortcuts-settings.jsx:443 +msgid "Max {SHORTCUTS_LIMIT} columns" +msgstr "" + +#: src/components/shortcuts-settings.jsx:444 +msgid "Max {SHORTCUTS_LIMIT} shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:458 +msgid "Import/export" +msgstr "匯入/匯出" + +#: src/components/shortcuts-settings.jsx:468 +msgid "Add column…" +msgstr "新增欄位…" + +#: src/components/shortcuts-settings.jsx:469 +msgid "Add shortcut…" +msgstr "新增捷徑…" + +#: src/components/shortcuts-settings.jsx:516 +msgid "Specific list is optional. For multi-column mode, list is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:517 +msgid "For multi-column mode, search term is required, else the column will not be shown." +msgstr "" + +#: src/components/shortcuts-settings.jsx:518 +msgid "Multiple hashtags are supported. Space-separated." +msgstr "" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Edit shortcut" +msgstr "自訂快速鍵" + +#: src/components/shortcuts-settings.jsx:587 +msgid "Add shortcut" +msgstr "新增快速鍵" + +#: src/components/shortcuts-settings.jsx:623 +msgid "Timeline" +msgstr "時間軸" + +#: src/components/shortcuts-settings.jsx:649 +msgid "List" +msgstr "清單" + +#: src/components/shortcuts-settings.jsx:788 +msgid "Import/Export <0>Shortcuts</0>" +msgstr "" + +#: src/components/shortcuts-settings.jsx:798 +msgid "Import" +msgstr "匯入" + +#: src/components/shortcuts-settings.jsx:806 +msgid "Paste shortcuts here" +msgstr "" + +#: src/components/shortcuts-settings.jsx:822 +msgid "Downloading saved shortcuts from instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:851 +msgid "Unable to download shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:854 +msgid "Download shortcuts from instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:912 +msgid "* Exists in current shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:917 +msgid "List may not work if it's from a different account." +msgstr "" + +#: src/components/shortcuts-settings.jsx:927 +msgid "Invalid settings format" +msgstr "" + +#: src/components/shortcuts-settings.jsx:935 +msgid "Append to current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:938 +msgid "Only shortcuts that don’t exist in current shortcuts will be appended." +msgstr "" + +#: src/components/shortcuts-settings.jsx:960 +msgid "No new shortcuts to import" +msgstr "" + +#: src/components/shortcuts-settings.jsx:975 +msgid "Shortcuts imported. Exceeded max {SHORTCUTS_LIMIT}, so the rest are not imported." +msgstr "" + +#: src/components/shortcuts-settings.jsx:976 +#: src/components/shortcuts-settings.jsx:1000 +msgid "Shortcuts imported" +msgstr "" + +#: src/components/shortcuts-settings.jsx:986 +msgid "Import & append…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:994 +msgid "Override current shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:995 +msgid "Import shortcuts?" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "or override…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1009 +msgid "Import…" +msgstr "匯入…" + +#: src/components/shortcuts-settings.jsx:1018 +msgid "Export" +msgstr "匯出" + +#: src/components/shortcuts-settings.jsx:1033 +msgid "Shortcuts copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1036 +msgid "Unable to copy shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1050 +msgid "Shortcut settings copied" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1053 +msgid "Unable to copy shortcut settings" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1083 +msgid "Share" +msgstr "分享" + +#: src/components/shortcuts-settings.jsx:1122 +msgid "Saving shortcuts to instance server…" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1129 +msgid "Shortcuts saved" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1134 +msgid "Unable to save shortcuts" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1137 +msgid "Sync to instance server" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1145 +msgid "{0, plural, one {# character} other {# characters}}" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1157 +msgid "Raw Shortcuts JSON" +msgstr "" + +#: src/components/shortcuts-settings.jsx:1170 +msgid "Import/export settings from/to instance server (Very experimental)" +msgstr "" + +#: src/components/status.jsx:538 +msgid "<0/> <1>boosted</1>" +msgstr "" + +#: src/components/status.jsx:637 +msgid "Sorry, your current logged-in instance can't interact with this post from another instance." +msgstr "" + +#: src/components/status.jsx:790 +msgid "Unliked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:791 +msgid "Liked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:830 +msgid "Unbookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:831 +msgid "Bookmarked @{0}'s post" +msgstr "" + +#: src/components/status.jsx:937 +#: src/components/status.jsx:999 +#: src/components/status.jsx:2413 +#: src/components/status.jsx:2444 +msgid "Unboost" +msgstr "取消轉發" + +#: src/components/status.jsx:953 +#: src/components/status.jsx:2428 +msgid "Quote" +msgstr "引用" + +#: src/components/status.jsx:961 +#: src/components/status.jsx:2437 +msgid "Some media have no descriptions." +msgstr "" + +#: src/components/status.jsx:968 +msgid "Old post (<0>{0}</0>)" +msgstr "" + +#: src/components/status.jsx:987 +#: src/components/status.jsx:1442 +msgid "Unboosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:988 +#: src/components/status.jsx:1443 +msgid "Boosted @{0}'s post" +msgstr "" + +#: src/components/status.jsx:1000 +msgid "Boost…" +msgstr "轉發…" + +#: src/components/status.jsx:1012 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:2457 +msgid "Unlike" +msgstr "取消喜愛" + +#: src/components/status.jsx:1013 +#: src/components/status.jsx:1727 +#: src/components/status.jsx:1728 +#: src/components/status.jsx:2457 +#: src/components/status.jsx:2458 +msgid "Like" +msgstr "喜愛" + +#: src/components/status.jsx:1022 +#: src/components/status.jsx:2469 +msgid "Unbookmark" +msgstr "取消書籤" + +#: src/components/status.jsx:1130 +msgid "View post by <0>@{0}</0>" +msgstr "" + +#: src/components/status.jsx:1151 +msgid "Show Edit History" +msgstr "顯示編輯紀錄" + +#: src/components/status.jsx:1154 +msgid "Edited: {editedDateText}" +msgstr "" + +#: src/components/status.jsx:1221 +#: src/components/status.jsx:3236 +msgid "Embed post" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation unmuted" +msgstr "" + +#: src/components/status.jsx:1235 +msgid "Conversation muted" +msgstr "" + +#: src/components/status.jsx:1241 +msgid "Unable to unmute conversation" +msgstr "" + +#: src/components/status.jsx:1242 +msgid "Unable to mute conversation" +msgstr "" + +#: src/components/status.jsx:1251 +msgid "Unmute conversation" +msgstr "取消此對話的靜音" + +#: src/components/status.jsx:1258 +msgid "Mute conversation" +msgstr "靜音對話" + +#: src/components/status.jsx:1274 +msgid "Post unpinned from profile" +msgstr "貼文已從個人檔案取消釘選" + +#: src/components/status.jsx:1275 +msgid "Post pinned to profile" +msgstr "貼文已釘選至個人檔案" + +#: src/components/status.jsx:1280 +msgid "Unable to unpin post" +msgstr "" + +#: src/components/status.jsx:1280 +msgid "Unable to pin post" +msgstr "" + +#: src/components/status.jsx:1289 +msgid "Unpin from profile" +msgstr "從個人檔案取消釘選" + +#: src/components/status.jsx:1296 +msgid "Pin to profile" +msgstr "釘選至個人檔案" + +#: src/components/status.jsx:1325 +msgid "Delete this post?" +msgstr "" + +#: src/components/status.jsx:1341 +msgid "Post deleted" +msgstr "" + +#: src/components/status.jsx:1344 +msgid "Unable to delete post" +msgstr "" + +#: src/components/status.jsx:1372 +msgid "Report post…" +msgstr "" + +#: src/components/status.jsx:1728 +#: src/components/status.jsx:1764 +#: src/components/status.jsx:2458 +msgid "Liked" +msgstr "" + +#: src/components/status.jsx:1761 +#: src/components/status.jsx:2445 +msgid "Boosted" +msgstr "" + +#: src/components/status.jsx:1771 +#: src/components/status.jsx:2470 +msgid "Bookmarked" +msgstr "" + +#: src/components/status.jsx:1775 +msgid "Pinned" +msgstr "" + +#: src/components/status.jsx:1820 +#: src/components/status.jsx:2276 +msgid "Deleted" +msgstr "" + +#: src/components/status.jsx:1861 +msgid "{repliesCount, plural, one {# reply} other {# replies}}" +msgstr "" + +#: src/components/status.jsx:1950 +msgid "Thread{0}" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +#: src/components/status.jsx:2173 +msgid "Show less" +msgstr "" + +#: src/components/status.jsx:2026 +#: src/components/status.jsx:2088 +msgid "Show content" +msgstr "" + +#: src/components/status.jsx:2173 +msgid "Show media" +msgstr "" + +#: src/components/status.jsx:2310 +msgid "Edited" +msgstr "" + +#: src/components/status.jsx:2387 +msgid "Comments" +msgstr "" + +#. More from [Author] +#: src/components/status.jsx:2696 +msgid "More from <0/>" +msgstr "" + +#: src/components/status.jsx:2997 +msgid "Edit History" +msgstr "" + +#: src/components/status.jsx:3001 +msgid "Failed to load history" +msgstr "" + +#: src/components/status.jsx:3006 +#: src/pages/annual-report.jsx:44 +msgid "Loading…" +msgstr "" + +#: src/components/status.jsx:3241 +msgid "HTML Code" +msgstr "" + +#: src/components/status.jsx:3258 +msgid "HTML code copied" +msgstr "" + +#: src/components/status.jsx:3261 +msgid "Unable to copy HTML code" +msgstr "" + +#: src/components/status.jsx:3273 +msgid "Media attachments:" +msgstr "" + +#: src/components/status.jsx:3295 +msgid "Account Emojis:" +msgstr "" + +#: src/components/status.jsx:3326 +#: src/components/status.jsx:3371 +msgid "static URL" +msgstr "" + +#: src/components/status.jsx:3340 +msgid "Emojis:" +msgstr "" + +#: src/components/status.jsx:3385 +msgid "Notes:" +msgstr "" + +#: src/components/status.jsx:3389 +msgid "This is static, unstyled and scriptless. You may need to apply your own styles and edit as needed." +msgstr "" + +#: src/components/status.jsx:3395 +msgid "Polls are not interactive, becomes a list with vote counts." +msgstr "" + +#: src/components/status.jsx:3400 +msgid "Media attachments can be images, videos, audios or any file types." +msgstr "" + +#: src/components/status.jsx:3406 +msgid "Post could be edited or deleted later." +msgstr "" + +#: src/components/status.jsx:3412 +msgid "Preview" +msgstr "" + +#: src/components/status.jsx:3421 +msgid "Note: This preview is lightly styled." +msgstr "" + +#. [Name] [Visibility icon] boosted +#: src/components/status.jsx:3665 +msgid "<0/> <1/> boosted" +msgstr "" + +#: src/components/timeline.jsx:453 +#: src/pages/settings.jsx:1173 +msgid "New posts" +msgstr "" + +#: src/components/timeline.jsx:554 +#: src/pages/home.jsx:213 +#: src/pages/notifications.jsx:824 +#: src/pages/status.jsx:988 +#: src/pages/status.jsx:1361 +msgid "Try again" +msgstr "" + +#: src/components/timeline.jsx:588 +msgid "{0, plural, one {# Boost} other {# Boosts}}" +msgstr "" + +#: src/components/timeline.jsx:593 +msgid "Pinned posts" +msgstr "" + +#: src/components/timeline.jsx:946 +#: src/components/timeline.jsx:953 +#: src/pages/catchup.jsx:1893 +msgid "Thread" +msgstr "" + +#: src/components/timeline.jsx:968 +msgid "<0>Filtered</0>: <1>{0}</1>" +msgstr "" + +#: src/components/translation-block.jsx:152 +msgid "Auto-translated from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:190 +msgid "Translating…" +msgstr "" + +#: src/components/translation-block.jsx:193 +msgid "Translate from {sourceLangText} (auto-detected)" +msgstr "" + +#: src/components/translation-block.jsx:194 +msgid "Translate from {sourceLangText}" +msgstr "" + +#: src/components/translation-block.jsx:222 +msgid "Auto ({0})" +msgstr "" + +#: src/components/translation-block.jsx:235 +msgid "Failed to translate" +msgstr "翻譯失敗" + +#: src/compose.jsx:32 +msgid "Editing source status" +msgstr "" + +#: src/compose.jsx:34 +msgid "Replying to @{0}" +msgstr "" + +#: src/compose.jsx:62 +msgid "You may close this page now." +msgstr "" + +#: src/compose.jsx:70 +msgid "Close window" +msgstr "關閉視窗" + +#: src/compose.jsx:86 +msgid "Login required." +msgstr "需要登入" + +#: src/compose.jsx:90 +#: src/pages/annual-report.jsx:132 +#: src/pages/http-route.jsx:91 +#: src/pages/login.jsx:270 +msgid "Go home" +msgstr "回到主頁" + +#: src/pages/account-statuses.jsx:233 +msgid "Account posts" +msgstr "帳號貼文" + +#: src/pages/account-statuses.jsx:240 +msgid "{accountDisplay} (+ Replies)" +msgstr "" + +#: src/pages/account-statuses.jsx:242 +msgid "{accountDisplay} (- Boosts)" +msgstr "" + +#: src/pages/account-statuses.jsx:244 +msgid "{accountDisplay} (#{tagged})" +msgstr "" + +#: src/pages/account-statuses.jsx:246 +msgid "{accountDisplay} (Media)" +msgstr "" + +#: src/pages/account-statuses.jsx:252 +msgid "{accountDisplay} ({monthYear})" +msgstr "" + +#: src/pages/account-statuses.jsx:321 +msgid "Clear filters" +msgstr "" + +#: src/pages/account-statuses.jsx:324 +msgid "Clear" +msgstr "" + +#: src/pages/account-statuses.jsx:338 +msgid "Showing post with replies" +msgstr "" + +#: src/pages/account-statuses.jsx:343 +msgid "+ Replies" +msgstr "" + +#: src/pages/account-statuses.jsx:349 +msgid "Showing posts without boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:354 +msgid "- Boosts" +msgstr "" + +#: src/pages/account-statuses.jsx:360 +msgid "Showing posts with media" +msgstr "" + +#: src/pages/account-statuses.jsx:377 +msgid "Showing posts tagged with #{0}" +msgstr "" + +#: src/pages/account-statuses.jsx:416 +msgid "Showing posts in {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:505 +msgid "Nothing to see here yet." +msgstr "" + +#: src/pages/account-statuses.jsx:506 +#: src/pages/public.jsx:97 +#: src/pages/trending.jsx:449 +msgid "Unable to load posts" +msgstr "" + +#: src/pages/account-statuses.jsx:547 +#: src/pages/account-statuses.jsx:577 +msgid "Unable to fetch account info" +msgstr "" + +#: src/pages/account-statuses.jsx:554 +msgid "Switch to account's instance {0}" +msgstr "" + +#: src/pages/account-statuses.jsx:584 +msgid "Switch to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/account-statuses.jsx:646 +msgid "Month" +msgstr "" + +#: src/pages/accounts.jsx:55 +msgid "Current" +msgstr "" + +#: src/pages/accounts.jsx:101 +msgid "Default" +msgstr "" + +#: src/pages/accounts.jsx:123 +msgid "Switch to this account" +msgstr "" + +#: src/pages/accounts.jsx:132 +msgid "Switch in new tab/window" +msgstr "" + +#: src/pages/accounts.jsx:146 +msgid "View profile…" +msgstr "" + +#: src/pages/accounts.jsx:163 +msgid "Set as default" +msgstr "" + +#: src/pages/accounts.jsx:173 +msgid "Log out <0>@{0}</0>?" +msgstr "" + +#: src/pages/accounts.jsx:196 +msgid "Log out…" +msgstr "" + +#: src/pages/accounts.jsx:209 +msgid "Add an existing account" +msgstr "" + +#: src/pages/accounts.jsx:216 +msgid "Note: <0>Default</0> account will always be used for first load. Switched accounts will persist during the session." +msgstr "" + +#: src/pages/bookmarks.jsx:25 +msgid "No bookmarks yet. Go bookmark something!" +msgstr "" + +#: src/pages/bookmarks.jsx:26 +msgid "Unable to load bookmarks." +msgstr "" + +#: src/pages/catchup.jsx:54 +msgid "last 1 hour" +msgstr "" + +#: src/pages/catchup.jsx:55 +msgid "last 2 hours" +msgstr "" + +#: src/pages/catchup.jsx:56 +msgid "last 3 hours" +msgstr "" + +#: src/pages/catchup.jsx:57 +msgid "last 4 hours" +msgstr "" + +#: src/pages/catchup.jsx:58 +msgid "last 5 hours" +msgstr "" + +#: src/pages/catchup.jsx:59 +msgid "last 6 hours" +msgstr "" + +#: src/pages/catchup.jsx:60 +msgid "last 7 hours" +msgstr "" + +#: src/pages/catchup.jsx:61 +msgid "last 8 hours" +msgstr "" + +#: src/pages/catchup.jsx:62 +msgid "last 9 hours" +msgstr "" + +#: src/pages/catchup.jsx:63 +msgid "last 10 hours" +msgstr "" + +#: src/pages/catchup.jsx:64 +msgid "last 11 hours" +msgstr "" + +#: src/pages/catchup.jsx:65 +msgid "last 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:66 +msgid "beyond 12 hours" +msgstr "" + +#: src/pages/catchup.jsx:73 +msgid "Followed tags" +msgstr "" + +#: src/pages/catchup.jsx:74 +msgid "Groups" +msgstr "" + +#: 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 "" + +#: src/pages/catchup.jsx:882 +#: src/pages/catchup.jsx:906 +msgid "Catch-up <0>beta</0>" +msgstr "" + +#: src/pages/catchup.jsx:896 +#: src/pages/catchup.jsx:1585 +msgid "Help" +msgstr "" + +#: src/pages/catchup.jsx:912 +msgid "What is this?" +msgstr "" + +#: src/pages/catchup.jsx:915 +msgid "Catch-up is a separate timeline for your followings, offering a high-level view at a glance, with a simple, email-inspired interface to effortlessly sort and filter through posts." +msgstr "" + +#: src/pages/catchup.jsx:926 +msgid "Preview of Catch-up UI" +msgstr "" + +#: src/pages/catchup.jsx:935 +msgid "Let's catch up" +msgstr "" + +#: src/pages/catchup.jsx:940 +msgid "Let's catch up on the posts from your followings." +msgstr "" + +#: src/pages/catchup.jsx:944 +msgid "Show me all posts from…" +msgstr "" + +#: src/pages/catchup.jsx:967 +msgid "until the max" +msgstr "" + +#: src/pages/catchup.jsx:997 +msgid "Catch up" +msgstr "" + +#: src/pages/catchup.jsx:1003 +msgid "Overlaps with your last catch-up" +msgstr "" + +#: src/pages/catchup.jsx:1015 +msgid "Until the last catch-up ({0})" +msgstr "" + +#: src/pages/catchup.jsx:1024 +msgid "Note: your instance might only show a maximum of 800 posts in the Home timeline regardless of the time range. Could be less or more." +msgstr "" + +#: src/pages/catchup.jsx:1034 +msgid "Previously…" +msgstr "" + +#: src/pages/catchup.jsx:1052 +msgid "{0, plural, one {# post} other {# posts}}" +msgstr "" + +#: src/pages/catchup.jsx:1062 +msgid "Remove this catch-up?" +msgstr "" + +#: src/pages/catchup.jsx:1065 +msgid "Removing Catch-up {0}" +msgstr "" + +#: src/pages/catchup.jsx:1069 +msgid "Catch-up {0} removed" +msgstr "" + +#: src/pages/catchup.jsx:1083 +msgid "Note: Only max 3 will be stored. The rest will be automatically removed." +msgstr "" + +#: src/pages/catchup.jsx:1098 +msgid "Fetching posts…" +msgstr "" + +#: src/pages/catchup.jsx:1101 +msgid "This might take a while." +msgstr "" + +#: src/pages/catchup.jsx:1136 +msgid "Reset filters" +msgstr "" + +#: src/pages/catchup.jsx:1144 +#: src/pages/catchup.jsx:1591 +msgid "Top links" +msgstr "" + +#: src/pages/catchup.jsx:1261 +msgid "Shared by {0}" +msgstr "" + +#: src/pages/catchup.jsx:1316 +#: src/pages/mentions.jsx:147 +#: src/pages/search.jsx:312 +msgid "All" +msgstr "" + +#: src/pages/catchup.jsx:1401 +msgid "{0, plural, one {# author} other {# authors}}" +msgstr "" + +#: src/pages/catchup.jsx:1413 +msgid "Sort" +msgstr "" + +#: src/pages/catchup.jsx:1444 +msgid "Date" +msgstr "" + +#: src/pages/catchup.jsx:1448 +msgid "Density" +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/catchup.jsx:1471 +msgid "group.filter" +msgstr "" + +#: src/pages/catchup.jsx:1486 +msgid "Authors" +msgstr "" + +#: src/pages/catchup.jsx:1487 +msgid "None" +msgstr "" + +#: src/pages/catchup.jsx:1503 +msgid "Show all authors" +msgstr "" + +#: src/pages/catchup.jsx:1554 +msgid "You don't have to read everything." +msgstr "" + +#: src/pages/catchup.jsx:1555 +msgid "That's all." +msgstr "" + +#: src/pages/catchup.jsx:1563 +msgid "Back to top" +msgstr "" + +#: src/pages/catchup.jsx:1594 +msgid "Links shared by followings, sorted by shared counts, boosts and likes." +msgstr "" + +#: src/pages/catchup.jsx:1600 +msgid "Sort: Density" +msgstr "" + +#: src/pages/catchup.jsx:1603 +msgid "Posts are sorted by information density or depth. Shorter posts are \"lighter\" while longer posts are \"heavier\". Posts with photos are \"heavier\" than posts without photos." +msgstr "" + +#: src/pages/catchup.jsx:1610 +msgid "Group: Authors" +msgstr "" + +#: src/pages/catchup.jsx:1613 +msgid "Posts are grouped by authors, sorted by posts count per author." +msgstr "" + +#: src/pages/catchup.jsx:1660 +msgid "Next author" +msgstr "" + +#: src/pages/catchup.jsx:1668 +msgid "Previous author" +msgstr "" + +#: src/pages/catchup.jsx:1684 +msgid "Scroll to top" +msgstr "" + +#: src/pages/catchup.jsx:1875 +msgid "Filtered: {0}" +msgstr "" + +#: src/pages/favourites.jsx:25 +msgid "No likes yet. Go like something!" +msgstr "" + +#: src/pages/favourites.jsx:26 +msgid "Unable to load likes." +msgstr "" + +#: src/pages/filters.jsx:23 +msgid "Home and lists" +msgstr "" + +#: src/pages/filters.jsx:25 +msgid "Public timelines" +msgstr "" + +#: src/pages/filters.jsx:26 +msgid "Conversations" +msgstr "" + +#: src/pages/filters.jsx:27 +msgid "Profiles" +msgstr "" + +#: src/pages/filters.jsx:42 +msgid "Never" +msgstr "" + +#: src/pages/filters.jsx:103 +#: src/pages/filters.jsx:228 +msgid "New filter" +msgstr "" + +#: src/pages/filters.jsx:151 +msgid "{0, plural, one {# filter} other {# filters}}" +msgstr "" + +#: src/pages/filters.jsx:166 +msgid "Unable to load filters." +msgstr "" + +#: src/pages/filters.jsx:170 +msgid "No filters yet." +msgstr "" + +#: src/pages/filters.jsx:177 +msgid "Add filter" +msgstr "" + +#: src/pages/filters.jsx:228 +msgid "Edit filter" +msgstr "" + +#: src/pages/filters.jsx:345 +msgid "Unable to edit filter" +msgstr "" + +#: src/pages/filters.jsx:346 +msgid "Unable to create filter" +msgstr "" + +#: src/pages/filters.jsx:355 +msgid "Title" +msgstr "標題" + +#: src/pages/filters.jsx:396 +msgid "Whole word" +msgstr "" + +#: src/pages/filters.jsx:422 +msgid "No keywords. Add one." +msgstr "" + +#: src/pages/filters.jsx:449 +msgid "Add keyword" +msgstr "" + +#: src/pages/filters.jsx:453 +msgid "{0, plural, one {# keyword} other {# keywords}}" +msgstr "" + +#: src/pages/filters.jsx:466 +msgid "Filter from…" +msgstr "" + +#: src/pages/filters.jsx:492 +msgid "* Not implemented yet" +msgstr "" + +#: src/pages/filters.jsx:498 +msgid "Status: <0><1/></0>" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Change expiry" +msgstr "" + +#: src/pages/filters.jsx:507 +msgid "Expiry" +msgstr "" + +#: src/pages/filters.jsx:526 +msgid "Filtered post will be…" +msgstr "" + +#: src/pages/filters.jsx:536 +msgid "minimized" +msgstr "" + +#: src/pages/filters.jsx:546 +msgid "hidden" +msgstr "" + +#: src/pages/filters.jsx:563 +msgid "Delete this filter?" +msgstr "" + +#: src/pages/filters.jsx:576 +msgid "Unable to delete filter." +msgstr "" + +#: src/pages/filters.jsx:608 +msgid "Expired" +msgstr "" + +#: src/pages/filters.jsx:610 +msgid "Expiring <0/>" +msgstr "" + +#: src/pages/filters.jsx:614 +msgid "Never expires" +msgstr "" + +#: src/pages/followed-hashtags.jsx:70 +msgid "{0, plural, one {# hashtag} other {# hashtags}}" +msgstr "" + +#: src/pages/followed-hashtags.jsx:85 +msgid "Unable to load followed hashtags." +msgstr "" + +#: src/pages/followed-hashtags.jsx:89 +msgid "No hashtags followed yet." +msgstr "" + +#: src/pages/following.jsx:143 +msgid "Nothing to see here." +msgstr "" + +#: src/pages/following.jsx:144 +#: src/pages/list.jsx:108 +msgid "Unable to load posts." +msgstr "" + +#: src/pages/hashtag.jsx:55 +msgid "{hashtagTitle} (Media only) on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:56 +msgid "{hashtagTitle} on {instance}" +msgstr "" + +#: src/pages/hashtag.jsx:58 +msgid "{hashtagTitle} (Media only)" +msgstr "" + +#: src/pages/hashtag.jsx:59 +msgid "{hashtagTitle}" +msgstr "" + +#: src/pages/hashtag.jsx:181 +msgid "No one has posted anything with this tag yet." +msgstr "" + +#: src/pages/hashtag.jsx:182 +msgid "Unable to load posts with this tag" +msgstr "" + +#: src/pages/hashtag.jsx:208 +msgid "Unfollow #{hashtag}?" +msgstr "" + +#: src/pages/hashtag.jsx:223 +msgid "Unfollowed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:238 +msgid "Followed #{hashtag}" +msgstr "" + +#: src/pages/hashtag.jsx:254 +msgid "Following…" +msgstr "" + +#: src/pages/hashtag.jsx:282 +msgid "Unfeatured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:296 +msgid "Unable to unfeature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:305 +#: src/pages/hashtag.jsx:321 +msgid "Featured on profile" +msgstr "" + +#: src/pages/hashtag.jsx:328 +msgid "Feature on profile" +msgstr "" + +#: src/pages/hashtag.jsx:393 +msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}" +msgstr "" + +#: src/pages/hashtag.jsx:396 +msgid "Add hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:428 +msgid "Remove hashtag" +msgstr "" + +#: src/pages/hashtag.jsx:442 +msgid "{SHORTCUTS_LIMIT, plural, one {Max # shortcut reached. Unable to add shortcut.} other {Max # shortcuts reached. Unable to add shortcut.}}" +msgstr "" + +#: src/pages/hashtag.jsx:471 +msgid "This shortcut already exists" +msgstr "" + +#: src/pages/hashtag.jsx:474 +msgid "Hashtag shortcut added" +msgstr "" + +#: src/pages/hashtag.jsx:480 +msgid "Add to Shortcuts" +msgstr "" + +#: src/pages/hashtag.jsx:486 +#: src/pages/public.jsx:139 +#: src/pages/trending.jsx:478 +msgid "Enter a new instance e.g. \"mastodon.social\"" +msgstr "" + +#: src/pages/hashtag.jsx:489 +#: src/pages/public.jsx:142 +#: src/pages/trending.jsx:481 +msgid "Invalid instance" +msgstr "" + +#: src/pages/hashtag.jsx:503 +#: src/pages/public.jsx:156 +#: src/pages/trending.jsx:493 +msgid "Go to another instance…" +msgstr "" + +#: src/pages/hashtag.jsx:516 +#: src/pages/public.jsx:169 +#: src/pages/trending.jsx:504 +msgid "Go to my instance (<0>{currentInstance}</0>)" +msgstr "" + +#: src/pages/home.jsx:209 +msgid "Unable to fetch notifications." +msgstr "" + +#: src/pages/home.jsx:229 +msgid "<0>New</0> <1>Follow Requests</1>" +msgstr "" + +#: src/pages/home.jsx:235 +msgid "See all" +msgstr "" + +#: src/pages/http-route.jsx:68 +msgid "Resolving…" +msgstr "" + +#: src/pages/http-route.jsx:79 +msgid "Unable to resolve URL" +msgstr "" + +#: src/pages/list.jsx:107 +msgid "Nothing yet." +msgstr "" + +#: src/pages/list.jsx:176 +#: src/pages/list.jsx:279 +msgid "Manage members" +msgstr "" + +#: src/pages/list.jsx:313 +msgid "Remove <0>@{0}</0> from list?" +msgstr "" + +#: src/pages/list.jsx:359 +msgid "Remove…" +msgstr "" + +#: src/pages/lists.jsx:93 +msgid "{0, plural, one {# list} other {# lists}}" +msgstr "" + +#: src/pages/lists.jsx:108 +msgid "No lists yet." +msgstr "" + +#: src/pages/login.jsx:109 +#: src/pages/login.jsx:122 +msgid "Failed to register application" +msgstr "" + +#: src/pages/login.jsx:208 +msgid "instance domain" +msgstr "" + +#: src/pages/login.jsx:232 +msgid "e.g. “mastodon.social”" +msgstr "" + +#: src/pages/login.jsx:243 +msgid "Failed to log in. Please try again or try another instance." +msgstr "" + +#: src/pages/login.jsx:255 +msgid "Continue with {selectedInstanceText}" +msgstr "" + +#: src/pages/login.jsx:256 +msgid "Continue" +msgstr "" + +#: src/pages/login.jsx:264 +msgid "Don't have an account? Create one!" +msgstr "" + +#: src/pages/mentions.jsx:20 +msgid "Private mentions" +msgstr "" + +#: src/pages/mentions.jsx:159 +msgid "Private" +msgstr "" + +#: src/pages/mentions.jsx:169 +msgid "No one mentioned you :(" +msgstr "" + +#: src/pages/mentions.jsx:170 +msgid "Unable to load mentions." +msgstr "" + +#: src/pages/notifications.jsx:103 +msgid "You don't follow" +msgstr "" + +#: src/pages/notifications.jsx:104 +msgid "Who don't follow you" +msgstr "" + +#: src/pages/notifications.jsx:105 +msgid "With a new account" +msgstr "" + +#: src/pages/notifications.jsx:106 +msgid "Who unsolicitedly private mention you" +msgstr "" + +#: src/pages/notifications.jsx:107 +msgid "Who are limited by server moderators" +msgstr "" + +#: src/pages/notifications.jsx:538 +#: src/pages/notifications.jsx:872 +msgid "Notifications settings" +msgstr "" + +#: src/pages/notifications.jsx:556 +msgid "New notifications" +msgstr "" + +#: src/pages/notifications.jsx:567 +msgid "{0, plural, one {Announcement} other {Announcements}}" +msgstr "" + +#: src/pages/notifications.jsx:614 +#: src/pages/settings.jsx:1161 +msgid "Follow requests" +msgstr "" + +#: src/pages/notifications.jsx:619 +msgid "{0, plural, one {# follow request} other {# follow requests}}" +msgstr "" + +#: src/pages/notifications.jsx:674 +msgid "{0, plural, one {Filtered notifications from # person} other {Filtered notifications from # people}}" +msgstr "" + +#: src/pages/notifications.jsx:740 +msgid "Only mentions" +msgstr "" + +#: src/pages/notifications.jsx:744 +msgid "Today" +msgstr "" + +#: src/pages/notifications.jsx:749 +msgid "You're all caught up." +msgstr "" + +#: src/pages/notifications.jsx:772 +msgid "Yesterday" +msgstr "" + +#: src/pages/notifications.jsx:820 +msgid "Unable to load notifications" +msgstr "" + +#: src/pages/notifications.jsx:899 +msgid "Notifications settings updated" +msgstr "" + +#: src/pages/notifications.jsx:907 +msgid "Filter out notifications from people:" +msgstr "" + +#: src/pages/notifications.jsx:921 +msgid "Filter" +msgstr "" + +#: src/pages/notifications.jsx:924 +msgid "Ignore" +msgstr "" + +#: src/pages/notifications.jsx:997 +msgid "Updated <0>{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1065 +msgid "View notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1086 +msgid "Notifications from <0>@{0}</0>" +msgstr "" + +#: src/pages/notifications.jsx:1153 +msgid "Notifications from @{0} will not be filtered from now on." +msgstr "" + +#: src/pages/notifications.jsx:1158 +msgid "Unable to accept notification request" +msgstr "" + +#: src/pages/notifications.jsx:1163 +msgid "Allow" +msgstr "允許" + +#: src/pages/notifications.jsx:1183 +msgid "Notifications from @{0} will not show up in Filtered notifications from now on." +msgstr "" + +#: src/pages/notifications.jsx:1188 +msgid "Unable to dismiss notification request" +msgstr "" + +#: src/pages/notifications.jsx:1193 +msgid "Dismiss" +msgstr "" + +#: src/pages/notifications.jsx:1208 +msgid "Dismissed" +msgstr "" + +#: src/pages/public.jsx:27 +msgid "Local timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:28 +msgid "Federated timeline ({instance})" +msgstr "" + +#: src/pages/public.jsx:90 +msgid "Local timeline" +msgstr "本站時間軸" + +#: src/pages/public.jsx:90 +msgid "Federated timeline" +msgstr "聯邦時間軸" + +#: src/pages/public.jsx:96 +msgid "No one has posted anything yet." +msgstr "" + +#: src/pages/public.jsx:123 +msgid "Switch to Federated" +msgstr "切換到聯邦" + +#: src/pages/public.jsx:130 +msgid "Switch to Local" +msgstr "切換到本站" + +#: src/pages/search.jsx:49 +msgid "Search: {q} (Posts)" +msgstr "" + +#: src/pages/search.jsx:52 +msgid "Search: {q} (Accounts)" +msgstr "" + +#: src/pages/search.jsx:55 +msgid "Search: {q} (Hashtags)" +msgstr "" + +#: src/pages/search.jsx:58 +msgid "Search: {q}" +msgstr "" + +#: src/pages/search.jsx:322 +#: src/pages/search.jsx:404 +msgid "Hashtags" +msgstr "" + +#: src/pages/search.jsx:354 +#: src/pages/search.jsx:408 +#: src/pages/search.jsx:478 +msgid "See more" +msgstr "" + +#: src/pages/search.jsx:380 +msgid "See more accounts" +msgstr "" + +#: src/pages/search.jsx:394 +msgid "No accounts found." +msgstr "" + +#: src/pages/search.jsx:450 +msgid "See more hashtags" +msgstr "" + +#: src/pages/search.jsx:464 +msgid "No hashtags found." +msgstr "" + +#: src/pages/search.jsx:508 +msgid "See more posts" +msgstr "" + +#: src/pages/search.jsx:522 +msgid "No posts found." +msgstr "" + +#: src/pages/search.jsx:566 +msgid "Enter your search term or paste a URL above to get started." +msgstr "" + +#: src/pages/settings.jsx:82 +msgid "Settings" +msgstr "" + +#: src/pages/settings.jsx:91 +msgid "Appearance" +msgstr "" + +#: src/pages/settings.jsx:167 +msgid "Light" +msgstr "" + +#: src/pages/settings.jsx:178 +msgid "Dark" +msgstr "" + +#: src/pages/settings.jsx:191 +msgid "Auto" +msgstr "" + +#: src/pages/settings.jsx:201 +msgid "Text size" +msgstr "" + +#. Preview of one character, in smallest size +#. Preview of one character, in largest size +#: src/pages/settings.jsx:206 +#: src/pages/settings.jsx:231 +msgid "A" +msgstr "" + +#: src/pages/settings.jsx:245 +msgid "Display language" +msgstr "" + +#: src/pages/settings.jsx:254 +msgid "Volunteer translations" +msgstr "" + +#: src/pages/settings.jsx:265 +msgid "Posting" +msgstr "" + +#: src/pages/settings.jsx:272 +msgid "Default visibility" +msgstr "" + +#: src/pages/settings.jsx:273 +#: src/pages/settings.jsx:319 +msgid "Synced" +msgstr "" + +#: src/pages/settings.jsx:298 +msgid "Failed to update posting privacy" +msgstr "" + +#: src/pages/settings.jsx:321 +msgid "Synced to your instance server's settings. <0>Go to your instance ({instance}) for more settings.</0>" +msgstr "" + +#: src/pages/settings.jsx:336 +msgid "Experiments" +msgstr "" + +#: src/pages/settings.jsx:349 +msgid "Auto refresh timeline posts" +msgstr "自動更新時間軸" + +#: src/pages/settings.jsx:361 +msgid "Boosts carousel" +msgstr "" + +#: src/pages/settings.jsx:377 +msgid "Post translation" +msgstr "" + +#: src/pages/settings.jsx:388 +msgid "Translate to" +msgstr "翻譯為" + +#: src/pages/settings.jsx:399 +msgid "System language ({systemTargetLanguageText})" +msgstr "" + +#: src/pages/settings.jsx:425 +msgid "{0, plural, =0 {Hide \"Translate\" button for:} other {Hide \"Translate\" button for (#):}}" +msgstr "" + +#: src/pages/settings.jsx:479 +msgid "Note: This feature uses external translation services, powered by <0>Lingva API</0> & <1>Lingva Translate</1>." +msgstr "" + +#: src/pages/settings.jsx:513 +msgid "Auto inline translation" +msgstr "" + +#: src/pages/settings.jsx:517 +msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll." +msgstr "" + +#: src/pages/settings.jsx:537 +msgid "GIF Picker for composer" +msgstr "" + +#: src/pages/settings.jsx:541 +msgid "Note: This feature uses external GIF search service, powered by <0>GIPHY</0>. G-rated (suitable for viewing by all ages), tracking parameters are stripped, referrer information is omitted from requests, but search queries and IP address information will still reach their servers." +msgstr "" + +#: src/pages/settings.jsx:570 +msgid "Image description generator" +msgstr "" + +#: src/pages/settings.jsx:575 +msgid "Only for new images while composing new posts." +msgstr "" + +#: src/pages/settings.jsx:582 +msgid "Note: This feature uses external AI service, powered by <0>img-alt-api</0>. May not work well. Only for images and in English." +msgstr "" + +#: src/pages/settings.jsx:608 +msgid "Server-side grouped notifications" +msgstr "" + +#: src/pages/settings.jsx:612 +msgid "Alpha-stage feature. Potentially improved grouping window but basic grouping logic." +msgstr "" + +#: src/pages/settings.jsx:633 +msgid "\"Cloud\" import/export for shortcuts settings" +msgstr "" + +#: src/pages/settings.jsx:638 +msgid "⚠️⚠️⚠️ Very experimental.<0/>Stored in your own profile’s notes. Profile (private) notes are mainly used for other profiles, and hidden for own profile." +msgstr "" + +#: src/pages/settings.jsx:649 +msgid "Note: This feature uses currently-logged-in instance server API." +msgstr "" + +#: src/pages/settings.jsx:666 +msgid "Cloak mode <0>(<1>Text</1> → <2>████</2>)</0>" +msgstr "" + +#: src/pages/settings.jsx:675 +msgid "Replace text as blocks, useful when taking screenshots, for privacy reasons." +msgstr "" + +#: src/pages/settings.jsx:700 +msgid "About" +msgstr "" + +#: src/pages/settings.jsx:739 +msgid "<0>Built</0> by <1>@cheeaun</1>" +msgstr "" + +#: src/pages/settings.jsx:768 +msgid "Sponsor" +msgstr "" + +#: src/pages/settings.jsx:776 +msgid "Donate" +msgstr "" + +#: src/pages/settings.jsx:792 +msgid "Privacy Policy" +msgstr "" + +#: src/pages/settings.jsx:799 +msgid "<0>Site:</0> {0}" +msgstr "" + +#: src/pages/settings.jsx:806 +msgid "<0>Version:</0> <1/> {0}" +msgstr "" + +#: src/pages/settings.jsx:821 +msgid "Version string copied" +msgstr "" + +#: src/pages/settings.jsx:824 +msgid "Unable to copy version string" +msgstr "" + +#: src/pages/settings.jsx:1058 +#: src/pages/settings.jsx:1063 +msgid "Failed to update subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1069 +msgid "Failed to remove subscription. Please try again." +msgstr "" + +#: src/pages/settings.jsx:1076 +msgid "Push Notifications (beta)" +msgstr "" + +#: src/pages/settings.jsx:1098 +msgid "Push notifications are blocked. Please enable them in your browser settings." +msgstr "" + +#: src/pages/settings.jsx:1107 +msgid "Allow from <0>{0}</0>" +msgstr "" + +#: src/pages/settings.jsx:1116 +msgid "anyone" +msgstr "" + +#: src/pages/settings.jsx:1120 +msgid "people I follow" +msgstr "" + +#: src/pages/settings.jsx:1124 +msgid "followers" +msgstr "" + +#: src/pages/settings.jsx:1157 +msgid "Follows" +msgstr "" + +#: src/pages/settings.jsx:1165 +msgid "Polls" +msgstr "" + +#: src/pages/settings.jsx:1169 +msgid "Post edits" +msgstr "" + +#: src/pages/settings.jsx:1190 +msgid "Push permission was not granted since your last login. You'll need to <0><1>log in</1> again to grant push permission</0>." +msgstr "" + +#: src/pages/settings.jsx:1206 +msgid "NOTE: Push notifications only work for <0>one account</0>." +msgstr "" + +#. js-lingui-explicit-id +#: src/pages/status.jsx:597 +#: src/pages/status.jsx:1131 +msgid "post.title" +msgstr "" + +#: src/pages/status.jsx:822 +msgid "You're not logged in. Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:842 +msgid "This post is from another instance (<0>{instance}</0>). Interactions (reply, boost, etc) are not possible." +msgstr "" + +#: src/pages/status.jsx:870 +msgid "Error: {e}" +msgstr "" + +#: src/pages/status.jsx:877 +msgid "Switch to my instance to enable interactions" +msgstr "" + +#: src/pages/status.jsx:979 +msgid "Unable to load replies." +msgstr "" + +#: src/pages/status.jsx:1091 +msgid "Back" +msgstr "" + +#: src/pages/status.jsx:1122 +msgid "Go to main post" +msgstr "" + +#: src/pages/status.jsx:1145 +msgid "{0} posts above ‒ Go to top" +msgstr "" + +#: src/pages/status.jsx:1188 +#: src/pages/status.jsx:1251 +msgid "Switch to Side Peek view" +msgstr "" + +#: src/pages/status.jsx:1252 +msgid "Switch to Full view" +msgstr "" + +#: src/pages/status.jsx:1270 +msgid "Show all sensitive content" +msgstr "" + +#: src/pages/status.jsx:1275 +msgid "Experimental" +msgstr "" + +#: src/pages/status.jsx:1284 +msgid "Unable to switch" +msgstr "" + +#: src/pages/status.jsx:1291 +msgid "Switch to post's instance ({0})" +msgstr "" + +#: src/pages/status.jsx:1294 +msgid "Switch to post's instance" +msgstr "" + +#: src/pages/status.jsx:1352 +msgid "Unable to load post" +msgstr "" + +#: src/pages/status.jsx:1487 +msgid "{0, plural, one {# reply} other {<0>{1}</0> replies}}" +msgstr "" + +#: src/pages/status.jsx:1505 +msgid "{totalComments, plural, one {# comment} other {<0>{0}</0> comments}}" +msgstr "" + +#: src/pages/status.jsx:1527 +msgid "View post with its replies" +msgstr "" + +#: src/pages/trending.jsx:71 +msgid "Trending ({instance})" +msgstr "" + +#: src/pages/trending.jsx:228 +msgid "Trending News" +msgstr "" + +#. By [Author] +#: src/pages/trending.jsx:347 +msgid "By {0}" +msgstr "" + +#: src/pages/trending.jsx:408 +msgid "Back to showing trending posts" +msgstr "" + +#: src/pages/trending.jsx:413 +msgid "Showing posts mentioning <0>{0}</0>" +msgstr "" + +#: src/pages/trending.jsx:425 +msgid "Trending posts" +msgstr "" + +#: src/pages/trending.jsx:448 +msgid "No trending posts." +msgstr "" + +#: src/pages/welcome.jsx:53 +msgid "A minimalistic opinionated Mastodon web client." +msgstr "" + +#: src/pages/welcome.jsx:64 +msgid "Log in with Mastodon" +msgstr "" + +#: src/pages/welcome.jsx:70 +msgid "Sign up" +msgstr "" + +#: src/pages/welcome.jsx:77 +msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server." +msgstr "" + +#: src/pages/welcome.jsx:94 +msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>." +msgstr "" + +#: src/pages/welcome.jsx:125 +msgid "Screenshot of Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:129 +msgid "Boosts Carousel" +msgstr "" + +#: src/pages/welcome.jsx:132 +msgid "Visually separate original posts and re-shared posts (boosted posts)." +msgstr "" + +#: src/pages/welcome.jsx:141 +msgid "Screenshot of nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:145 +msgid "Nested comments thread" +msgstr "" + +#: src/pages/welcome.jsx:148 +msgid "Effortlessly follow conversations. Semi-collapsible replies." +msgstr "" + +#: src/pages/welcome.jsx:156 +msgid "Screenshot of grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:160 +msgid "Grouped notifications" +msgstr "" + +#: src/pages/welcome.jsx:163 +msgid "Similar notifications are grouped and collapsed to reduce clutter." +msgstr "" + +#: src/pages/welcome.jsx:172 +msgid "Screenshot of multi-column UI" +msgstr "" + +#: src/pages/welcome.jsx:176 +msgid "Single or multi-column" +msgstr "" + +#: src/pages/welcome.jsx:179 +msgid "By default, single column for zen-mode seekers. Configurable multi-column for power users." +msgstr "" + +#: src/pages/welcome.jsx:188 +msgid "Screenshot of multi-hashtag timeline with a form to add more hashtags" +msgstr "" + +#: src/pages/welcome.jsx:192 +msgid "Multi-hashtag timeline" +msgstr "" + +#: src/pages/welcome.jsx:195 +msgid "Up to 5 hashtags combined into a single timeline." +msgstr "" + +#: src/utils/open-compose.js:24 +msgid "Looks like your browser is blocking popups." +msgstr "" + +#: src/utils/show-compose.js:16 +msgid "A draft post is currently minimized. Post or discard it before creating a new one." +msgstr "" + +#: src/utils/show-compose.js:21 +msgid "A post is currently open. Post or discard it before creating a new one." +msgstr "" + diff --git a/src/main.jsx b/src/main.jsx index 19a84c69..65388245 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,36 +1,30 @@ import './index.css'; - import './cloak-mode.css'; +import './polyfills'; +import { i18n } from '@lingui/core'; +import { I18nProvider } from '@lingui/react'; // Polyfill needed for Firefox < 122 // https://bugzilla.mozilla.org/show_bug.cgi?id=1423593 -import '@formatjs/intl-segmenter/polyfill'; +// import '@formatjs/intl-segmenter/polyfill'; import { render } from 'preact'; import { HashRouter } from 'react-router-dom'; import { App } from './app'; +import { initActivateLang } from './utils/lang'; + +initActivateLang(); if (import.meta.env.DEV) { import('preact/debug'); } -// AbortSignal.timeout polyfill -// Temporary fix from https://github.com/mo/abortcontroller-polyfill/issues/73#issuecomment-1541180943 -// Incorrect implementation, but should be good enough for now -if ('AbortSignal' in window) { - AbortSignal.timeout = - AbortSignal.timeout || - ((duration) => { - const controller = new AbortController(); - setTimeout(() => controller.abort(), duration); - return controller.signal; - }); -} - render( - <HashRouter> - <App /> - </HashRouter>, + <I18nProvider i18n={i18n}> + <HashRouter> + <App /> + </HashRouter> + </I18nProvider>, document.getElementById('app'), ); @@ -54,6 +48,38 @@ setTimeout(() => { } catch (e) {} }, 5000); +// Service worker cache cleanup +if ('serviceWorker' in navigator && typeof caches !== 'undefined') { + const MAX_SW_CACHE_SIZE = 50; + const IGNORE_CACHE_KEYS = ['icons']; + let clearRanOnce = false; + const FAST_INTERVAL = 10_000; // 10 seconds + const SLOW_INTERVAL = 60 * 60 * 1000; // 1 hour + async function clearCaches() { + if (window.__IDLE__) { + try { + const keys = await caches.keys(); + for (const key of keys) { + if (IGNORE_CACHE_KEYS.includes(key)) continue; + const cache = await caches.open(key); + const _keys = await cache.keys(); + if (_keys.length > MAX_SW_CACHE_SIZE) { + console.warn('Cleaning cache', key, _keys.length); + const deleteKeys = _keys.slice(MAX_SW_CACHE_SIZE); + for (const deleteKey of deleteKeys) { + await cache.delete(deleteKey); + } + } + } + clearRanOnce = true; + } catch (e) {} // Silent fail + } + // Once cleared, clear again at slower interval + setTimeout(clearCaches, clearRanOnce ? SLOW_INTERVAL : FAST_INTERVAL); + } + setTimeout(clearCaches, FAST_INTERVAL); +} + window.__CLOAK__ = () => { document.body.classList.toggle('cloak'); }; diff --git a/src/pages/404.jsx b/src/pages/404.jsx index 42bef41a..a24ff360 100644 --- a/src/pages/404.jsx +++ b/src/pages/404.jsx @@ -1,3 +1,5 @@ +// NOTE: UNUSED + import Link from '../components/link'; export default function NotFound() { diff --git a/src/pages/account-statuses.jsx b/src/pages/account-statuses.jsx index fe8034a9..453e1477 100644 --- a/src/pages/account-statuses.jsx +++ b/src/pages/account-statuses.jsx @@ -1,3 +1,5 @@ +import { t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { MenuItem } from '@szhsin/react-menu'; import { useCallback, @@ -6,6 +8,7 @@ import { useRef, useState, } from 'preact/hooks'; +import punycode from 'punycode/'; import { useParams, useSearchParams } from 'react-router-dom'; import { useSnapshot } from 'valtio'; @@ -18,8 +21,8 @@ import Timeline from '../components/timeline'; import { api } from '../utils/api'; import pmem from '../utils/pmem'; import showToast from '../utils/show-toast'; -import states from '../utils/states'; -import { saveStatus } from '../utils/states'; +import states, { saveStatus } from '../utils/states'; +import { isMediaFirstInstance } from '../utils/store-utils'; import useTitle from '../utils/useTitle'; const LIMIT = 20; @@ -67,6 +70,8 @@ function AccountStatuses() { searchOffsetRef.current = 0; }, allSearchParams); + const mediaFirst = useMemo(() => isMediaFirstInstance(), []); + const sameCurrentInstance = useMemo( () => instance === currentInstance, [instance, currentInstance], @@ -150,7 +155,7 @@ function AccountStatuses() { } } - const results = []; + let results = []; if (firstLoad) { const { value } = await masto.v1.accounts .$select(id) @@ -185,12 +190,32 @@ function AccountStatuses() { limit: LIMIT, exclude_replies: excludeReplies, exclude_reblogs: excludeBoosts, - only_media: media, + only_media: media || undefined, tagged, }); } const { value, done } = await accountStatusesIterator.current.next(); if (value?.length) { + // Check if value is same as pinned post (results) + // If the index for every post is the same, means API might not support pinned posts + if (results.length) { + let pinnedStatusesIds = []; + if (results[0]?.type === 'pinned') { + pinnedStatusesIds = results[0].id; + } else { + pinnedStatusesIds = results + .filter((status) => status._pinned) + .map((status) => status.id); + } + const containsAllPinned = pinnedStatusesIds.every((postId) => + value.some((status) => status.id === postId), + ); + if (containsAllPinned) { + // Remove pinned posts + results = []; + } + } + results.push(...value); value.forEach((item) => { @@ -204,29 +229,32 @@ function AccountStatuses() { } const [featuredTags, setFeaturedTags] = useState([]); - useTitle( - account?.acct - ? `${account?.displayName ? account.displayName + ' ' : ''}@${ - account.acct - }${ - !excludeReplies - ? ' (+ Replies)' - : excludeBoosts - ? ' (- Boosts)' - : tagged - ? ` (#${tagged})` - : media - ? ' (Media)' - : month - ? ` (${new Date(month).toLocaleString('default', { - month: 'long', - year: 'numeric', - })})` - : '' - }` - : 'Account posts', - '/:instance?/a/:id', - ); + const { i18n } = useLingui(); + let title = t`Account posts`; + if (account?.acct) { + const acctDisplay = (/@/.test(account.acct) ? '' : '@') + account.acct; + const accountDisplay = account?.displayName + ? `${account.displayName} (${acctDisplay})` + : `${acctDisplay}`; + if (!excludeReplies) { + title = t`${accountDisplay} (+ Replies)`; + } else if (excludeBoosts) { + title = t`${accountDisplay} (- Boosts)`; + } else if (tagged) { + title = t`${accountDisplay} (#${tagged})`; + } else if (media) { + title = t`${accountDisplay} (Media)`; + } else if (month) { + const monthYear = new Date(month).toLocaleString(i18n.locale, { + month: 'long', + year: 'numeric', + }); + title = t`${accountDisplay} (${monthYear})`; + } else { + title = accountDisplay; + } + } + useTitle(title, '/:instance?/a/:id'); const fetchAccountPromiseRef = useRef(); const fetchAccount = useCallback(() => { @@ -245,17 +273,21 @@ function AccountStatuses() { } catch (e) { console.error(e); } - try { - const featuredTags = await masto.v1.accounts - .$select(id) - .featuredTags.list(); - console.log({ featuredTags }); - setFeaturedTags(featuredTags); - } catch (e) { - console.error(e); + // No need, because the whole filter bar is hidden + // TODO: Revisit this + if (!mediaFirst) { + try { + const featuredTags = await masto.v1.accounts + .$select(id) + .featuredTags.list(); + console.log({ featuredTags }); + setFeaturedTags(featuredTags); + } catch (e) { + console.error(e); + } } })(); - }, [id]); + }, [id, mediaFirst]); const { displayName, acct, emojis } = account || {}; @@ -274,95 +306,131 @@ function AccountStatuses() { authenticated={authenticated} standalone /> - <div - class="filter-bar" - ref={filterBarRef} - style={{ - position: 'relative', - }} - > - {filtered ? ( + {!mediaFirst && ( + <div + class="filter-bar" + ref={filterBarRef} + style={{ + position: 'relative', + }} + > + {filtered ? ( + <Link + to={`/${instance}/a/${id}`} + class="insignificant filter-clear" + title={t`Clear filters`} + key="clear-filters" + > + <Icon icon="x" size="l" alt={t`Clear`} /> + </Link> + ) : ( + <Icon + icon="filter" + class="insignificant" + size="l" + alt={t`Filters`} + /> + )} <Link - to={`/${instance}/a/${id}`} - class="insignificant filter-clear" - title="Clear filters" - key="clear-filters" - > - <Icon icon="x" size="l" /> - </Link> - ) : ( - <Icon icon="filter" class="insignificant" size="l" /> - )} - <Link - to={`/${instance}/a/${id}${excludeReplies ? '?replies=1' : ''}`} - onClick={() => { - if (excludeReplies) { - showToast('Showing post with replies'); - } - }} - class={excludeReplies ? '' : 'is-active'} - > - + Replies - </Link> - <Link - to={`/${instance}/a/${id}${excludeBoosts ? '' : '?boosts=0'}`} - onClick={() => { - if (!excludeBoosts) { - showToast('Showing posts without boosts'); - } - }} - class={!excludeBoosts ? '' : 'is-active'} - > - - Boosts - </Link> - <Link - to={`/${instance}/a/${id}${media ? '' : '?media=1'}`} - onClick={() => { - if (!media) { - showToast('Showing posts with media'); - } - }} - class={media ? 'is-active' : ''} - > - Media - </Link> - {featuredTags.map((tag) => ( - <Link - key={tag.id} - to={`/${instance}/a/${id}${ - tagged === tag.name - ? '' - : `?tagged=${encodeURIComponent(tag.name)}` - }`} + to={`/${instance}/a/${id}${excludeReplies ? '?replies=1' : ''}`} onClick={() => { - if (tagged !== tag.name) { - showToast(`Showing posts tagged with #${tag.name}`); + if (excludeReplies) { + showToast(t`Showing post with replies`); } }} - class={tagged === tag.name ? 'is-active' : ''} + class={excludeReplies ? '' : 'is-active'} > - <span> - <span class="more-insignificant">#</span> - {tag.name} - </span> - { - // The count differs based on instance 😅 - } - {/* <span class="filter-count">{tag.statusesCount}</span> */} + <Trans>+ Replies</Trans> </Link> - ))} - {searchEnabled && - (supportsInputMonth ? ( - <label class={`filter-field ${month ? 'is-active' : ''}`}> - <Icon icon="month" size="l" /> - <input - type="month" + <Link + to={`/${instance}/a/${id}${excludeBoosts ? '' : '?boosts=0'}`} + onClick={() => { + if (!excludeBoosts) { + showToast(t`Showing posts without boosts`); + } + }} + class={!excludeBoosts ? '' : 'is-active'} + > + <Trans>- Boosts</Trans> + </Link> + <Link + to={`/${instance}/a/${id}${media ? '' : '?media=1'}`} + onClick={() => { + if (!media) { + showToast(t`Showing posts with media`); + } + }} + class={media ? 'is-active' : ''} + > + <Trans>Media</Trans> + </Link> + {featuredTags.map((tag) => ( + <Link + key={tag.id} + to={`/${instance}/a/${id}${ + tagged === tag.name + ? '' + : `?tagged=${encodeURIComponent(tag.name)}` + }`} + onClick={() => { + if (tagged !== tag.name) { + showToast(t`Showing posts tagged with #${tag.name}`); + } + }} + class={tagged === tag.name ? 'is-active' : ''} + > + <span> + <span class="more-insignificant">#</span> + {tag.name} + </span> + { + // The count differs based on instance 😅 + } + {/* <span class="filter-count">{tag.statusesCount}</span> */} + </Link> + ))} + {searchEnabled && + (supportsInputMonth ? ( + <label class={`filter-field ${month ? 'is-active' : ''}`}> + <Icon icon="month" size="l" /> + <input + type="month" + disabled={!account?.acct} + value={month || ''} + min={MIN_YEAR_MONTH} + max={new Date().toISOString().slice(0, 7)} + onInput={(e) => { + const { value, validity } = e.currentTarget; + if (!validity.valid) return; + setSearchParams( + value + ? { + month: value, + } + : {}, + ); + const [year, month] = value.split('-'); + const monthIndex = parseInt(month, 10) - 1; + const date = new Date(year, monthIndex); + showToast( + t`Showing posts in ${date.toLocaleString(i18n.locale, { + month: 'long', + year: 'numeric', + })}`, + ); + }} + /> + </label> + ) : ( + // Fallback to <select> for month and <input type="number"> for year + <MonthPicker + class={`filter-field ${month ? 'is-active' : ''}`} disabled={!account?.acct} value={month || ''} min={MIN_YEAR_MONTH} max={new Date().toISOString().slice(0, 7)} onInput={(e) => { - const { value, validity } = e.currentTarget; + const { value, validity } = e; if (!validity.valid) return; setSearchParams( value @@ -371,40 +439,11 @@ function AccountStatuses() { } : {}, ); - const [year, month] = value.split('-'); - const monthIndex = parseInt(month, 10) - 1; - const date = new Date(year, monthIndex); - showToast( - `Showing posts in ${date.toLocaleString('default', { - month: 'long', - year: 'numeric', - })}`, - ); }} /> - </label> - ) : ( - // Fallback to <select> for month and <input type="number"> for year - <MonthPicker - class={`filter-field ${month ? 'is-active' : ''}`} - disabled={!account?.acct} - value={month || ''} - min={MIN_YEAR_MONTH} - max={new Date().toISOString().slice(0, 7)} - onInput={(e) => { - const { value, validity } = e; - if (!validity.valid) return; - setSearchParams( - value - ? { - month: value, - } - : {}, - ); - }} - /> - ))} - </div> + ))} + </div> + )} </> ); }, [ @@ -433,7 +472,7 @@ function AccountStatuses() { const accountInstance = useMemo(() => { if (!account?.url) return null; - const domain = new URL(account.url).hostname; + const domain = URL.parse(account.url).hostname; return domain; }, [account]); const sameInstance = instance === accountInstance; @@ -442,7 +481,7 @@ function AccountStatuses() { return ( <Timeline key={id} - title={`${account?.acct ? '@' + account.acct : 'Posts'}`} + title={`${account?.acct ? '@' + account.acct : t`Posts`}`} titleComponent={ <h1 class="header-double-lines header-account" @@ -457,17 +496,17 @@ function AccountStatuses() { <EmojiText text={displayName} emojis={emojis} /> </b> <div> - <span>@{acct}</span> + <span class="bidi-isolate">@{acct}</span> </div> </h1> } id="account-statuses" instance={instance} - emptyText="Nothing to see here yet." - errorText="Unable to load posts" + emptyText={t`Nothing to see here yet.`} + errorText={t`Unable to load posts`} fetchItems={fetchAccountStatuses} useItemID - view={media ? 'media' : undefined} + view={media || mediaFirst ? 'media' : undefined} boostsCarousel={snapStates.settings.boostsCarousel} timelineStart={TimelineStart} refresh={[ @@ -486,7 +525,7 @@ function AccountStatuses() { position="anchor" menuButton={ <button type="button" class="plain"> - <Icon icon="more" size="l" /> + <Icon icon="more" size="l" alt={t`More`} /> </button> } > @@ -505,14 +544,22 @@ function AccountStatuses() { location.hash = `/${accountInstance}/a/${id}`; } catch (e) { console.error(e); - alert('Unable to fetch account info'); + alert(t`Unable to fetch account info`); } })(); }} > <Icon icon="transfer" />{' '} <small class="menu-double-lines"> - Switch to account's instance (<b>{accountInstance}</b>) + <Trans> + Switch to account's instance{' '} + {accountInstance ? ( + <> + {' '} + (<b>{punycode.toUnicode(accountInstance)}</b>) + </> + ) : null} + </Trans> </small> </MenuItem> {!sameCurrentInstance && ( @@ -527,14 +574,16 @@ function AccountStatuses() { location.hash = `/${currentInstance}/a/${id}`; } catch (e) { console.error(e); - alert('Unable to fetch account info'); + alert(t`Unable to fetch account info`); } })(); }} > <Icon icon="transfer" />{' '} <small class="menu-double-lines"> - Switch to my instance (<b>{currentInstance}</b>) + <Trans> + Switch to my instance (<b>{currentInstance}</b>) + </Trans> </small> </MenuItem> )} @@ -545,6 +594,7 @@ function AccountStatuses() { } function MonthPicker(props) { + const { i18n } = useLingui(); const { class: className, disabled, @@ -592,7 +642,9 @@ function MonthPicker(props) { }); }} > - <option value="">Month</option> + <option value=""> + <Trans>Month</Trans> + </option> <option disabled>-----</option> {Array.from({ length: 12 }, (_, i) => ( <option @@ -602,7 +654,7 @@ function MonthPicker(props) { } key={i} > - {new Date(0, i).toLocaleString('default', { + {new Date(0, i).toLocaleString(i18n.locale, { month: 'long', })} </option> diff --git a/src/pages/accounts.css b/src/pages/accounts.css index 0848f1be..d29e3ac2 100644 --- a/src/pages/accounts.css +++ b/src/pages/accounts.css @@ -28,7 +28,7 @@ } #accounts-container section > ul > li .current { - margin-right: 8px; + margin-inline-end: 8px; color: var(--green-color); opacity: 0.1; } @@ -47,7 +47,7 @@ } #accounts-container .avatar { - margin-right: 8px; + margin-inline-end: 8px; } #accounts-container .accounts-list li div { diff --git a/src/pages/accounts.jsx b/src/pages/accounts.jsx index 5d57ba21..2391898b 100644 --- a/src/pages/accounts.jsx +++ b/src/pages/accounts.jsx @@ -1,24 +1,29 @@ import './accounts.css'; import { useAutoAnimate } from '@formkit/auto-animate/preact'; +import { t, Trans } from '@lingui/macro'; import { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu'; import { useReducer } from 'preact/hooks'; import Avatar from '../components/avatar'; import Icon from '../components/icon'; import Link from '../components/link'; -import Menu2 from '../components/menu2'; import MenuConfirm from '../components/menu-confirm'; +import MenuLink from '../components/menu-link'; +import Menu2 from '../components/menu2'; import NameText from '../components/name-text'; import { api } from '../utils/api'; import states from '../utils/states'; import store from '../utils/store'; +import { getCurrentAccountID, setCurrentAccountID } from '../utils/store-utils'; + +const isStandalone = window.matchMedia('(display-mode: standalone)').matches; function Accounts({ onClose }) { const { masto } = api(); // Accounts const accounts = store.local.getJSON('accounts'); - const currentAccount = store.session.get('currentAccount'); + const currentAccount = getCurrentAccountID(); const moreThanOneAccount = accounts.length > 1; const [_, reload] = useReducer((x) => x + 1, 0); @@ -28,11 +33,13 @@ function Accounts({ onClose }) { <div id="accounts-container" class="sheet" tabIndex="-1"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header class="header-grid"> - <h2>Accounts</h2> + <h2> + <Trans>Accounts</Trans> + </h2> </header> <main> <section> @@ -45,7 +52,7 @@ function Accounts({ onClose }) { <div> {moreThanOneAccount && ( <span class={`current ${isCurrent ? 'is-current' : ''}`}> - <Icon icon="check-circle" alt="Current" /> + <Icon icon="check-circle" alt={t`Current`} /> </span> )} <Avatar @@ -81,7 +88,7 @@ function Accounts({ onClose }) { if (isCurrent) { states.showAccount = `${account.info.username}@${account.instanceURL}`; } else { - store.session.set('currentAccount', account.info.id); + setCurrentAccountID(account.info.id); location.reload(); } }} @@ -90,28 +97,54 @@ function Accounts({ onClose }) { <div class="actions"> {isDefault && moreThanOneAccount && ( <> - <span class="tag">Default</span>{' '} + <span class="tag"> + <Trans>Default</Trans> + </span>{' '} </> )} <Menu2 align="end" menuButton={ - <button - type="button" - title="More" - class="plain more-button" - > - <Icon icon="more" size="l" alt="More" /> + <button type="button" class="plain more-button"> + <Icon icon="more" size="l" alt={t`More`} /> </button> } > + {moreThanOneAccount && ( + <> + <MenuItem + disabled={isCurrent} + onClick={() => { + setCurrentAccountID(account.info.id); + location.reload(); + }} + > + <Icon icon="transfer" />{' '} + <Trans>Switch to this account</Trans> + </MenuItem> + {!isStandalone && !isCurrent && ( + <MenuLink + href={`./?account=${account.info.id}`} + target="_blank" + > + <Icon icon="external" /> + <span> + <Trans>Switch in new tab/window</Trans> + </span> + </MenuLink> + )} + <MenuDivider /> + </> + )} <MenuItem onClick={() => { states.showAccount = `${account.info.username}@${account.instanceURL}`; }} > <Icon icon="user" /> - <span>View profile…</span> + <span> + <Trans>View profile…</Trans> + </span> </MenuItem> <MenuDivider /> {moreThanOneAccount && ( @@ -126,7 +159,9 @@ function Accounts({ onClose }) { }} > <Icon icon="check-circle" /> - <span>Set as default</span> + <span> + <Trans>Set as default</Trans> + </span> </MenuItem> )} <MenuConfirm @@ -134,7 +169,15 @@ function Accounts({ onClose }) { confirmLabel={ <> <Icon icon="exit" /> - <span>Log out @{account.info.acct}?</span> + <span> + <Trans> + Log out{' '} + <span class="bidi-isolate"> + @{account.info.acct} + </span> + ? + </Trans> + </span> </> } disabled={!isCurrent} @@ -149,7 +192,9 @@ function Accounts({ onClose }) { }} > <Icon icon="exit" /> - <span>Log out…</span> + <span> + <Trans>Log out…</Trans> + </span> </MenuConfirm> </Menu2> </div> @@ -159,14 +204,19 @@ function Accounts({ onClose }) { </ul> <p> <Link to="/login" class="button plain2" onClick={onClose}> - <Icon icon="plus" /> <span>Add an existing account</span> + <Icon icon="plus" />{' '} + <span> + <Trans>Add an existing account</Trans> + </span> </Link> </p> {moreThanOneAccount && ( <p> <small> - Note: <i>Default</i> account will always be used for first load. - Switched accounts will persist during the session. + <Trans> + Note: <i>Default</i> account will always be used for first + load. Switched accounts will persist during the session. + </Trans> </small> </p> )} diff --git a/src/pages/annual-report.css b/src/pages/annual-report.css new file mode 100644 index 00000000..be765301 --- /dev/null +++ b/src/pages/annual-report.css @@ -0,0 +1,77 @@ +#annual-report-page { + .report { + background-color: var(--bg-color); + border: 16px ridge var(--bg-faded-color); + box-shadow: 0 0 0 2px var(--bg-color); + padding: 16px; + margin: 80px auto; + max-width: var(--main-width); + font-family: var(--monospace-font); + font-variant-numeric: slashed-zero; + font-feature-settings: 'ss01'; + font-variant-numeric: tabular-nums; + min-height: 80vh; + + h1 { + margin: 0; + padding: 0; + } + + dt { + font-weight: bold; + font-size: larger; + } + + dd { + margin: 0 0 2em; + padding: 0; + overflow: auto; + } + + table { + width: 100%; + + td, th { + vertical-align: top; + } + + th { + font-weight: normal; + text-align: start; + color: var(--text-insignificant-color); + text-transform: uppercase; + } + + tr > * { + border-top: 1px dashed var(--outline-color); + } + } + + .report-topStatuses { + dt { + font-size: var(--text-size); + } + + dd { + margin-block-end: 1em; + + > a { + display: block; + color: inherit; + text-decoration: none; + border: 2px dashed var(--outline-stronger-color); + + &:is(:hover, :focus) { + border-color: var(--text-color); + } + } + + .status { + pointer-events: none; + font-size: calc(var(--text-size) * .8); + } + } + + } + } +} \ No newline at end of file diff --git a/src/pages/annual-report.jsx b/src/pages/annual-report.jsx new file mode 100644 index 00000000..ee71ef40 --- /dev/null +++ b/src/pages/annual-report.jsx @@ -0,0 +1,141 @@ +import { t, Trans } from '@lingui/macro'; + +import './annual-report.css'; + +import { useEffect, useState } from 'preact/hooks'; +import { useParams } from 'react-router-dom'; + +import Link from '../components/link'; +import Loader from '../components/loader'; +import NameText from '../components/name-text'; +import Status from '../components/status'; +import { api } from '../utils/api'; +import useTitle from '../utils/useTitle'; + +export default function AnnualReport() { + const params = useParams(); + const { year } = params; + useTitle(year ? `Annual Report: ${year}` : 'Annual Report'); + const { masto, instance } = api(); + const [results, setResults] = useState(null); + const [uiState, setUIState] = useState('default'); + + useEffect(() => { + if (year) { + (async () => { + setUIState('loading'); + const results = await masto.v1.annualReports.$select(year).fetch(); + console.log('REPORT', results); + setResults(results); + setUIState('default'); + })(); + } + }, [year]); + + const { accounts, annualReports, statuses } = results || {}; + const report = annualReports?.find((report) => report.year == year)?.data; + + return ( + <div id="annual-report-page" class="deck-container" tabIndex="-1"> + <div class="report"> + <h1>{year} #Wrapstodon</h1> + {uiState === 'loading' && ( + <p> + <Loader abrupt /> <Trans>Loading…</Trans> + </p> + )} + {!!report && ( + <dl> + {Object.entries(report).map(([key, value]) => ( + <> + <dt>{key}</dt> + <dd class={`report-${key}`}> + {Array.isArray(value) ? ( + <table> + <thead> + <tr> + {Object.keys(value[0]).map((key) => ( + <th>{key}</th> + ))} + </tr> + </thead> + <tbody> + {value.map((item) => ( + <tr> + {Object.entries(item).map(([k, value]) => ( + <td> + {value && + /(accountId)/i.test(k) && + /^(mostRebloggedAccounts|commonlyInteractedWithAccounts)$/i.test( + key, + ) ? ( + <NameText + account={accounts?.find( + (a) => a.id === value, + )} + showAvatar + /> + ) : ( + value + )} + </td> + ))} + </tr> + ))} + </tbody> + </table> + ) : typeof value === 'object' ? ( + /^(topStatuses)$/i.test(key) ? ( + <dl> + {Object.entries(value).map(([k, value]) => ( + <> + <dt>{k}</dt> + <dd> + {value && ( + <Link to={`/${instance}/s/${value}`}> + <Status + status={statuses?.find( + (s) => s.id === value, + )} + size="s" + readOnly + /> + </Link> + )} + </dd> + </> + ))} + </dl> + ) : ( + <table> + <tbody> + {Object.entries(value).map(([k, value]) => ( + <tr> + <th>{k}</th> + <td>{value}</td> + </tr> + ))} + </tbody> + </table> + ) + ) : typeof value === 'string' ? ( + value + ) : ( + // Last resort + JSON.stringify(value, null, 2) + )} + </dd> + </> + ))} + </dl> + )} + </div> + <hr /> + <p style={{ textAlign: 'center' }}> + <Link to="/"> + <Trans>Go home</Trans> + </Link> + </p> + </div> + ); +} diff --git a/src/pages/bookmarks.jsx b/src/pages/bookmarks.jsx index f811aa7a..eaec0e1a 100644 --- a/src/pages/bookmarks.jsx +++ b/src/pages/bookmarks.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { useRef } from 'preact/hooks'; import Timeline from '../components/timeline'; @@ -7,7 +8,7 @@ import useTitle from '../utils/useTitle'; const LIMIT = 20; function Bookmarks() { - useTitle('Bookmarks', '/b'); + useTitle(t`Bookmarks`, '/bookmarks'); const { masto, instance } = api(); const bookmarksIterator = useRef(); async function fetchBookmarks(firstLoad) { @@ -19,10 +20,10 @@ function Bookmarks() { return ( <Timeline - title="Bookmarks" + title={t`Bookmarks`} id="bookmarks" - emptyText="No bookmarks yet. Go bookmark something!" - errorText="Unable to load bookmarks" + emptyText={t`No bookmarks yet. Go bookmark something!`} + errorText={t`Unable to load bookmarks.`} instance={instance} fetchItems={fetchBookmarks} /> diff --git a/src/pages/catchup.css b/src/pages/catchup.css index 2a52e42c..815ad0ff 100644 --- a/src/pages/catchup.css +++ b/src/pages/catchup.css @@ -111,7 +111,7 @@ margin-bottom: 8px; align-items: center; gap: 8px; - text-align: left; + text-align: start; justify-content: space-between; a { @@ -146,6 +146,9 @@ input[type='range'] { accent-color: var(--link-color); direction: rtl; + &:dir(rtl) { + direction: ltr; + } } } @@ -251,7 +254,7 @@ overflow-y: hidden; max-width: 100%; mask-image: linear-gradient( - to right, + var(--to-forward), transparent, black 16px calc(100% - 16px), transparent @@ -315,7 +318,7 @@ .count { font-size: 70%; - margin-left: 4px; + margin-inline-start: 4px; background-color: var(--bg-color); padding: 4px 6px; border-radius: 12px; @@ -386,7 +389,7 @@ .count { position: absolute; - right: -4px; + inset-inline-end: -4px; top: -4px; font-size: 10px; background-color: var(--bg-color); @@ -406,7 +409,7 @@ overflow: hidden; text-align: center; mask-image: linear-gradient( - to right, + var(--to-forward), black calc(100% - 0.5em), transparent 100% ); @@ -478,13 +481,13 @@ > li { &:first-child > a { - border-top-left-radius: var(--corner-radius); - border-top-right-radius: var(--corner-radius); + border-start-start-radius: var(--corner-radius); + border-start-end-radius: var(--corner-radius); } &:last-child > a { - border-bottom-left-radius: var(--corner-radius); - border-bottom-right-radius: var(--corner-radius); + border-end-start-radius: var(--corner-radius); + border-end-end-radius: var(--corner-radius); } } } @@ -502,13 +505,13 @@ @media (min-width: 40em) { &.separator + li a { - border-top-left-radius: var(--corner-radius); - border-top-right-radius: var(--corner-radius); + border-start-start-radius: var(--corner-radius); + border-start-end-radius: var(--corner-radius); } &:has(+ .separator) a { - border-bottom-left-radius: var(--corner-radius); - border-bottom-right-radius: var(--corner-radius); + border-end-start-radius: var(--corner-radius); + border-end-end-radius: var(--corner-radius); } } @@ -525,10 +528,13 @@ background-color: var(--bg-faded-color); box-shadow: 0 8px 16px -8px var(--drop-shadow-color), inset 0 1px var(--bg-color); - outline: 1px solid var(--outline-color); text-shadow: 0 1px var(--bg-color); } + &:hover:not(:focus-visible) { + outline: 1px solid var(--outline-color); + } + &:active { filter: brightness(0.95); box-shadow: none; @@ -569,8 +575,12 @@ 'author meta' 'content content'; /* align-items: center; */ + --bg-gradient-angle: 140deg; + &:dir(rtl) { + --bg-gradient-angle: -140deg; + } background-image: linear-gradient( - 140deg, + var(--bg-gradient-angle), var(--post-bg-color), transparent min(160px, 50%) ); @@ -611,7 +621,7 @@ } &.visibility-direct { --yellow-stripes: repeating-linear-gradient( - -45deg, + 135deg, var(--reply-to-faded-color), var(--reply-to-faded-color) 10px, var(--reply-to-faded-color) 10px, @@ -626,10 +636,24 @@ gap: 4px; align-items: center; flex-shrink: 0; + min-height: 24px; - .icon { + > .avatar { + outline: 1px solid var(--bg-blur-color); + } + + > .avatar ~ .avatar { + margin-inline-start: -8px; + } + + > .icon { color: var(--reblog-color); } + + > .name-text { + opacity: 0.75; + filter: grayscale(0.75); + } } .post-author { @@ -638,10 +662,11 @@ white-space: nowrap; overflow: hidden; mask-image: linear-gradient( - to right, + var(--to-forward), black calc(100% - 1em), transparent 100% ); + padding-top: 0.1em; @media (min-width: 40em) { --width: 25vw; @@ -673,7 +698,7 @@ &:is(.catchup-group-account, .catchup-selected-author):is( .catchup-filter-original, - .catchup-filter-reply + .catchup-filter-replies ) > li { margin-bottom: 0; @@ -796,6 +821,10 @@ text-decoration: none; text-decoration-color: transparent; color: var(--link-text-color); + + span { + text-decoration: none; + } } } @@ -854,6 +883,7 @@ position: relative; z-index: 1; animation: position-object 5s ease-in-out 5; + animation-duration: var(--anim-duration, 5s); /* @media (min-width: 40em) and (min-height: 600px) { transform: scale(3); @@ -865,12 +895,15 @@ &:has(.post-peek-media), .post-peek-media:first-child img { transform-origin: left center; + :dir(rtl) & { + transform-origin: right center; + } } } @media (max-width: 480px) { .post-peek-media:not(:last-child) { - margin-right: -24px; + margin-inline-end: -24px; box-shadow: 0 0 0 2px var(--bg-blur-color); } /* Max 10, I'm not going to code more than this */ @@ -1077,6 +1110,20 @@ dd { margin-block-end: 1em; margin-inline: 1em; + + + dd { + margin-block-start: -0.9em; + } } } + + kbd { + border-radius: 4px; + display: inline-block; + padding: 0.2em 0.3em; + margin: 1px 0; + line-height: 1; + border: 1px solid var(--outline-color); + background-color: var(--bg-faded-color); + } } diff --git a/src/pages/catchup.jsx b/src/pages/catchup.jsx index c3f2caa6..1af5aad2 100644 --- a/src/pages/catchup.jsx +++ b/src/pages/catchup.jsx @@ -2,6 +2,8 @@ import '../components/links-bar.css'; import './catchup.css'; import autoAnimate from '@formkit/auto-animate'; +import { msg, Plural, select, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { getBlurHashAverageColor } from 'fast-blurhash'; import { Fragment } from 'preact'; import { memo } from 'preact/compat'; @@ -13,6 +15,7 @@ import { useRef, useState, } from 'preact/hooks'; +import punycode from 'punycode/'; import { useHotkeys } from 'react-hotkeys-hook'; import { useSearchParams } from 'react-router-dom'; import { uid } from 'uid/single'; @@ -33,42 +36,44 @@ import db from '../utils/db'; import emojifyText from '../utils/emojify-text'; import { isFiltered } from '../utils/filters'; import htmlContentLength from '../utils/html-content-length'; +import mem from '../utils/mem'; import niceDateTime from '../utils/nice-date-time'; import shortenNumber from '../utils/shorten-number'; import showToast from '../utils/show-toast'; import states, { statusKey } from '../utils/states'; import statusPeek from '../utils/status-peek'; import store from '../utils/store'; -import { getCurrentAccountNS } from '../utils/store-utils'; +import { getCurrentAccountID, getCurrentAccountNS } from '../utils/store-utils'; +import supports from '../utils/supports'; import { assignFollowedTags } from '../utils/timeline-utils'; import useTitle from '../utils/useTitle'; const FILTER_CONTEXT = 'home'; const RANGES = [ - { label: 'last 1 hour', value: 1 }, - { label: 'last 2 hours', value: 2 }, - { label: 'last 3 hours', value: 3 }, - { label: 'last 4 hours', value: 4 }, - { label: 'last 5 hours', value: 5 }, - { label: 'last 6 hours', value: 6 }, - { label: 'last 7 hours', value: 7 }, - { label: 'last 8 hours', value: 8 }, - { label: 'last 9 hours', value: 9 }, - { label: 'last 10 hours', value: 10 }, - { label: 'last 11 hours', value: 11 }, - { label: 'last 12 hours', value: 12 }, - { label: 'beyond 12 hours', value: 13 }, + { label: msg`last 1 hour`, value: 1 }, + { label: msg`last 2 hours`, value: 2 }, + { label: msg`last 3 hours`, value: 3 }, + { label: msg`last 4 hours`, value: 4 }, + { label: msg`last 5 hours`, value: 5 }, + { label: msg`last 6 hours`, value: 6 }, + { label: msg`last 7 hours`, value: 7 }, + { label: msg`last 8 hours`, value: 8 }, + { label: msg`last 9 hours`, value: 9 }, + { label: msg`last 10 hours`, value: 10 }, + { label: msg`last 11 hours`, value: 11 }, + { label: msg`last 12 hours`, value: 12 }, + { label: msg`beyond 12 hours`, value: 13 }, ]; -const FILTER_LABELS = [ - 'Original', - 'Replies', - 'Boosts', - 'Followed tags', - 'Groups', - 'Filtered', -]; +const FILTER_KEYS = { + original: msg`Original`, + replies: msg`Replies`, + boosts: msg`Boosts`, + followedTags: msg`Followed tags`, + groups: msg`Groups`, + filtered: msg`Filtered`, +}; const FILTER_SORTS = [ 'createdAt', 'repliesCount', @@ -77,33 +82,23 @@ const FILTER_SORTS = [ 'density', ]; const FILTER_GROUPS = [null, 'account']; -const FILTER_VALUES = { - Filtered: 'filtered', - Groups: 'group', - Boosts: 'boost', - Replies: 'reply', - 'Followed tags': 'followedTags', - Original: 'original', -}; -const FILTER_CATEGORY_TEXT = { - Filtered: 'filtered posts', - Groups: 'group posts', - Boosts: 'boosts', - Replies: 'replies', - 'Followed tags': 'followed-tag posts', - Original: 'original posts', -}; -const SORT_BY_TEXT = { - // asc, desc - createdAt: ['oldest', 'latest'], - repliesCount: ['fewest replies', 'most replies'], - favouritesCount: ['fewest likes', 'most likes'], - reblogsCount: ['fewest boosts', 'most boosts'], - density: ['least dense', 'most dense'], -}; + +const DTF = mem( + (locale) => + new Intl.DateTimeFormat(locale || undefined, { + year: 'numeric', + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + }), +); function Catchup() { - useTitle('Catch-up', '/catchup'); + const { i18n, _ } = useLingui(); + const dtf = DTF(i18n.locale); + + useTitle(`Catch-up`, '/catchup'); const { masto, instance } = api(); const [searchParams, setSearchParams] = useSearchParams(); const id = searchParams.get('id'); @@ -111,10 +106,12 @@ function Catchup() { const [showTopLinks, setShowTopLinks] = useState(false); const currentAccount = useMemo(() => { - return store.session.get('currentAccount'); + return getCurrentAccountID(); }, []); const isSelf = (accountID) => accountID === currentAccount; + const supportsPixelfed = supports('@pixelfed/home-include-reblogs'); + async function fetchHome({ maxCreatedAt }) { const maxCreatedAtDate = maxCreatedAt ? new Date(maxCreatedAt) : null; console.debug('fetchHome', maxCreatedAtDate); @@ -122,6 +119,13 @@ function Catchup() { const homeIterator = masto.v1.timelines.home.list({ limit: 40 }); mainloop: while (true) { try { + if (supportsPixelfed && homeIterator.nextParams) { + if (typeof homeIterator.nextParams === 'string') { + homeIterator.nextParams += '&include_reblogs=true'; + } else { + homeIterator.nextParams.include_reblogs = true; + } + } const results = await homeIterator.next(); const { value } = results; if (value?.length) { @@ -191,6 +195,7 @@ function Catchup() { const [posts, setPosts] = useState([]); const catchupRangeRef = useRef(); + const catchupLastRef = useRef(); const NS = useMemo(() => getCurrentAccountNS(), []); const handleCatchupClick = useCallback(async ({ duration } = {}) => { const now = Date.now(); @@ -295,23 +300,23 @@ function Catchup() { }, [uiState === 'start']); const [filterCounts, links] = useMemo(() => { - let filtereds = 0, + let filtered = 0, groups = 0, boosts = 0, replies = 0, followedTags = 0, - originals = 0; + original = 0; const links = {}; for (const post of posts) { if (post._filtered) { - filtereds++; + filtered++; post.__FILTER = 'filtered'; } else if (post.group) { groups++; - post.__FILTER = 'group'; + post.__FILTER = 'groups'; } else if (post.reblog) { boosts++; - post.__FILTER = 'boost'; + post.__FILTER = 'boosts'; } else if (post._followedTags?.length) { followedTags++; post.__FILTER = 'followedTags'; @@ -320,9 +325,9 @@ function Catchup() { post.inReplyToAccountId !== post.account?.id ) { replies++; - post.__FILTER = 'reply'; + post.__FILTER = 'replies'; } else { - originals++; + original++; post.__FILTER = 'original'; } @@ -389,18 +394,18 @@ function Catchup() { return [ { - Filtered: filtereds, - Groups: groups, - Boosts: boosts, - Replies: replies, - 'Followed tags': followedTags, - Original: originals, + filtered, + groups, + boosts, + replies, + followedTags, + original, }, topLinks, ]; }, [posts]); - const [selectedFilterCategory, setSelectedFilterCategory] = useState('All'); + const [selectedFilterCategory, setSelectedFilterCategory] = useState('all'); const [selectedAuthor, setSelectedAuthor] = useState(null); const [range, setRange] = useState(1); @@ -415,8 +420,8 @@ function Catchup() { let filteredPosts = posts.filter((post) => { const postFilterMatches = - selectedFilterCategory === 'All' || - post.__FILTER === FILTER_VALUES[selectedFilterCategory]; + selectedFilterCategory === 'all' || + post.__FILTER === selectedFilterCategory; if (postFilterMatches) { authorsHash[post.account.id] = post.account; @@ -429,9 +434,28 @@ function Catchup() { return postFilterMatches; }); + // Deduplicate boosts + const boostedPosts = {}; + filteredPosts.forEach((post) => { + if (post.reblog) { + if (boostedPosts[post.reblog.id]) { + if (boostedPosts[post.reblog.id].__BOOSTERS) { + boostedPosts[post.reblog.id].__BOOSTERS.add(post.account); + } else { + boostedPosts[post.reblog.id].__BOOSTERS = new Set([post.account]); + } + post.__HIDDEN = true; + } else { + boostedPosts[post.reblog.id] = post; + } + } + }); + if (selectedAuthor && authorCountsMap.has(selectedAuthor)) { filteredPosts = filteredPosts.filter( - (post) => post.account.id === selectedAuthor, + (post) => + post.account.id === selectedAuthor || + [...(post.__BOOSTERS || [])].find((a) => a.id === selectedAuthor), ); } @@ -459,39 +483,41 @@ function Catchup() { authorCountsList.forEach((authorID, index) => { authorIndices[authorID] = index; }); - return filteredPosts.sort((a, b) => { - if (groupBy === 'account') { - const aAccountID = a.account.id; - const bAccountID = b.account.id; - const aIndex = authorIndices[aAccountID]; - const bIndex = authorIndices[bAccountID]; - const order = aIndex - bIndex; - if (order !== 0) { - return order; + return filteredPosts + .filter((post) => !post.__HIDDEN) + .sort((a, b) => { + if (groupBy === 'account') { + const aAccountID = a.account.id; + const bAccountID = b.account.id; + const aIndex = authorIndices[aAccountID]; + const bIndex = authorIndices[bAccountID]; + const order = aIndex - bIndex; + if (order !== 0) { + return order; + } } - } - if (sortBy !== 'createdAt') { - a = a.reblog || a; - b = b.reblog || b; - if (sortBy !== 'density' && a[sortBy] === b[sortBy]) { - return a.createdAt > b.createdAt ? 1 : -1; + if (sortBy !== 'createdAt') { + a = a.reblog || a; + b = b.reblog || b; + if (sortBy !== 'density' && a[sortBy] === b[sortBy]) { + return a.createdAt > b.createdAt ? 1 : -1; + } + } + if (sortBy === 'density') { + const aDensity = postDensity(a); + const bDensity = postDensity(b); + if (sortOrder === 'asc') { + return aDensity > bDensity ? 1 : -1; + } else { + return bDensity > aDensity ? 1 : -1; + } } - } - if (sortBy === 'density') { - const aDensity = postDensity(a); - const bDensity = postDensity(b); if (sortOrder === 'asc') { - return aDensity > bDensity ? 1 : -1; + return a[sortBy] > b[sortBy] ? 1 : -1; } else { - return bDensity > aDensity ? 1 : -1; + return b[sortBy] > a[sortBy] ? 1 : -1; } - } - if (sortOrder === 'asc') { - return a[sortBy] > b[sortBy] ? 1 : -1; - } else { - return b[sortBy] > a[sortBy] ? 1 : -1; - } - }); + }); }, [filteredPosts, sortBy, sortOrder, groupBy, authorCountsList]); const prevGroup = useRef(null); @@ -566,15 +592,37 @@ function Catchup() { }; let toast = showToast({ duration: 5_000, // 5 seconds - text: `Showing ${ - FILTER_CATEGORY_TEXT[selectedFilterCategory] || 'all posts' - }${authorUsername ? ` by @${authorUsername}` : ''}, ${ - SORT_BY_TEXT[sortBy][sortOrderIndex] - } first${ - !!groupBy - ? `, grouped by ${groupBy === 'account' ? groupByText[groupBy] : ''}` - : '' - }`, + // Note: I'm sorry, translators + text: t`Showing ${select(selectedFilterCategory, { + all: 'all posts', + original: 'original posts', + replies: 'replies', + boosts: 'boosts', + followedTags: 'followed tags', + groups: 'groups', + filtered: 'filtered posts', + })}, ${select(sortBy, { + createdAt: select(sortOrder, { + asc: 'oldest', + desc: 'latest', + }), + reblogsCount: select(sortOrder, { + asc: 'fewest boosts', + desc: 'most boosts', + }), + favouritesCount: select(sortOrder, { + asc: 'fewest likes', + desc: 'most likes', + }), + repliesCount: select(sortOrder, { + asc: 'fewest replies', + desc: 'most replies', + }), + density: select(sortOrder, { asc: 'least dense', desc: 'most dense' }), + })} first${select(groupBy, { + account: ', grouped by authors', + other: '', + })}`, }); return () => { toast?.hideToast?.(); @@ -614,6 +662,12 @@ function Catchup() { inline: 'center', behavior: 'smooth', }); + } else if (authorRect.top < 0) { + authorElement.scrollIntoView({ + block: 'nearest', + inline: 'nearest', + behavior: 'smooth', + }); } } } @@ -622,7 +676,7 @@ function Catchup() { const [showHelp, setShowHelp] = useState(false); const itemsSelector = '.catchup-list > li > a'; - useHotkeys( + const jRef = useHotkeys( 'j', () => { const activeItem = document.activeElement.closest(itemsSelector); @@ -666,7 +720,7 @@ function Catchup() { }, ); - useHotkeys( + const kRef = useHotkeys( 'k', () => { const activeItem = document.activeElement.closest(itemsSelector); @@ -710,34 +764,89 @@ function Catchup() { }, ); - useHotkeys( + const hlRef = useHotkeys( 'h, l', (_, handler) => { // Go next/prev selectedAuthor in authorCountsList list + const key = handler.keys[0]; if (selectedAuthor) { - const key = handler.keys[0]; const index = authorCountsList.indexOf(selectedAuthor); if (key === 'h') { if (index > 0 && index < authorCountsList.length) { setSelectedAuthor(authorCountsList[index - 1]); + scrollableRef.current?.focus(); } } else if (key === 'l') { if (index < authorCountsList.length - 1 && index >= 0) { setSelectedAuthor(authorCountsList[index + 1]); + scrollableRef.current?.focus(); } } + } else if (key === 'l') { + setSelectedAuthor(authorCountsList[0]); + scrollableRef.current?.focus(); } }, { preventDefault: true, ignoreModifiers: true, - enableOnFormTags: true, + enableOnFormTags: ['input'], }, ); + const escRef = useHotkeys( + 'esc', + () => { + setSelectedAuthor(null); + scrollableRef.current?.focus(); + }, + { + preventDefault: true, + ignoreModifiers: true, + enableOnFormTags: ['input'], + }, + ); + + const dotRef = useHotkeys( + '.', + () => { + scrollableRef.current?.scrollTo({ + top: 0, + behavior: 'smooth', + }); + }, + { + preventDefault: true, + ignoreModifiers: true, + enableOnFormTags: ['input'], + }, + ); + + const handleArrowKeys = useCallback((e) => { + const activeElement = document.activeElement; + const isRadio = + activeElement?.tagName === 'INPUT' && activeElement.type === 'radio'; + const isArrowKeys = + e.key === 'ArrowDown' || + e.key === 'ArrowUp' || + e.key === 'ArrowLeft' || + e.key === 'ArrowRight'; + if (isArrowKeys && isRadio) { + // Note: page scroll won't trigger on first arrow key press due to this. Subsequent presses will. + activeElement.blur(); + return; + } + }, []); + return ( <div - ref={scrollableRef} + ref={(node) => { + scrollableRef.current = node; + jRef(node); + kRef(node); + hlRef(node); + escRef(node); + }} id="catchup-page" class="deck-container" tabIndex="-1" @@ -759,20 +868,20 @@ function Catchup() { <NavMenu /> {uiState === 'results' && ( <Link to="/catchup" class="button plain"> - <Icon icon="history2" size="l" /> + <Icon icon="history2" size="l" alt={t`Catch-up`} /> </Link> )} {uiState === 'start' && ( <Link to="/" class="button plain"> - <Icon icon="home" size="l" /> + <Icon icon="home" size="l" alt={t`Home`} /> </Link> )} </div> <h1> {uiState !== 'start' && ( - <> + <Trans> Catch-up <sup>beta</sup> - </> + </Trans> )} </h1> <div class="header-side"> @@ -784,30 +893,37 @@ function Catchup() { setShowHelp(true); }} > - Help + <Trans>Help</Trans> </button> )} </div> </div> </header> - <main> + <main onKeyDown={handleArrowKeys}> {uiState === 'start' && ( <div class="catchup-start"> <h1> - Catch-up <sup>beta</sup> + <Trans> + Catch-up <sup>beta</sup> + </Trans> </h1> <details> - <summary>What is this?</summary> + <summary> + <Trans>What is this?</Trans> + </summary> <p> - Catch-up is a separate timeline for your followings, offering - a high-level view at a glance, with a simple, email-inspired - interface to effortlessly sort and filter through posts. + <Trans> + Catch-up is a separate timeline for your followings, + offering a high-level view at a glance, with a simple, + email-inspired interface to effortlessly sort and filter + through posts. + </Trans> </p> <img src={catchupUrl} width="1200" height="900" - alt="Preview of Catch-up UI" + alt={t`Preview of Catch-up UI`} /> <p> <button @@ -816,13 +932,17 @@ function Catchup() { e.target.closest('details').open = false; }} > - Let's catch up + <Trans>Let's catch up</Trans> </button> </p> </details> - <p>Let's catch up on the posts from your followings.</p> <p> - <b>Show me all posts from…</b> + <Trans>Let's catch up on the posts from your followings.</Trans> + </p> + <p> + <b> + <Trans>Show me all posts from…</Trans> + </b> </p> <div class="catchup-form"> <input @@ -840,11 +960,11 @@ function Catchup() { width: '8em', }} > - {RANGES[range - 1].label} + {_(RANGES[range - 1].label)} <br /> <small class="insignificant"> {range == RANGES[RANGES.length - 1].value - ? 'until the max' + ? t`until the max` : niceDateTime( new Date(Date.now() - range * 60 * 60 * 1000), )} @@ -852,69 +972,106 @@ function Catchup() { </span> <datalist id="catchup-ranges"> {RANGES.map(({ label, value }) => ( - <option value={value} label={label} /> + <option value={value} label={_(label)} /> ))} </datalist>{' '} <button type="button" onClick={() => { if (range < RANGES[RANGES.length - 1].value) { - const duration = range * 60 * 60 * 1000; + let duration; + if ( + range === RANGES[RANGES.length - 1].value && + catchupLastRef.current?.checked + ) { + duration = Date.now() - lastCatchupEndAt; + } else { + duration = range * 60 * 60 * 1000; + } handleCatchupClick({ duration }); } else { handleCatchupClick(); } }} > - Catch up + <Trans>Catch up</Trans> </button> </div> - {lastCatchupRange && range > lastCatchupRange && ( + {lastCatchupRange && range > lastCatchupRange ? ( <p class="catchup-info"> - <Icon icon="info" /> Overlaps with your last catch-up + <Icon icon="info" />{' '} + <Trans>Overlaps with your last catch-up</Trans> </p> - )} + ) : range === RANGES[RANGES.length - 1].value && + lastCatchupEndAt ? ( + <p class="catchup-info"> + <label> + <input + type="checkbox" + switch + checked + ref={catchupLastRef} + />{' '} + <Trans> + Until the last catch-up ( + {dtf.format(new Date(lastCatchupEndAt))}) + </Trans> + </label> + </p> + ) : null} <p class="insignificant"> <small> - Note: your instance might only show a maximum of 800 posts in - the Home timeline regardless of the time range. Could be less - or more. + <Trans> + Note: your instance might only show a maximum of 800 posts + in the Home timeline regardless of the time range. Could be + less or more. + </Trans> </small> </p> {!!prevCatchups?.length && ( <div class="catchup-prev"> - <p>Previously…</p> + <p> + <Trans>Previously…</Trans> + </p> <ul> {prevCatchups.map((pc) => ( <li key={pc.id}> <Link to={`/catchup?id=${pc.id}`}> <Icon icon="history2" />{' '} <span> - {formatRange( - new Date(pc.startAt), - new Date(pc.endAt), - )} + {pc.startAt + ? dtf.formatRange( + new Date(pc.startAt), + new Date(pc.endAt), + ) + : `… – ${dtf.format(new Date(pc.endAt))}`} </span> </Link>{' '} <span> <small class="ib insignificant"> - {pc.count} posts + <Plural + value={pc.count} + one="# post" + other="# posts" + /> </small>{' '} <button type="button" class="light danger small" onClick={async () => { - const yes = confirm('Remove this catch-up?'); + const yes = confirm(t`Remove this catch-up?`); if (yes) { - let t = showToast(`Removing Catch-up ${pc.id}`); + let st = showToast( + t`Removing Catch-up ${pc.id}`, + ); await db.catchup.del(pc.id); - t?.hideToast?.(); - showToast(`Catch-up ${pc.id} removed`); + st?.hideToast?.(); + showToast(t`Catch-up ${pc.id} removed`); reloadCatchups(); } }} > - <Icon icon="x" /> + <Icon icon="x" alt={t`Remove`} /> </button> </span> </li> @@ -923,8 +1080,10 @@ function Catchup() { {prevCatchups.length >= 3 && ( <p> <small> - Note: Only max 3 will be stored. The rest will be - automatically removed. + <Trans> + Note: Only max 3 will be stored. The rest will be + automatically removed. + </Trans> </small> </p> )} @@ -935,8 +1094,12 @@ function Catchup() { {uiState === 'loading' && ( <div class="ui-state catchup-start"> <Loader abrupt /> - <p class="insignificant">Fetching posts…</p> - <p class="insignificant">This might take a while.</p> + <p class="insignificant"> + <Trans>Fetching posts…</Trans> + </p> + <p class="insignificant"> + <Trans>This might take a while.</Trans> + </p> </div> )} {uiState === 'results' && ( @@ -945,7 +1108,7 @@ function Catchup() { {posts.length > 0 && ( <p> <b class="ib"> - {formatRange( + {dtf.formatRange( new Date(posts[0].createdAt), new Date(posts[posts.length - 1].createdAt), )} @@ -955,7 +1118,7 @@ function Catchup() { <aside> <button hidden={ - selectedFilterCategory === 'All' && + selectedFilterCategory === 'all' && !selectedAuthor && sortBy === 'createdAt' && sortOrder === 'asc' @@ -963,14 +1126,14 @@ function Catchup() { type="button" class="plain4 small" onClick={() => { - setSelectedFilterCategory('All'); + setSelectedFilterCategory('all'); setSelectedAuthor(null); setSortBy('createdAt'); setGroupBy(null); setSortOrder('asc'); }} > - Reset filters + <Trans>Reset filters</Trans> </button> {links?.length > 0 && ( <button @@ -978,7 +1141,7 @@ function Catchup() { class="plain small" onClick={() => setShowTopLinks(!showTopLinks)} > - Top links{' '} + <Trans>Top links</Trans>{' '} <Icon icon="chevron-down" style={{ @@ -1008,9 +1171,11 @@ function Catchup() { height, publishedAt, } = card; - const domain = new URL(url).hostname - .replace(/^www\./, '') - .replace(/\/$/, ''); + const domain = punycode.toUnicode( + URL.parse(url) + .hostname.replace(/^www\./, '') + .replace(/\/$/, ''), + ); let accentColor; if (blurhash) { const averageColor = getBlurHashAverageColor(blurhash); @@ -1028,6 +1193,7 @@ function Catchup() { href={url} target="_blank" rel="noopener noreferrer" + class="link-block" style={ accentColor ? { @@ -1066,7 +1232,12 @@ function Catchup() { )} </div> {!!title && ( - <h1 class="title" lang={language} dir="auto"> + <h1 + class="title" + lang={language} + dir="auto" + title={title} + > {title} </h1> )} @@ -1076,6 +1247,7 @@ function Catchup() { class="description" lang={language} dir="auto" + title={description} > {description} </p> @@ -1086,17 +1258,35 @@ function Catchup() { whiteSpace: 'nowrap', }} > - Shared by{' '} - {sharers.map((s) => { - const { avatarStatic, displayName } = s; - return ( - <Avatar - url={avatarStatic} - size="s" - alt={displayName} - /> - ); - })} + <Trans> + Shared by{' '} + {sharers.map((s) => { + const { avatarStatic, displayName } = s; + return ( + <button + type="button" + class="plain" + style={{ + padding: 0, + }} + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + // Reset and filter to author + const { id } = s; + setSelectedAuthor(id); + setSelectedFilterCategory('all'); + }} + > + <Avatar + url={avatarStatic} + size="s" + alt={displayName} + /> + </button> + ); + })} + </Trans> </p> </div> </article> @@ -1120,22 +1310,21 @@ function Catchup() { name="filter-cat" checked={selectedFilterCategory.toLowerCase() === 'all'} onChange={() => { - setSelectedFilterCategory('All'); + setSelectedFilterCategory('all'); }} /> - All <span class="count">{posts.length}</span> + <Trans>All</Trans> <span class="count">{posts.length}</span> </label> - {FILTER_LABELS.map( - (label) => - !!filterCounts[label] && ( + {Object.entries(FILTER_KEYS).map( + ([key, label]) => + !!filterCounts[key] && ( <label class="filter-cat" - key={label} + key={_(label)} title={ - ( - (filterCounts[label] / posts.length) * - 100 - ).toFixed(2) + '%' + ((filterCounts[key] / posts.length) * 100).toFixed( + 2, + ) + '%' } > <input @@ -1143,15 +1332,20 @@ function Catchup() { name="filter-cat" checked={ selectedFilterCategory.toLowerCase() === - label.toLowerCase() + key.toLowerCase() } onChange={() => { - setSelectedFilterCategory(label); + setSelectedFilterCategory(key); + if (key === 'boosts') { + setSortBy('reblogsCount'); + setSortOrder('desc'); + setGroupBy(null); + } // setSelectedAuthor(null); }} /> - {label}{' '} - <span class="count">{filterCounts[label]}</span> + {_(label)}{' '} + <span class="count">{filterCounts[key]}</span> </label> ), )} @@ -1189,7 +1383,7 @@ function Catchup() { authors[author].avatarStatic || authors[author].avatar } size="xxl" - alt={`${authors[author].displayName} (@${authors[author].username})`} + alt={`${authors[author].displayName} (@${authors[author].acct})`} />{' '} <span class="count">{authorCounts[author]}</span> <span class="username">{authors[author].username}</span> @@ -1204,14 +1398,20 @@ function Catchup() { opacity: 0.33, }} > - {authorCountsList.length} authors + <Plural + value={authorCountsList.length} + one="# author" + other="# authors" + /> </small> )} </div> )} {posts.length >= 2 && ( <div class="catchup-filters"> - <span class="filter-label">Sort</span>{' '} + <span class="filter-label"> + <Trans>Sort</Trans> + </span>{' '} <fieldset class="radio-field-group"> {FILTER_SORTS.map((key) => ( <label @@ -1241,11 +1441,11 @@ function Catchup() { /> { { - createdAt: 'Date', - repliesCount: 'Replies', - favouritesCount: 'Likes', - reblogsCount: 'Boosts', - density: 'Density', + createdAt: t`Date`, + repliesCount: t`Replies`, + favouritesCount: t`Likes`, + reblogsCount: t`Boosts`, + density: t`Density`, }[key] } {sortBy === key && (sortOrder === 'asc' ? ' ↑' : ' ↓')} @@ -1267,7 +1467,9 @@ function Catchup() { </label> ))} </fieldset> */} - <span class="filter-label">Group</span>{' '} + <span class="filter-label"> + <Trans id="group.filter">Group</Trans> + </span>{' '} <fieldset class="radio-field-group"> {FILTER_GROUPS.map((key) => ( <label class="filter-group" key={key || 'none'}> @@ -1281,8 +1483,8 @@ function Catchup() { disabled={key === 'account' && selectedAuthor} /> {{ - account: 'Authors', - }[key] || 'None'} + account: t`Authors`, + }[key] || t`None`} </label> ))} </fieldset> @@ -1298,7 +1500,7 @@ function Catchup() { whiteSpace: 'nowrap', }} > - Show all authors + <Trans>Show all authors</Trans> </button> ) : null // <button @@ -1313,7 +1515,7 @@ function Catchup() { )} <ul class={`catchup-list catchup-filter-${ - FILTER_VALUES[selectedFilterCategory] || '' + selectedFilterCategory || '' } ${sortBy ? `catchup-sort-${sortBy}` : ''} ${ selectedAuthor && authors[selectedAuthor] ? `catchup-selected-author` @@ -1348,9 +1550,9 @@ function Catchup() { <footer> {filteredPosts.length > 5 && ( <p> - {selectedFilterCategory === 'Boosts' - ? "You don't have to read everything." - : "That's all."}{' '} + {selectedFilterCategory === 'boosts' + ? t`You don't have to read everything.` + : t`That's all.`}{' '} <button type="button" class="textual" @@ -1358,7 +1560,7 @@ function Catchup() { scrollableRef.current.scrollTop = 0; }} > - Back to top + <Trans>Back to top</Trans> </button> . </p> @@ -1376,28 +1578,117 @@ function Catchup() { class="sheet-close" onClick={() => setShowHelp(false)} > - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> <header> - <h2>Help</h2> + <h2> + <Trans>Help</Trans> + </h2> </header> <main> <dl> - <dt>Top links</dt> + <dt> + <Trans>Top links</Trans> + </dt> <dd> - Links shared by followings, sorted by shared counts, boosts - and likes. + <Trans> + Links shared by followings, sorted by shared counts, boosts + and likes. + </Trans> </dd> - <dt>Sort: Density</dt> + <dt> + <Trans>Sort: Density</Trans> + </dt> <dd> - Posts are sorted by information density or depth. Shorter - posts are "lighter" while longer posts are "heavier". Posts - with photos are "heavier" than posts without photos. + <Trans> + Posts are sorted by information density or depth. Shorter + posts are "lighter" while longer posts are "heavier". Posts + with photos are "heavier" than posts without photos. + </Trans> </dd> - <dt>Group: Authors</dt> + <dt> + <Trans>Group: Authors</Trans> + </dt> <dd> - Posts are grouped by authors, sorted by posts count per - author. + <Trans> + Posts are grouped by authors, sorted by posts count per + author. + </Trans> + </dd> + <dt> + <Trans>Keyboard shortcuts</Trans> + </dt> + {/* <dd> + <kbd>j</kbd>: <Trans>Next post</Trans> + </dd> + <dd> + <kbd>k</kbd>: <Trans>Previous post</Trans> + </dd> + <dd> + <kbd>l</kbd>: <Trans>Next author</Trans> + </dd> + <dd> + <kbd>h</kbd>: <Trans>Previous author</Trans> + </dd> + <dd> + <kbd>Enter</kbd>: <Trans>Open post details</Trans> + </dd> + <dd> + <kbd>.</kbd>: <Trans>Scroll to top</Trans> + </dd> */} + <dd> + <table> + <tbody> + <tr> + <td> + <Trans>Next post</Trans> + </td> + <td> + <kbd>j</kbd> + </td> + </tr> + <tr> + <td> + <Trans>Previous post</Trans> + </td> + <td> + <kbd>k</kbd> + </td> + </tr> + <tr> + <td> + <Trans>Next author</Trans> + </td> + <td> + <kbd>l</kbd> + </td> + </tr> + <tr> + <td> + <Trans>Previous author</Trans> + </td> + <td> + <kbd>h</kbd> + </td> + </tr> + <tr> + <td> + <Trans>Open post details</Trans> + </td> + <td> + <kbd>Enter</kbd> + </td> + </tr> + <tr> + <td> + <Trans>Scroll to top</Trans> + </td> + <td> + <kbd>.</kbd> + </td> + </tr> + </tbody> + </table> </dd> </dl> </main> @@ -1420,6 +1711,7 @@ const PostLine = memo( _followedTags: isFollowedTags, _filtered: filterInfo, visibility, + __BOOSTERS, } = post; const isReplyTo = inReplyToId && inReplyToAccountId !== account.id; const isFiltered = !!filterInfo; @@ -1438,10 +1730,10 @@ const PostLine = memo( group ? 'group' : reblog - ? 'reblog' - : isFollowedTags?.length - ? 'followed-tags' - : '' + ? 'reblog' + : isFollowedTags?.length + ? 'followed-tags' + : '' } ${isReplyTo ? 'reply-to' : ''} ${ isFiltered ? 'filtered' : '' } visibility-${visibility}`} @@ -1453,7 +1745,12 @@ const PostLine = memo( <Avatar url={account.avatarStatic || account.avatar} squircle={account.bot} - />{' '} + /> + {__BOOSTERS?.size > 0 + ? [...__BOOSTERS].map((b) => ( + <Avatar url={b.avatarStatic || b.avatar} squircle={b.bot} /> + )) + : ''}{' '} <Icon icon="rocket" />{' '} {/* <Avatar url={reblog.account.avatarStatic || reblog.account.avatar} @@ -1529,8 +1826,8 @@ function postDensity(post) { (mediaAttachments?.length ? MEDIA_DENSITY * mediaAttachments.length : card?.image - ? CARD_DENSITY - : 0); + ? CARD_DENSITY + : 0); return density; } @@ -1552,63 +1849,75 @@ function PostPeek({ post, filterInfo }) { } = post; const isThread = (inReplyToId && inReplyToAccountId === account.id) || !!_thread; - const showMedia = !spoilerText && !sensitive; + + const readingExpandSpoilers = useMemo(() => { + const prefs = store.account.get('preferences') || {}; + return !!prefs['reading:expand:spoilers']; + }, []); + // const readingExpandSpoilers = true; + const showMedia = readingExpandSpoilers || (!spoilerText && !sensitive); const postText = content ? statusPeek(post) : ''; + const showPostContent = !spoilerText || readingExpandSpoilers; + return ( <div class="post-peek" title={!spoilerText ? postText : ''}> <span class="post-peek-content"> + {isThread && !showPostContent && ( + <> + <span class="post-peek-tag post-peek-thread">Thread</span>{' '} + </> + )} {!!filterInfo ? ( - <> - {isThread && ( - <> - <span class="post-peek-tag post-peek-thread">Thread</span>{' '} - </> - )} - <span class="post-peek-filtered"> - Filtered{filterInfo?.titlesStr ? `: ${filterInfo.titlesStr}` : ''} - </span> - </> - ) : !!spoilerText ? ( - <> - {isThread && ( - <> - <span class="post-peek-tag post-peek-thread">Thread</span>{' '} - </> - )} - <span class="post-peek-spoiler"> - <Icon icon="eye-close" /> {spoilerText} - </span> - </> + <span class="post-peek-filtered"> + {/* Filtered{filterInfo?.titlesStr ? `: ${filterInfo.titlesStr}` : ''} */} + {filterInfo?.titlesStr + ? t`Filtered: ${filterInfo.titlesStr}` + : t`Filtered`} + </span> ) : ( - <div class="post-peek-html"> - {isThread && ( - <> - <span class="post-peek-tag post-peek-thread">Thread</span>{' '} - </> + <> + {!!spoilerText && ( + <span class="post-peek-spoiler"> + <Icon + icon={`${readingExpandSpoilers ? 'eye-open' : 'eye-close'}`} + />{' '} + {spoilerText} + </span> )} - {!!content && ( - <div - dangerouslySetInnerHTML={{ - __html: emojifyText(content, emojis), - }} - /> + {showPostContent && ( + <div class="post-peek-html"> + {isThread && ( + <> + <span class="post-peek-tag post-peek-thread"> + <Trans>Thread</Trans> + </span>{' '} + </> + )} + {!!content && ( + <div + dangerouslySetInnerHTML={{ + __html: emojifyText(content, emojis), + }} + /> + )} + {!!poll?.options?.length && + poll.options.map((o) => ( + <div> + {poll.multiple ? '▪️' : '•'} {o.title} + </div> + ))} + {!content && + mediaAttachments?.length === 1 && + mediaAttachments[0].description && ( + <> + <span class="post-peek-tag post-peek-alt">ALT</span>{' '} + <div>{mediaAttachments[0].description}</div> + </> + )} + </div> )} - {!!poll?.options?.length && - poll.options.map((o) => ( - <div> - {poll.multiple ? '▪️' : '•'} {o.title} - </div> - ))} - {!content && - mediaAttachments?.length === 1 && - mediaAttachments[0].description && ( - <> - <span class="post-peek-tag post-peek-alt">ALT</span>{' '} - <div>{mediaAttachments[0].description}</div> - </> - )} - </div> + </> )} </span> {!filterInfo && ( @@ -1616,13 +1925,19 @@ function PostPeek({ post, filterInfo }) { {!!poll && ( <span class="post-peek-tag post-peek-poll"> <Icon icon="poll" size="s" /> - Poll + <Trans>Poll</Trans> </span> )} {!!mediaAttachments?.length ? mediaAttachments.map((m) => { const mediaURL = m.previewUrl || m.url; const remoteMediaURL = m.previewRemoteUrl || m.remoteUrl; + const width = m.meta?.original + ? m.meta.original.width + : m.meta?.small?.width || m.meta?.original?.width; + const height = m.meta?.original + ? m.meta.original.height + : m.meta?.small?.height || m.meta?.original?.height; return ( <span key={m.id} class="post-peek-media"> {{ @@ -1640,6 +1955,12 @@ function PostPeek({ post, filterInfo }) { e.target.src = remoteMediaURL; } }} + style={{ + '--anim-duration': `${Math.min( + Math.max(Math.max(width, height) / 100, 5), + 120, + )}s`, + }} /> ) : ( <span class="post-peek-faux-media">🖼</span> @@ -1702,6 +2023,18 @@ function PostPeek({ post, filterInfo }) { card.title || card.description || card.imageDescription } loading="lazy" + style={{ + '--anim-duration': + card.width && + card.height && + `${Math.min( + Math.max( + Math.max(card.width, card.height) / 100, + 5, + ), + 120, + )}s`, + }} /> ) : ( <span class="post-peek-faux-media">🔗</span> @@ -1720,35 +2053,26 @@ function PostStats({ post }) { <span class="post-stats"> {repliesCount > 0 && ( <span class="post-stat-replies"> - <Icon icon="comment2" size="s" /> {shortenNumber(repliesCount)} + <Icon icon="comment2" size="s" alt={t`Replies`} />{' '} + {shortenNumber(repliesCount)} </span> )} {favouritesCount > 0 && ( <span class="post-stat-likes"> - <Icon icon="heart" size="s" /> {shortenNumber(favouritesCount)} + <Icon icon="heart" size="s" alt={t`Likes`} />{' '} + {shortenNumber(favouritesCount)} </span> )} {reblogsCount > 0 && ( <span class="post-stat-boosts"> - <Icon icon="rocket" size="s" /> {shortenNumber(reblogsCount)} + <Icon icon="rocket" size="s" alt={t`Boosts`} />{' '} + {shortenNumber(reblogsCount)} </span> )} </span> ); } -const { locale } = new Intl.DateTimeFormat().resolvedOptions(); -const dtf = new Intl.DateTimeFormat(locale, { - year: 'numeric', - month: 'short', - day: 'numeric', - hour: 'numeric', - minute: 'numeric', -}); -function formatRange(startDate, endDate) { - return dtf.formatRange(startDate, endDate); -} - function binByTime(data, key, numBins) { // Extract dates from data objects const dates = data.map((item) => new Date(item[key])); diff --git a/src/pages/favourites.jsx b/src/pages/favourites.jsx index 5a3310ba..08b805f2 100644 --- a/src/pages/favourites.jsx +++ b/src/pages/favourites.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { useRef } from 'preact/hooks'; import Timeline from '../components/timeline'; @@ -7,7 +8,7 @@ import useTitle from '../utils/useTitle'; const LIMIT = 20; function Favourites() { - useTitle('Likes', '/f'); + useTitle(t`Likes`, '/favourites'); const { masto, instance } = api(); const favouritesIterator = useRef(); async function fetchFavourites(firstLoad) { @@ -19,10 +20,10 @@ function Favourites() { return ( <Timeline - title="Likes" + title={t`Likes`} id="favourites" - emptyText="No likes yet. Go like something!" - errorText="Unable to load likes" + emptyText={t`No likes yet. Go like something!`} + errorText={t`Unable to load likes.`} instance={instance} fetchItems={fetchFavourites} /> diff --git a/src/pages/filters.css b/src/pages/filters.css new file mode 100644 index 00000000..43daff0a --- /dev/null +++ b/src/pages/filters.css @@ -0,0 +1,149 @@ +#filters-page { + .filters-list { + list-style: none; + padding: 0; + margin: 0; + + li { + padding: 8px 16px; + border-bottom: var(--hairline-width) solid var(--outline-color); + display: flex; + align-items: center; + justify-content: space-between; + } + + h2 { + font-weight: 500; + margin: 0; + padding: 0; + font-size: 1em; + } + } +} + +#filters-add-edit-modal { + .filter-form-row { + margin-bottom: 16px; + + + .filter-form-row { + margin-top: 16px; + border-top: 1px solid var(--outline-color); + padding-top: 16px; + } + } + + main { + padding-top: 10px; + line-height: 1.5; + + p { + margin-block: 1em; + } + } + + label { + display: flex; + align-items: center; + gap: 4px; + } + + .filter-form-keywords { + margin: 0 -16px 16px; + } + + .filter-form-cols { + display: flex; + gap: 8px; + margin-bottom: 16px; + flex-wrap: wrap; + + .filter-form-col { + flex-basis: 160px; + flex-grow: 1; + + > *:first-child { + margin-top: 0; + } + > *:last-child { + margin-bottom: 0; + } + } + } + + .filter-keywords { + --gap: 16px; + margin: 0; + padding: 0; + list-style: none; + display: flex; + flex-direction: column; + gap: var(--gap); + padding: var(--gap); + overflow-y: auto; + min-height: 80px; + max-height: 25vh; + background-color: var(--bg-faded-blur-color); + counter-reset: index; + scroll-behavior: smooth; + + li { + counter-increment: index; + display: flex; + gap: 4px; + align-items: center; + flex-wrap: wrap; + + &:not(:only-child):before { + content: counter(index); + font-size: 10px; + color: var(--text-insignificant-color); + align-self: flex-start; + } + + input[type='text'] { + flex-basis: 160px; + flex-grow: 100; + } + + .filter-keyword-actions { + display: flex; + gap: 8px; + flex-grow: 1; + align-items: center; + justify-content: space-between; + + label { + font-size: 0.8em; + line-height: 1; + } + } + } + } + + .filter-keywords-footer { + padding: 8px 16px 0; + display: flex; + justify-content: space-between; + } + + input[type='text'] { + display: block; + width: 100%; + } + + .filter-form-footer { + display: flex; + gap: 16px; + justify-content: space-between; + align-items: center; + + > span { + display: flex; + align-items: center; + } + + button[type='submit'] { + padding-inline: 24px; + } + } +} diff --git a/src/pages/filters.jsx b/src/pages/filters.jsx new file mode 100644 index 00000000..5cebc956 --- /dev/null +++ b/src/pages/filters.jsx @@ -0,0 +1,618 @@ +import './filters.css'; + +import { i18n } from '@lingui/core'; +import { msg, Plural, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; +import { useEffect, useReducer, useRef, useState } from 'preact/hooks'; + +import Icon from '../components/icon'; +import Link from '../components/link'; +import Loader from '../components/loader'; +import MenuConfirm from '../components/menu-confirm'; +import Modal from '../components/modal'; +import NavMenu from '../components/nav-menu'; +import RelativeTime from '../components/relative-time'; +import { api } from '../utils/api'; +import i18nDuration from '../utils/i18n-duration'; +import useInterval from '../utils/useInterval'; +import useTitle from '../utils/useTitle'; + +const FILTER_CONTEXT = ['home', 'public', 'notifications', 'thread', 'account']; +const FILTER_CONTEXT_UNIMPLEMENTED = ['notifications', 'thread', 'account']; +const FILTER_CONTEXT_LABELS = { + home: msg`Home and lists`, + notifications: msg`Notifications`, + public: msg`Public timelines`, + thread: msg`Conversations`, + account: msg`Profiles`, +}; + +const EXPIRY_DURATIONS = [ + 0, // forever + 30 * 60, // 30 minutes + 60 * 60, // 1 hour + 6 * 60 * 60, // 6 hours + 12 * 60 * 60, // 12 hours + 60 * 60 * 24, // 24 hours + 60 * 60 * 24 * 7, // 7 days + 60 * 60 * 24 * 30, // 30 days +]; + +const EXPIRY_DURATIONS_LABELS = { + 0: msg`Never`, + 1800: i18nDuration(30, 'minute'), + 3600: i18nDuration(1, 'hour'), + 21600: i18nDuration(6, 'hour'), + 43200: i18nDuration(12, 'hour'), + 86_400: i18nDuration(24, 'hour'), + 604_800: i18nDuration(7, 'day'), + 2_592_000: i18nDuration(30, 'day'), +}; + +function Filters() { + const { masto } = api(); + useTitle(t`Filters`, `/ft`); + const [uiState, setUIState] = useState('default'); + const [showFiltersAddEditModal, setShowFiltersAddEditModal] = useState(false); + + const [reloadCount, reload] = useReducer((c) => c + 1, 0); + const [filters, setFilters] = useState([]); + useEffect(() => { + setUIState('loading'); + (async () => { + try { + const filters = await masto.v2.filters.list(); + filters.sort((a, b) => a.title.localeCompare(b.title)); + filters.forEach((filter) => { + if (filter.keywords?.length) { + filter.keywords.sort((a, b) => a.id - b.id); + } + }); + console.log(filters); + setFilters(filters); + setUIState('default'); + } catch (e) { + console.error(e); + setUIState('error'); + } + })(); + }, [reloadCount]); + + return ( + <div id="filters-page" class="deck-container" tabIndex="-1"> + <div class="timeline-deck deck"> + <header> + <div class="header-grid"> + <div class="header-side"> + <NavMenu /> + <Link to="/" class="button plain"> + <Icon icon="home" size="l" alt={t`Home`} /> + </Link> + </div> + <h1> + <Trans>Filters</Trans> + </h1> + <div class="header-side"> + <button + type="button" + class="plain" + onClick={() => { + setShowFiltersAddEditModal(true); + }} + > + <Icon icon="plus" size="l" alt={t`New filter`} /> + </button> + </div> + </div> + </header> + <main> + {filters.length > 0 ? ( + <> + <ul class="filters-list"> + {filters.map((filter) => { + const { id, title, expiresAt, keywords } = filter; + return ( + <li key={id}> + <div> + <h2>{title}</h2> + {keywords?.length > 0 && ( + <div> + {keywords.map((k) => ( + <> + <span class="tag collapsed insignificant"> + {k.wholeWord ? `“${k.keyword}”` : k.keyword} + </span>{' '} + </> + ))} + </div> + )} + <small class="insignificant"> + <ExpiryStatus expiresAt={expiresAt} /> + </small> + </div> + <button + type="button" + class="plain" + onClick={() => { + setShowFiltersAddEditModal({ + filter, + }); + }} + > + <Icon icon="pencil" size="l" alt="Edit filter" /> + </button> + </li> + ); + })} + </ul> + {filters.length > 1 && ( + <footer class="ui-state"> + <small class="insignificant"> + <Plural + value={filters.length} + one="# filter" + other="# filters" + /> + </small> + </footer> + )} + </> + ) : uiState === 'loading' ? ( + <p class="ui-state"> + <Loader /> + </p> + ) : uiState === 'error' ? ( + <p class="ui-state"> + <Trans>Unable to load filters.</Trans> + </p> + ) : ( + <p class="ui-state"> + <Trans>No filters yet.</Trans> + </p> + )} + </main> + </div> + {!!showFiltersAddEditModal && ( + <Modal + title={t`Add filter`} + onClose={() => { + setShowFiltersAddEditModal(false); + }} + > + <FiltersAddEdit + filter={showFiltersAddEditModal?.filter} + onClose={(result) => { + if (result.state === 'success') { + reload(); + } + setShowFiltersAddEditModal(false); + }} + /> + </Modal> + )} + </div> + ); +} + +let _id = 1; +const incID = () => _id++; +function FiltersAddEdit({ filter, onClose }) { + const { _ } = useLingui(); + const { masto } = api(); + const [uiState, setUIState] = useState('default'); + const editMode = !!filter; + const { context, expiresAt, id, keywords, title, filterAction } = + filter || {}; + const hasExpiry = !!expiresAt; + const expiresAtDate = hasExpiry && new Date(expiresAt); + const [editKeywords, setEditKeywords] = useState(keywords || []); + const keywordsRef = useRef(); + + // Hacky way of handling removed keywords for both existing and new ones + const [removedKeywordIDs, setRemovedKeywordIDs] = useState([]); + const [removedKeyword_IDs, setRemovedKeyword_IDs] = useState([]); + + const filteredEditKeywords = editKeywords.filter( + (k) => + !removedKeywordIDs.includes(k.id) && !removedKeyword_IDs.includes(k._id), + ); + + return ( + <div class="sheet" id="filters-add-edit-modal"> + {!!onClose && ( + <button type="button" class="sheet-close" onClick={onClose}> + <Icon icon="x" alt={t`Close`} /> + </button> + )} + <header> + <h2>{editMode ? t`Edit filter` : t`New filter`}</h2> + </header> + <main> + <form + onSubmit={(e) => { + e.preventDefault(); + const formData = new FormData(e.target); + const title = formData.get('title'); + const keywordIDs = formData.getAll('keyword_attributes[][id]'); + const keywordKeywords = formData.getAll( + 'keyword_attributes[][keyword]', + ); + // const keywordWholeWords = formData.getAll( + // 'keyword_attributes[][whole_word]', + // ); + // Not using getAll because it skips the empty checkboxes + const keywordWholeWords = [ + ...keywordsRef.current.querySelectorAll( + 'input[name="keyword_attributes[][whole_word]"]', + ), + ].map((i) => i.checked); + const keywordsAttributes = keywordKeywords.map((k, i) => ({ + id: keywordIDs[i] || undefined, + keyword: k, + wholeWord: keywordWholeWords[i], + })); + // if (editMode && keywords?.length) { + // // Find which one got deleted and add to keywordsAttributes + // keywords.forEach((k) => { + // if (!keywordsAttributes.find((ka) => ka.id === k.id)) { + // keywordsAttributes.push({ + // ...k, + // _destroy: true, + // }); + // } + // }); + // } + if (editMode && removedKeywordIDs?.length) { + removedKeywordIDs.forEach((id) => { + keywordsAttributes.push({ + id, + _destroy: true, + }); + }); + } + const context = formData.getAll('context'); + let expiresIn = formData.get('expires_in'); + const filterAction = formData.get('filter_action'); + console.log({ + title, + keywordIDs, + keywords: keywordKeywords, + wholeWords: keywordWholeWords, + keywordsAttributes, + context, + expiresIn, + filterAction, + }); + + // Required fields + if (!title || !context?.length) { + return; + } + + setUIState('loading'); + + (async () => { + try { + let filterResult; + + if (editMode) { + if (expiresIn === '' || expiresIn === null) { + // No value + // Preserve existing expiry if not specified + // Seconds from now to expiresAtDate + // Other clients don't do this + if (hasExpiry) { + expiresIn = Math.floor( + (expiresAtDate - new Date()) / 1000, + ); + } else { + expiresIn = null; + } + } else if (expiresIn === '0' || expiresIn === 0) { + // 0 = Never + expiresIn = null; + } else { + expiresIn = +expiresIn; + } + filterResult = await masto.v2.filters.$select(id).update({ + title, + context, + expiresIn, + keywordsAttributes, + filterAction, + }); + } else { + expiresIn = +expiresIn || null; + filterResult = await masto.v2.filters.create({ + title, + context, + expiresIn, + keywordsAttributes, + filterAction, + }); + } + console.log({ filterResult }); + setUIState('default'); + onClose?.({ + state: 'success', + filter: filterResult, + }); + } catch (error) { + console.error(error); + setUIState('error'); + alert( + editMode + ? t`Unable to edit filter` + : t`Unable to create filter`, + ); + } + })(); + }} + > + <div class="filter-form-row"> + <label> + <b> + <Trans>Title</Trans> + </b> + <input + type="text" + name="title" + defaultValue={title} + disabled={uiState === 'loading'} + dir="auto" + required + /> + </label> + </div> + <div class="filter-form-keywords" ref={keywordsRef}> + {filteredEditKeywords.length ? ( + <ul class="filter-keywords"> + {filteredEditKeywords.map((k) => { + const { id, keyword, wholeWord, _id } = k; + return ( + <li key={`${id}-${_id}`}> + <input + type="hidden" + name="keyword_attributes[][id]" + value={id} + /> + <input + name="keyword_attributes[][keyword]" + type="text" + defaultValue={keyword} + disabled={uiState === 'loading'} + required + dir="auto" + /> + <div class="filter-keyword-actions"> + <label> + <input + name="keyword_attributes[][whole_word]" + type="checkbox" + value={id} // Hacky way to map checkbox boolean to the keyword id + defaultChecked={wholeWord} + disabled={uiState === 'loading'} + />{' '} + <Trans>Whole word</Trans> + </label> + <button + type="button" + class="light danger small" + disabled={uiState === 'loading'} + onClick={() => { + if (id) { + removedKeywordIDs.push(id); + setRemovedKeywordIDs([...removedKeywordIDs]); + } else if (_id) { + removedKeyword_IDs.push(_id); + setRemovedKeyword_IDs([...removedKeyword_IDs]); + } + }} + > + <Icon icon="x" alt={t`Remove`} /> + </button> + </div> + </li> + ); + })} + </ul> + ) : ( + <div class="filter-keywords"> + <div class="insignificant"> + <Trans>No keywords. Add one.</Trans> + </div> + </div> + )} + <footer class="filter-keywords-footer"> + <button + type="button" + class="light" + onClick={() => { + setEditKeywords([ + ...editKeywords, + { + _id: incID(), + keyword: '', + wholeWord: true, + }, + ]); + setTimeout(() => { + // Focus last input + const fields = + keywordsRef.current.querySelectorAll( + 'input[type="text"]', + ); + fields[fields.length - 1]?.focus?.(); + }, 10); + }} + > + <Trans>Add keyword</Trans> + </button>{' '} + {filteredEditKeywords?.length > 1 && ( + <small class="insignificant"> + <Plural + value={filteredEditKeywords.length} + one="# keyword" + other="# keywords" + /> + </small> + )} + </footer> + </div> + <div class="filter-form-cols"> + <div class="filter-form-col"> + <div> + <b> + <Trans>Filter from…</Trans> + </b> + </div> + {FILTER_CONTEXT.map((ctx) => ( + <div> + <label + class={ + FILTER_CONTEXT_UNIMPLEMENTED.includes(ctx) + ? 'insignificant' + : '' + } + > + <input + type="checkbox" + name="context" + value={ctx} + defaultChecked={!!context ? context.includes(ctx) : true} + disabled={uiState === 'loading'} + />{' '} + {_(FILTER_CONTEXT_LABELS[ctx])} + {FILTER_CONTEXT_UNIMPLEMENTED.includes(ctx) ? '*' : ''} + </label>{' '} + </div> + ))} + <p> + <small class="insignificant"> + <Trans>* Not implemented yet</Trans> + </small> + </p> + </div> + <div class="filter-form-col"> + {editMode && ( + <Trans> + Status:{' '} + <b> + <ExpiryStatus expiresAt={expiresAt} showNeverExpires /> + </b> + </Trans> + )} + <div> + <label for="filters-expires_in"> + {editMode ? t`Change expiry` : t`Expiry`} + </label> + <select + id="filters-expires_in" + name="expires_in" + disabled={uiState === 'loading'} + defaultValue={editMode ? undefined : 0} + > + {editMode && <option></option>} + {EXPIRY_DURATIONS.map((v) => ( + <option value={v}> + {typeof EXPIRY_DURATIONS_LABELS[v] === 'function' + ? EXPIRY_DURATIONS_LABELS[v]() + : _(EXPIRY_DURATIONS_LABELS[v])} + </option> + ))} + </select> + </div> + <p> + <Trans>Filtered post will be…</Trans> + <br /> + <label class="ib"> + <input + type="radio" + name="filter_action" + value="warn" + defaultChecked={filterAction === 'warn' || !editMode} + disabled={uiState === 'loading'} + />{' '} + <Trans>minimized</Trans> + </label>{' '} + <label class="ib"> + <input + type="radio" + name="filter_action" + value="hide" + defaultChecked={filterAction === 'hide'} + disabled={uiState === 'loading'} + />{' '} + <Trans>hidden</Trans> + </label> + </p> + </div> + </div> + <footer class="filter-form-footer"> + <span> + <button type="submit" disabled={uiState === 'loading'}> + {editMode ? t`Save` : t`Create`} + </button>{' '} + <Loader abrupt hidden={uiState !== 'loading'} /> + </span> + {editMode && ( + <MenuConfirm + disabled={uiState === 'loading'} + align="end" + menuItemClassName="danger" + confirmLabel={t`Delete this filter?`} + onClick={() => { + setUIState('loading'); + (async () => { + try { + await masto.v2.filters.$select(id).remove(); + setUIState('default'); + onClose?.({ + state: 'success', + }); + } catch (e) { + console.error(e); + setUIState('error'); + alert(t`Unable to delete filter.`); + } + })(); + }} + > + <button + type="button" + class="light danger" + onClick={() => {}} + disabled={uiState === 'loading'} + > + <Trans>Delete…</Trans> + </button> + </MenuConfirm> + )} + </footer> + </form> + </main> + </div> + ); +} + +function ExpiryStatus({ expiresAt, showNeverExpires }) { + const hasExpiry = !!expiresAt; + const expiresAtDate = hasExpiry && new Date(expiresAt); + const expired = hasExpiry && expiresAtDate <= new Date(); + + // If less than a minute left, re-render interval every second, else every minute + const [_, rerender] = useReducer((c) => c + 1, 0); + useInterval(rerender, expired || 30_000); + + return expired ? ( + t`Expired` + ) : hasExpiry ? ( + <Trans> + Expiring <RelativeTime datetime={expiresAtDate} /> + </Trans> + ) : ( + showNeverExpires && t`Never expires` + ); +} + +export default Filters; diff --git a/src/pages/followed-hashtags.jsx b/src/pages/followed-hashtags.jsx index a36f9418..dcfb612e 100644 --- a/src/pages/followed-hashtags.jsx +++ b/src/pages/followed-hashtags.jsx @@ -1,3 +1,4 @@ +import { Plural, t, Trans } from '@lingui/macro'; import { useEffect, useState } from 'preact/hooks'; import Icon from '../components/icon'; @@ -10,7 +11,7 @@ import useTitle from '../utils/useTitle'; function FollowedHashtags() { const { masto, instance } = api(); - useTitle(`Followed Hashtags`, `/ft`); + useTitle(t`Followed Hashtags`, `/fh`); const [uiState, setUIState] = useState('default'); const [followedHashtags, setFollowedHashtags] = useState([]); @@ -36,10 +37,12 @@ function FollowedHashtags() { <div class="header-side"> <NavMenu /> <Link to="/" class="button plain"> - <Icon icon="home" size="l" /> + <Icon icon="home" size="l" alt={t`Home`} /> </Link> </div> - <h1>Followed Hashtags</h1> + <h1> + <Trans>Followed Hashtags</Trans> + </h1> <div class="header-side" /> </div> </header> @@ -56,7 +59,7 @@ function FollowedHashtags() { : `/t/${tag.name}` } > - <Icon icon="hashtag" /> <span>{tag.name}</span> + <Icon icon="hashtag" alt="#" /> <span>{tag.name}</span> </Link> </li> ))} @@ -64,8 +67,11 @@ function FollowedHashtags() { {followedHashtags.length > 1 && ( <footer class="ui-state"> <small class="insignificant"> - {followedHashtags.length} hashtag - {followedHashtags.length === 1 ? '' : 's'} + <Plural + value={followedHashtags.length} + one="# hashtag" + other="# hashtags" + /> </small> </footer> )} @@ -75,9 +81,13 @@ function FollowedHashtags() { <Loader abrupt /> </p> ) : uiState === 'error' ? ( - <p class="ui-state">Unable to load followed hashtags.</p> + <p class="ui-state"> + <Trans>Unable to load followed hashtags.</Trans> + </p> ) : ( - <p class="ui-state">No hashtags followed yet.</p> + <p class="ui-state"> + <Trans>No hashtags followed yet.</Trans> + </p> )} </main> </div> diff --git a/src/pages/following.jsx b/src/pages/following.jsx index d5def903..27544546 100644 --- a/src/pages/following.jsx +++ b/src/pages/following.jsx @@ -1,11 +1,12 @@ +import { t, Trans } from '@lingui/macro'; import { useEffect, useRef } from 'preact/hooks'; import { useSnapshot } from 'valtio'; import Timeline from '../components/timeline'; import { api } from '../utils/api'; import { filteredItems } from '../utils/filters'; -import states from '../utils/states'; -import { getStatus, saveStatus } from '../utils/states'; +import states, { getStatus, saveStatus } from '../utils/states'; +import supports from '../utils/supports'; import { assignFollowedTags, clearFollowedTagsState, @@ -16,18 +17,35 @@ import useTitle from '../utils/useTitle'; const LIMIT = 20; function Following({ title, path, id, ...props }) { - useTitle(title || 'Following', path || '/following'); + useTitle( + title || + t({ + id: 'following.title', + message: 'Following', + }), + path || '/following', + ); const { masto, streaming, instance } = api(); const snapStates = useSnapshot(states); const homeIterator = useRef(); const latestItem = useRef(); + __BENCHMARK.end('time-to-following'); console.debug('RENDER Following', title, id); + const supportsPixelfed = supports('@pixelfed/home-include-reblogs'); async function fetchHome(firstLoad) { if (firstLoad || !homeIterator.current) { + __BENCHMARK.start('fetch-home-first'); homeIterator.current = masto.v1.timelines.home.list({ limit: LIMIT }); } + if (supportsPixelfed && homeIterator.current?.nextParams) { + if (typeof homeIterator.current.nextParams === 'string') { + homeIterator.current.nextParams += '&include_reblogs=true'; + } else { + homeIterator.current.nextParams.include_reblogs = true; + } + } const results = await homeIterator.current.next(); let { value } = results; if (value?.length) { @@ -55,6 +73,7 @@ function Following({ title, path, id, ...props }) { return bDate - aDate; }); } + __BENCHMARK.end('fetch-home-first'); return { ...results, value, @@ -63,15 +82,18 @@ function Following({ title, path, id, ...props }) { async function checkForUpdates() { try { - const results = await masto.v1.timelines.home - .list({ - limit: 5, - since_id: latestItem.current, - }) - .next(); + const opts = { + limit: 5, + since_id: latestItem.current, + }; + if (supports('@pixelfed/home-include-reblogs')) { + opts.include_reblogs = true; + } + const results = await masto.v1.timelines.home.list(opts).next(); let { value } = results; console.log('checkForUpdates', latestItem.current, value); - if (value?.length) { + const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported + if (value?.length && !valueContainsLatestItem) { latestItem.current = value[0].id; value = dedupeBoosts(value, instance); value = filteredItems(value, 'home'); @@ -116,10 +138,10 @@ function Following({ title, path, id, ...props }) { return ( <Timeline - title={title || 'Following'} + title={title || t({ id: 'following.title', message: 'Following' })} id={id || 'following'} - emptyText="Nothing to see here." - errorText="Unable to load posts." + emptyText={t`Nothing to see here.`} + errorText={t`Unable to load posts.`} instance={instance} fetchItems={fetchHome} checkForUpdates={checkForUpdates} diff --git a/src/pages/hashtag.jsx b/src/pages/hashtag.jsx index 251de1da..8a9ca319 100644 --- a/src/pages/hashtag.jsx +++ b/src/pages/hashtag.jsx @@ -1,3 +1,5 @@ +import { plural, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { FocusableItem, MenuDivider, @@ -5,19 +7,19 @@ import { MenuHeader, MenuItem, } from '@szhsin/react-menu'; -import { useEffect, useRef, useState } from 'preact/hooks'; +import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import Icon from '../components/icon'; -import Menu2 from '../components/menu2'; import MenuConfirm from '../components/menu-confirm'; +import Menu2 from '../components/menu2'; import { SHORTCUTS_LIMIT } from '../components/shortcuts-settings'; import Timeline from '../components/timeline'; import { api } from '../utils/api'; import { filteredItems } from '../utils/filters'; import showToast from '../utils/show-toast'; -import states from '../utils/states'; -import { saveStatus } from '../utils/states'; +import states, { saveStatus } from '../utils/states'; +import { isMediaFirstInstance } from '../utils/store-utils'; import useTitle from '../utils/useTitle'; const LIMIT = 20; @@ -48,13 +50,18 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { authenticated: currentAuthenticated, } = api(); const hashtagTitle = hashtags.map((t) => `#${t}`).join(' '); - const hashtagPostTitle = media ? ` (Media only)` : ''; const title = instance - ? `${hashtagTitle}${hashtagPostTitle} on ${instance}` - : `${hashtagTitle}${hashtagPostTitle}`; + ? media + ? t`${hashtagTitle} (Media only) on ${instance}` + : t`${hashtagTitle} on ${instance}` + : media + ? t`${hashtagTitle} (Media only)` + : t`${hashtagTitle}`; useTitle(title, `/:instance?/t/:hashtag`); const latestItem = useRef(); + const mediaFirst = useMemo(() => isMediaFirstInstance(), []); + // const hashtagsIterator = useRef(); const maxID = useRef(undefined); async function fetchHashtags(firstLoad) { @@ -73,7 +80,7 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { limit: LIMIT, any: hashtags.slice(1), maxId: firstLoad ? undefined : maxID.current, - onlyMedia: media, + onlyMedia: media ? true : undefined, }) .next(); let { value } = results; @@ -85,7 +92,7 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { // value = filteredItems(value, 'public'); value.forEach((item) => { saveStatus(item, instance, { - skipThreading: media, // If media view, no need to form threads + skipThreading: media || mediaFirst, // If media view, no need to form threads }); }); @@ -109,8 +116,9 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { }) .next(); let { value } = results; - value = filteredItems(value, 'public'); - if (value?.length) { + const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported + if (value?.length && !valueContainsLatestItem) { + value = filteredItems(value, 'public'); return true; } return false; @@ -136,6 +144,26 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { const reachLimit = hashtags.length >= TOTAL_TAGS_LIMIT; + const [featuredUIState, setFeaturedUIState] = useState('default'); + const [featuredTags, setFeaturedTags] = useState([]); + const [isFeaturedTag, setIsFeaturedTag] = useState(false); + useEffect(() => { + if (!authenticated) return; + (async () => { + try { + const featuredTags = await masto.v1.featuredTags.list(); + setFeaturedTags(featuredTags); + setIsFeaturedTag( + featuredTags.some( + (tag) => tag.name.toLowerCase() === hashtag.toLowerCase(), + ), + ); + } catch (e) { + console.error(e); + } + })(); + }, []); + return ( <Timeline key={instance + hashtagTitle} @@ -143,19 +171,19 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { titleComponent={ !!instance && ( <h1 class="header-double-lines"> - <b>{hashtagTitle}</b> + <b dir="auto">{hashtagTitle}</b> <div>{instance}</div> </h1> ) } id="hashtag" instance={instance} - emptyText="No one has posted anything with this tag yet." - errorText="Unable to load posts with this tag" + emptyText={t`No one has posted anything with this tag yet.`} + errorText={t`Unable to load posts with this tag`} fetchItems={fetchHashtags} checkForUpdates={checkForUpdates} useItemID - view={media ? 'media' : undefined} + view={media || mediaFirst ? 'media' : undefined} refresh={media} // allowFilters filterContext="public" @@ -168,7 +196,7 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { position="anchor" menuButton={ <button type="button" class="plain"> - <Icon icon="more" size="l" /> + <Icon icon="more" size="l" alt={t`More`} /> </button> } > @@ -177,7 +205,7 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { <MenuConfirm subMenu confirm={info.following} - confirmLabel={`Unfollow #${hashtag}?`} + confirmLabel={t`Unfollow #${hashtag}?`} disabled={followUIState === 'loading' || !authenticated} onClick={() => { setFollowUIState('loading'); @@ -192,7 +220,7 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { .unfollow() .then(() => { setInfo({ ...info, following: false }); - showToast(`Unfollowed #${hashtag}`); + showToast(t`Unfollowed #${hashtag}`); }) .catch((e) => { alert(e); @@ -207,7 +235,7 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { .follow() .then(() => { setInfo({ ...info, following: true }); - showToast(`Followed #${hashtag}`); + showToast(t`Followed #${hashtag}`); }) .catch((e) => { alert(e); @@ -221,34 +249,115 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { > {info.following ? ( <> - <Icon icon="check-circle" /> <span>Following…</span> + <Icon icon="check-circle" />{' '} + <span> + <Trans>Following…</Trans> + </span> </> ) : ( <> - <Icon icon="plus" /> <span>Follow</span> + <Icon icon="plus" />{' '} + <span> + <Trans>Follow</Trans> + </span> </> )} </MenuConfirm> + <MenuItem + type="checkbox" + checked={isFeaturedTag} + disabled={featuredUIState === 'loading' || !authenticated} + onClick={() => { + setFeaturedUIState('loading'); + if (isFeaturedTag) { + const featuredTagID = featuredTags.find( + (tag) => tag.name.toLowerCase() === hashtag.toLowerCase(), + ).id; + if (featuredTagID) { + masto.v1.featuredTags + .$select(featuredTagID) + .remove() + .then(() => { + setIsFeaturedTag(false); + showToast(t`Unfeatured on profile`); + setFeaturedTags( + featuredTags.filter( + (tag) => tag.id !== featuredTagID, + ), + ); + }) + .catch((e) => { + console.error(e); + }) + .finally(() => { + setFeaturedUIState('default'); + }); + } else { + showToast(t`Unable to unfeature on profile`); + } + } else { + masto.v1.featuredTags + .create({ + name: hashtag, + }) + .then((value) => { + setIsFeaturedTag(true); + showToast(t`Featured on profile`); + setFeaturedTags(featuredTags.concat(value)); + }) + .catch((e) => { + console.error(e); + }) + .finally(() => { + setFeaturedUIState('default'); + }); + } + }} + > + {isFeaturedTag ? ( + <> + <Icon icon="check-circle" /> + <span> + <Trans>Featured on profile</Trans> + </span> + </> + ) : ( + <> + <Icon icon="check-circle" /> + <span> + <Trans>Feature on profile</Trans> + </span> + </> + )} + </MenuItem> + <MenuDivider /> + </> + )} + {!mediaFirst && ( + <> + <MenuHeader className="plain"> + <Trans>Filters</Trans> + </MenuHeader> + <MenuItem + type="checkbox" + checked={!!media} + onClick={() => { + if (media) { + searchParams.delete('media'); + } else { + searchParams.set('media', '1'); + } + setSearchParams(searchParams); + }} + > + <Icon icon="check-circle" alt="☑️" />{' '} + <span class="menu-grow"> + <Trans>Media only</Trans> + </span> + </MenuItem> <MenuDivider /> </> )} - <MenuHeader className="plain">Filters</MenuHeader> - <MenuItem - type="checkbox" - checked={!!media} - onClick={() => { - if (media) { - searchParams.delete('media'); - } else { - searchParams.set('media', '1'); - } - setSearchParams(searchParams); - }} - > - <Icon icon="check-circle" />{' '} - <span class="menu-grow">Media only</span> - </MenuItem> - <MenuDivider /> <FocusableItem className="menu-field" disabled={reachLimit}> {({ ref }) => ( <form @@ -280,7 +389,11 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { ref={ref} type="text" placeholder={ - reachLimit ? `Max ${TOTAL_TAGS_LIMIT} tags` : 'Add hashtag' + reachLimit + ? plural(TOTAL_TAGS_LIMIT, { + other: 'Max # tags', + }) + : t`Add hashtag` } required autocorrect="off" @@ -289,14 +402,15 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { // no spaces, no hashtags pattern="[^#][^\s#]+[^#]" disabled={reachLimit} + dir="auto" /> </form> )} </FocusableItem> <MenuGroup takeOverflow> - {hashtags.map((t, i) => ( + {hashtags.map((tag, i) => ( <MenuItem - key={t} + key={tag} disabled={hashtags.length === 1} onClick={(e) => { hashtags.splice(i, 1); @@ -311,10 +425,10 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { : `/t/${hashtags.join('+')}${linkParams}`; }} > - <Icon icon="x" alt="Remove hashtag" class="danger-icon" /> - <span> + <Icon icon="x" alt={t`Remove hashtag`} class="danger-icon" /> + <span class="bidi-isolate"> <span class="more-insignificant">#</span> - {t} + {tag} </span> </MenuItem> ))} @@ -325,7 +439,10 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { onClick={() => { if (states.shortcuts.length >= SHORTCUTS_LIMIT) { alert( - `Max ${SHORTCUTS_LIMIT} shortcuts reached. Unable to add shortcut.`, + plural(SHORTCUTS_LIMIT, { + one: 'Max # shortcut reached. Unable to add shortcut.', + other: 'Max # shortcuts reached. Unable to add shortcut.', + }), ); return; } @@ -351,22 +468,25 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { (s.media ? !!s.media === !!shortcut.media : true), ); if (exists) { - alert('This shortcut already exists'); + alert(t`This shortcut already exists`); } else { states.shortcuts.push(shortcut); - showToast(`Hashtag shortcut added`); + showToast(t`Hashtag shortcut added`); } }} > - <Icon icon="shortcut" /> <span>Add to Shorcuts</span> + <Icon icon="shortcut" />{' '} + <span> + <Trans>Add to Shortcuts</Trans> + </span> </MenuItem> <MenuItem onClick={() => { let newInstance = prompt( - 'Enter a new instance e.g. "mastodon.social"', + t`Enter a new instance e.g. "mastodon.social"`, ); if (!/\./.test(newInstance)) { - if (newInstance) alert('Invalid instance'); + if (newInstance) alert(t`Invalid instance`); return; } if (newInstance) { @@ -378,7 +498,10 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { } }} > - <Icon icon="bus" /> <span>Go to another instance…</span> + <Icon icon="bus" />{' '} + <span> + <Trans>Go to another instance…</Trans> + </span> </MenuItem> {currentInstance !== instance && ( <MenuItem @@ -390,7 +513,9 @@ function Hashtags({ media: mediaView, columnMode, ...props }) { > <Icon icon="bus" />{' '} <small class="menu-double-lines"> - Go to my instance (<b>{currentInstance}</b>) + <Trans> + Go to my instance (<b>{currentInstance}</b>) + </Trans> </small> </MenuItem> )} diff --git a/src/pages/home.jsx b/src/pages/home.jsx index 621500ac..408add69 100644 --- a/src/pages/home.jsx +++ b/src/pages/home.jsx @@ -1,5 +1,7 @@ import './notifications-menu.css'; +import { msg, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { ControlledMenu } from '@szhsin/react-menu'; import { memo } from 'preact/compat'; import { useEffect, useRef, useState } from 'preact/hooks'; @@ -12,14 +14,20 @@ import Loader from '../components/loader'; import Notification from '../components/notification'; import { api } from '../utils/api'; import db from '../utils/db'; -import groupNotifications from '../utils/group-notifications'; +import { massageNotifications2 } from '../utils/group-notifications'; import states, { saveStatus } from '../utils/states'; import { getCurrentAccountNS } from '../utils/store-utils'; import Following from './following'; +import { + getGroupedNotifications, + mastoFetchNotifications, +} from './notifications'; function Home() { + const { _ } = useLingui(); const snapStates = useSnapshot(states); + __BENCHMARK.end('time-to-home'); useEffect(() => { (async () => { const keys = await db.drafts.keys(); @@ -42,7 +50,7 @@ function Home() { <Columns /> ) : ( <Following - title="Home" + title={_(msg`Home`)} path="/" id="home" headerStart={false} @@ -73,7 +81,7 @@ function NotificationsLink() { } }} > - <Icon icon="notification" size="l" alt="Notifications" /> + <Icon icon="notification" size="l" alt={t`Notifications`} /> </Link> <NotificationsMenu state={menuState} @@ -84,20 +92,17 @@ function NotificationsLink() { ); } -const NOTIFICATIONS_LIMIT = 30; const NOTIFICATIONS_DISPLAY_LIMIT = 5; function NotificationsMenu({ anchorRef, state, onClose }) { const { masto, instance } = api(); const snapStates = useSnapshot(states); const [uiState, setUIState] = useState('default'); - const notificationsIterator = masto.v1.notifications.list({ - limit: NOTIFICATIONS_LIMIT, - }); + const notificationsIterator = mastoFetchNotifications(); async function fetchNotifications() { const allNotifications = await notificationsIterator.next(); - const notifications = allNotifications.value; + const notifications = massageNotifications2(allNotifications.value); if (notifications?.length) { notifications.forEach((notification) => { @@ -106,16 +111,16 @@ function NotificationsMenu({ anchorRef, state, onClose }) { }); }); - const groupedNotifications = groupNotifications(notifications); + const groupedNotifications = getGroupedNotifications(notifications); - states.notificationsLast = notifications[0]; + states.notificationsLast = groupedNotifications[0]; states.notifications = groupedNotifications; // Update last read marker masto.v1.markers .create({ notifications: { - lastReadId: notifications[0].id, + lastReadId: groupedNotifications[0].id, }, }) .catch(() => {}); @@ -151,8 +156,11 @@ function NotificationsMenu({ anchorRef, state, onClose }) { if (state === 'open') loadNotifications(); }, [state]); + const menuRef = useRef(); + return ( <ControlledMenu + ref={menuRef} menuClassName="notifications-menu" state={state} anchorRef={anchorRef} @@ -160,6 +168,11 @@ function NotificationsMenu({ anchorRef, state, onClose }) { portal={{ target: document.body, }} + containerProps={{ + onClick: () => { + menuRef.current?.closeMenu?.(); + }, + }} overflow="auto" viewScroll="close" position="anchor" @@ -167,7 +180,9 @@ function NotificationsMenu({ anchorRef, state, onClose }) { boundingBoxPadding="8 8 8 8" > <header> - <h2>Notifications</h2> + <h2> + <Trans>Notifications</Trans> + </h2> </header> <main> {snapStates.notifications.length ? ( @@ -176,7 +191,7 @@ function NotificationsMenu({ anchorRef, state, onClose }) { .slice(0, NOTIFICATIONS_DISPLAY_LIMIT) .map((notification) => ( <Notification - key={notification.id} + key={notification._ids || notification.id} instance={instance} notification={notification} disableContextMenu @@ -190,10 +205,12 @@ function NotificationsMenu({ anchorRef, state, onClose }) { ) : ( uiState === 'error' && ( <div class="ui-state"> - <p>Unable to fetch notifications.</p> + <p> + <Trans>Unable to fetch notifications.</Trans> + </p> <p> <button type="button" onClick={loadNotifications}> - Try again + <Trans>Try again</Trans> </button> </p> </div> @@ -202,16 +219,21 @@ function NotificationsMenu({ anchorRef, state, onClose }) { </main> <footer> <Link to="/mentions" class="button plain"> - <Icon icon="at" /> <span>Mentions</span> + <Icon icon="at" />{' '} + <span> + <Trans>Mentions</Trans> + </span> </Link> <Link to="/notifications" class="button plain2"> {hasFollowRequests ? ( - <> + <Trans> <span class="tag collapsed">New</span>{' '} <span>Follow Requests</span> - </> + </Trans> ) : ( - <b>See all</b> + <b> + <Trans>See all</Trans> + </b> )}{' '} <Icon icon="arrow-right" /> </Link> diff --git a/src/pages/http-route.jsx b/src/pages/http-route.jsx index c2cf1865..277b81b3 100644 --- a/src/pages/http-route.jsx +++ b/src/pages/http-route.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { useLayoutEffect, useState } from 'preact/hooks'; import { useLocation } from 'react-router-dom'; @@ -24,11 +25,13 @@ export default function HttpRoute() { // Check if status returns 200 try { const { instance, id } = statusObject; - const { masto } = api({ instance }); - const status = await masto.v1.statuses.$select(id).fetch(); - if (status) { - window.location.hash = statusURL + '?view=full'; - return; + if (id) { + const { masto } = api({ instance }); + const status = await masto.v1.statuses.$select(id).fetch(); + if (status) { + window.location.hash = statusURL + '?view=full'; + return; + } } } catch (e) {} @@ -61,7 +64,9 @@ export default function HttpRoute() { {uiState === 'loading' ? ( <> <Loader abrupt /> - <h2>Resolving…</h2> + <h2> + <Trans>Resolving…</Trans> + </h2> <p> <a href={url} target="_blank" rel="noopener noreferrer"> {url} @@ -70,7 +75,9 @@ export default function HttpRoute() { </> ) : ( <> - <h2>Unable to resolve URL</h2> + <h2> + <Trans>Unable to resolve URL</Trans> + </h2> <p> <a href={url} target="_blank" rel="noopener noreferrer"> {url} @@ -80,7 +87,9 @@ export default function HttpRoute() { )} <hr /> <p> - <Link to="/">Go home</Link> + <Link to="/"> + <Trans>Go home</Trans> + </Link> </p> </div> ); diff --git a/src/pages/list.jsx b/src/pages/list.jsx index 7ab29709..8fe9e295 100644 --- a/src/pages/list.jsx +++ b/src/pages/list.jsx @@ -1,6 +1,7 @@ import './lists.css'; -import { Menu, MenuItem } from '@szhsin/react-menu'; +import { t, Trans } from '@lingui/macro'; +import { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu'; import { useEffect, useRef, useState } from 'preact/hooks'; import { InView } from 'react-intersection-observer'; import { useNavigate, useParams } from 'react-router-dom'; @@ -10,12 +11,14 @@ import AccountBlock from '../components/account-block'; import Icon from '../components/icon'; import Link from '../components/link'; import ListAddEdit from '../components/list-add-edit'; -import Menu2 from '../components/menu2'; import MenuConfirm from '../components/menu-confirm'; +import MenuLink from '../components/menu-link'; +import Menu2 from '../components/menu2'; import Modal from '../components/modal'; import Timeline from '../components/timeline'; import { api } from '../utils/api'; import { filteredItems } from '../utils/filters'; +import { getList, getLists } from '../utils/lists'; import states, { saveStatus } from '../utils/states'; import useTitle from '../utils/useTitle'; @@ -61,8 +64,9 @@ function List(props) { since_id: latestItem.current, }); let { value } = results; - value = filteredItems(value, 'home'); - if (value?.length) { + const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported + if (value?.length && !valueContainsLatestItem) { + value = filteredItems(value, 'home'); return true; } return false; @@ -71,13 +75,18 @@ function List(props) { } } + const [lists, setLists] = useState([]); + useEffect(() => { + getLists().then(setLists); + }, []); + const [list, setList] = useState({ title: 'List' }); // const [title, setTitle] = useState(`List`); useTitle(list.title, `/l/:id`); useEffect(() => { (async () => { try { - const list = await masto.v1.lists.$select(id).fetch(); + const list = await getList(id); setList(list); // setTitle(list.title); } catch (e) { @@ -95,8 +104,8 @@ function List(props) { key={id} title={list.title} id="list" - emptyText="Nothing yet." - errorText="Unable to load posts." + emptyText={t`Nothing yet.`} + errorText={t`Unable to load posts.`} instance={instance} fetchItems={fetchList} checkForUpdates={checkForUpdates} @@ -107,9 +116,34 @@ function List(props) { showReplyParent // refresh={reloadCount} headerStart={ - <Link to="/l" class="button plain"> - <Icon icon="list" size="l" /> - </Link> + // <Link to="/l" class="button plain"> + // <Icon icon="list" size="l" /> + // </Link> + <Menu2 + overflow="auto" + menuButton={ + <button type="button" class="plain"> + <Icon icon="list" size="l" alt={t`Lists`} /> + <Icon icon="chevron-down" size="s" /> + </button> + } + > + <MenuLink to="/l"> + <span> + <Trans>All Lists</Trans> + </span> + </MenuLink> + {lists?.length > 0 && ( + <> + <MenuDivider /> + {lists.map((list) => ( + <MenuLink key={list.id} to={`/l/${list.id}`}> + <span>{list.title}</span> + </MenuLink> + ))} + </> + )} + </Menu2> } headerEnd={ <Menu2 @@ -120,7 +154,7 @@ function List(props) { position="anchor" menuButton={ <button type="button" class="plain"> - <Icon icon="more" size="l" /> + <Icon icon="more" size="l" alt={t`More`} /> </button> } > @@ -132,11 +166,15 @@ function List(props) { } > <Icon icon="pencil" size="l" /> - <span>Edit</span> + <span> + <Trans>Edit</Trans> + </span> </MenuItem> <MenuItem onClick={() => setShowManageMembersModal(true)}> <Icon icon="group" size="l" /> - <span>Manage members</span> + <span> + <Trans>Manage members</Trans> + </span> </MenuItem> </Menu2> } @@ -233,11 +271,13 @@ function ListManageMembers({ listID, onClose }) { <div class="sheet" id="list-manage-members-container"> {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <h2>Manage members</h2> + <h2> + <Trans>Manage members</Trans> + </h2> </header> <main> <ul> @@ -250,7 +290,7 @@ function ListManageMembers({ listID, onClose }) { {showMore && uiState === 'default' && ( <InView as="li" onChange={(inView) => inView && fetchMembers()}> <button type="button" class="light block" onClick={fetchMembers}> - Show more… + <Trans>Show more…</Trans> </button> </InView> )} @@ -268,7 +308,14 @@ function RemoveAddButton({ account, listID }) { return ( <MenuConfirm confirm={!removed} - confirmLabel={<span>Remove @{account.username} from list?</span>} + confirmLabel={ + <span> + <Trans> + Remove <span class="bidi-isolate">@{account.username}</span> from + list? + </Trans> + </span> + } align="end" menuItemClassName="danger" onClick={() => { @@ -309,7 +356,7 @@ function RemoveAddButton({ account, listID }) { class={`light ${removed ? '' : 'danger'}`} disabled={uiState === 'loading'} > - {removed ? 'Add' : 'Remove…'} + {removed ? t`Add` : t`Remove…`} </button> </MenuConfirm> ); diff --git a/src/pages/lists.jsx b/src/pages/lists.jsx index b06d92f1..575e4872 100644 --- a/src/pages/lists.jsx +++ b/src/pages/lists.jsx @@ -1,6 +1,7 @@ import './lists.css'; -import { useEffect, useReducer, useRef, useState } from 'preact/hooks'; +import { Plural, t, Trans } from '@lingui/macro'; +import { useEffect, useReducer, useState } from 'preact/hooks'; import Icon from '../components/icon'; import Link from '../components/link'; @@ -8,12 +9,11 @@ import ListAddEdit from '../components/list-add-edit'; import Loader from '../components/loader'; import Modal from '../components/modal'; import NavMenu from '../components/nav-menu'; -import { api } from '../utils/api'; +import { fetchLists } from '../utils/lists'; import useTitle from '../utils/useTitle'; function Lists() { - const { masto } = api(); - useTitle(`Lists`, `/l`); + useTitle(t`Lists`, `/l`); const [uiState, setUIState] = useState('default'); const [reloadCount, reload] = useReducer((c) => c + 1, 0); @@ -22,8 +22,7 @@ function Lists() { setUIState('loading'); (async () => { try { - const lists = await masto.v1.lists.list(); - lists.sort((a, b) => a.title.localeCompare(b.title)); + const lists = await fetchLists(); console.log(lists); setLists(lists); setUIState('default'); @@ -47,14 +46,16 @@ function Lists() { <Icon icon="home" size="l" /> </Link> </div> - <h1>Lists</h1> + <h1> + <Trans>Lists</Trans> + </h1> <div class="header-side"> <button type="button" class="plain" onClick={() => setShowListAddEditModal(true)} > - <Icon icon="plus" size="l" alt="New list" /> + <Icon icon="plus" size="l" alt={t`New list`} /> </button> </div> </div> @@ -89,8 +90,7 @@ function Lists() { {lists.length > 1 && ( <footer class="ui-state"> <small class="insignificant"> - {lists.length} list - {lists.length === 1 ? '' : 's'} + <Plural value={lists.length} one="# list" other="# lists" /> </small> </footer> )} @@ -100,9 +100,13 @@ function Lists() { <Loader /> </p> ) : uiState === 'error' ? ( - <p class="ui-state">Unable to load lists.</p> + <p class="ui-state"> + <Trans>Unable to load lists.</Trans> + </p> ) : ( - <p class="ui-state">No lists yet.</p> + <p class="ui-state"> + <Trans>No lists yet.</Trans> + </p> )} </main> </div> diff --git a/src/pages/login.css b/src/pages/login.css index d142f67a..7c9273d8 100644 --- a/src/pages/login.css +++ b/src/pages/login.css @@ -30,14 +30,15 @@ #instances-suggestions { margin: 0.2em 0 0; - padding: 0 0 0 1.2em; + padding: 0; + padding-inline-start: 1.2em; list-style: none; width: 90vw; max-width: 40em; overflow: auto; white-space: nowrap; mask-image: linear-gradient( - to right, + var(--to-forward), transparent, black 1.2em, black calc(100% - 5em), diff --git a/src/pages/login.jsx b/src/pages/login.jsx index 7909a04b..fd64a96d 100644 --- a/src/pages/login.jsx +++ b/src/pages/login.jsx @@ -1,14 +1,22 @@ import './login.css'; +import { t, Trans } from '@lingui/macro'; +import Fuse from 'fuse.js'; import { useEffect, useRef, useState } from 'preact/hooks'; import { useSearchParams } from 'react-router-dom'; import logo from '../assets/logo.svg'; +import LangSelector from '../components/lang-selector'; import Link from '../components/link'; import Loader from '../components/loader'; import instancesListURL from '../data/instances.json?url'; -import { getAuthorizationURL, registerApplication } from '../utils/auth'; +import { + getAuthorizationURL, + getPKCEAuthorizationURL, + registerApplication, +} from '../utils/auth'; +import { supportsPKCE } from '../utils/oauth-pkce'; import store from '../utils/store'; import useTitle from '../utils/useTitle'; @@ -27,12 +35,14 @@ function Login() { ); const [instancesList, setInstancesList] = useState([]); + const searcher = useRef(); useEffect(() => { (async () => { try { const res = await fetch(instancesListURL); const data = await res.json(); setInstancesList(data); + searcher.current = new Fuse(data); } catch (e) { // Silently fail console.error(e); @@ -48,9 +58,32 @@ function Login() { const submitInstance = (instanceURL) => { if (!instanceURL) return; - store.local.set('instanceURL', instanceURL); (async () => { + // WEB_DOMAIN vs LOCAL_DOMAIN negotiation time + // https://docs.joinmastodon.org/admin/config/#web_domain + try { + const res = await fetch(`https://${instanceURL}/.well-known/host-meta`); // returns XML + const text = await res.text(); + // Parse XML + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString(text, 'text/xml'); + // Get Link[template] + const link = xmlDoc.getElementsByTagName('Link')[0]; + const template = link.getAttribute('template'); + const url = URL.parse(template); + const { host } = url; // host includes the port + if (instanceURL !== host) { + console.log(`💫 ${instanceURL} -> ${host}`); + instanceURL = host; + } + } catch (e) { + // Silently fail + console.error(e); + } + + store.local.set('instanceURL', instanceURL); + setUIState('loading'); try { const { client_id, client_secret, vapid_key } = @@ -58,17 +91,36 @@ function Login() { instanceURL, }); - if (client_id && client_secret) { - store.session.set('clientID', client_id); - store.session.set('clientSecret', client_secret); - store.session.set('vapidKey', vapid_key); + const authPKCE = await supportsPKCE({ instanceURL }); + console.log({ authPKCE }); + if (authPKCE) { + if (client_id && client_secret) { + store.sessionCookie.set('clientID', client_id); + store.sessionCookie.set('clientSecret', client_secret); + store.sessionCookie.set('vapidKey', vapid_key); - location.href = await getAuthorizationURL({ - instanceURL, - client_id, - }); + const [url, verifier] = await getPKCEAuthorizationURL({ + instanceURL, + client_id, + }); + store.sessionCookie.set('codeVerifier', verifier); + location.href = url; + } else { + alert(t`Failed to register application`); + } } else { - alert('Failed to register application'); + if (client_id && client_secret) { + store.sessionCookie.set('clientID', client_id); + store.sessionCookie.set('clientSecret', client_secret); + store.sessionCookie.set('vapidKey', vapid_key); + + location.href = await getAuthorizationURL({ + instanceURL, + client_id, + }); + } else { + alert(t`Failed to register application`); + } } setUIState('default'); } catch (e) { @@ -92,30 +144,20 @@ function Login() { console.log(SCHEME) const instancesSuggestions = cleanInstanceText - ? instancesList - .filter((instance) => instance.includes(instanceText)) - .sort((a, b) => { - // Move text that starts with instanceText to the start - const aStartsWith = a - .toLowerCase() - .startsWith(instanceText.toLowerCase()); - const bStartsWith = b - .toLowerCase() - .startsWith(instanceText.toLowerCase()); - if (aStartsWith && !bStartsWith) return -1; - if (!aStartsWith && bStartsWith) return 1; - return 0; + ? searcher.current + ?.search(cleanInstanceText, { + limit: 10, }) - .slice(0, 10) + ?.map((match) => match.item) : []; const selectedInstanceText = instanceTextLooksLikeDomain ? cleanInstanceText : instancesSuggestions?.length - ? instancesSuggestions[0] - : instanceText - ? instancesList.find((instance) => instance.includes(instanceText)) - : null; + ? instancesSuggestions[0] + : instanceText + ? instancesList.find((instance) => instance.includes(instanceText)) + : null; const onSubmit = (e) => { e.preventDefault(); @@ -146,10 +188,12 @@ function Login() { <h1> <img src={logo} alt="" width="80" height="80" /> <br /> - Log in + <Trans>Log in</Trans> </h1> <label> - <p>Instance</p> + <p> + <Trans>Instance</Trans> + </p> <input value={instanceText} required @@ -163,10 +207,11 @@ function Login() { autocapitalize="off" autocomplete="off" spellCheck={false} - placeholder="instance domain" + placeholder={t`instance domain`} onInput={(e) => { setInstanceText(e.target.value); }} + dir="auto" /> {instancesSuggestions?.length > 0 ? ( <ul id="instances-suggestions"> @@ -185,7 +230,9 @@ function Login() { ))} </ul> ) : ( - <div id="instances-eg">e.g. “mastodon.social”</div> + <div id="instances-eg"> + <Trans>e.g. “mastodon.social”</Trans> + </div> )} {/* <datalist id="instances-list"> {instancesList.map((instance) => ( @@ -195,7 +242,9 @@ function Login() { </label> {uiState === 'error' && ( <p class="error"> - Failed to log in. Please try again or another instance. + <Trans> + Failed to log in. Please try again or try another instance. + </Trans> </p> )} <div> @@ -205,8 +254,8 @@ function Login() { } > {selectedInstanceText - ? `Continue with ${selectedInstanceText}` - : 'Continue'} + ? t`Continue with ${selectedInstanceText}` + : t`Continue`} </button>{' '} </div> <Loader hidden={uiState !== 'loading'} /> @@ -214,13 +263,16 @@ function Login() { {!DEFAULT_INSTANCE && ( <p> <a href="https://joinmastodon.org/servers" target="_blank"> - Don't have an account? Create one! + <Trans>Don't have an account? Create one!</Trans> </a> </p> )} <p> - <Link to="/">Go home</Link> + <Link to="/"> + <Trans>Go home</Trans> + </Link> </p> + <LangSelector /> </form> </main> ); diff --git a/src/pages/mentions.jsx b/src/pages/mentions.jsx index da6e5ae0..32a85fc7 100644 --- a/src/pages/mentions.jsx +++ b/src/pages/mentions.jsx @@ -1,9 +1,11 @@ +import { t, Trans } from '@lingui/macro'; import { useMemo, useRef, useState } from 'preact/hooks'; import { useSearchParams } from 'react-router-dom'; import Link from '../components/link'; import Timeline from '../components/timeline'; import { api } from '../utils/api'; +import { fixNotifications } from '../utils/group-notifications'; import { saveStatus } from '../utils/states'; import useTitle from '../utils/useTitle'; @@ -15,7 +17,7 @@ function Mentions({ columnMode, ...props }) { const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams(); const [stateType, setStateType] = useState(null); const type = props?.type || searchParams.get('type') || stateType; - useTitle(`Mentions${type === 'private' ? ' (Private)' : ''}`, '/mentions'); + useTitle(type === 'private' ? t`Private mentions` : t`Mentions`, '/mentions'); const mentionsIterator = useRef(); const latestItem = useRef(); @@ -30,6 +32,8 @@ function Mentions({ columnMode, ...props }) { const results = await mentionsIterator.current.next(); let { value } = results; if (value?.length) { + value = fixNotifications(value); + if (firstLoad) { latestItem.current = value[0].id; console.log('First load', latestItem.current); @@ -95,7 +99,9 @@ function Mentions({ columnMode, ...props }) { latestConversationItem.current, value, ); - if (value?.length) { + const valueContainsLatestItem = + value[0]?.id === latestConversationItem.current; // since_id might not be supported + if (value?.length && !valueContainsLatestItem) { latestConversationItem.current = value[0].lastStatus.id; return true; } @@ -138,7 +144,7 @@ function Mentions({ columnMode, ...props }) { } }} > - All + <Trans>All</Trans> </Link> <Link to="/mentions?type=private" @@ -150,7 +156,7 @@ function Mentions({ columnMode, ...props }) { } }} > - Private + <Trans>Private</Trans> </Link> </div> ); @@ -158,10 +164,10 @@ function Mentions({ columnMode, ...props }) { return ( <Timeline - title="Mentions" + title={t`Mentions`} id="mentions" - emptyText="No one mentioned you :(" - errorText="Unable to load mentions." + emptyText={t`No one mentioned you :(`} + errorText={t`Unable to load mentions.`} instance={instance} fetchItems={fetchItems} checkForUpdates={checkForUpdates} diff --git a/src/pages/notifications.css b/src/pages/notifications.css index 7a9bf706..54ccedfd 100644 --- a/src/pages/notifications.css +++ b/src/pages/notifications.css @@ -1,3 +1,44 @@ +#notifications-page { + .notification { + content-visibility: auto; + } + + .timeline-header { + position: sticky; + --mask-padding: 8px; + top: calc(48px - var(--mask-padding)); + transition: top 0.5s ease-in-out; + header[hidden] ~ & { + top: calc(-1 * var(--mask-padding)); + } + z-index: 1; + background-color: inherit; + mask-image: linear-gradient( + to bottom, + transparent, + #000 var(--mask-padding) calc(100% - var(--mask-padding) * 2), + transparent + ); + + @media (min-width: 40em) { + background-color: var(--bg-faded-color); + } + padding-block: 16px; + margin: 0; + opacity: 1; + + #columns & { + position: static; + background-color: inherit; + } + + small { + font-weight: normal; + font-size: var(--text-size); + } + } +} + .notification { display: flex; padding: 16px !important; @@ -10,8 +51,8 @@ cursor: pointer; } } -.notification.notification-mention { - margin-top: 16px; +.notification-type.notification-mention { + padding-top: 16px; } .only-mentions .notification:not(.notification-mention), .only-mentions .timeline-empty { @@ -139,7 +180,6 @@ max-height: 320px; filter: none; background-color: var(--bg-color); - margin-top: calc(-16px - 1px); border-color: var(--reply-to-color); box-shadow: 0 0 0 3px var(--reply-to-faded-color); } @@ -185,7 +225,7 @@ .notification-group-statuses > li:before { content: counter(index); position: absolute; - left: 0; + inset-inline-start: 0; font-size: 10px; padding: 8px; font-weight: bold; @@ -194,16 +234,21 @@ margin-top: -1px; } .notification-group-statuses > li:not(:last-child) .status-link { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; + border-end-start-radius: 0; + border-end-end-radius: 0; } .notification-group-statuses > li:not(:first-child) .status-link { - border-top-left-radius: 0; - border-top-right-radius: 0; + border-start-start-radius: 0; + border-start-end-radius: 0; } #mentions-option { + position: relative; + z-index: 2; float: right; + &:dir(rtl) { + float: left; + } margin-top: 0.5em; } #mentions-option label { @@ -388,7 +433,7 @@ width: calc(100% - 16px); } .announcements > ul > li:last-child { - border-right: none; + border-inline-end: none; } .announcements .announcement-block { padding: 16px; @@ -421,3 +466,167 @@ color: var(--text-color); background-color: var(--link-faded-color); } + +/* FILTERED NOTIFICATIONS */ + +.filtered-notifications { + padding-block-end: 16px; + + summary { + padding: 8px 16px; + cursor: pointer; + font-weight: 600; + user-select: none; + margin: 16px 0 0; + color: var(--text-insignificant-color); + + &::marker, + &::-webkit-details-marker { + color: var(--text-insignificant-color); + } + } + details[open] summary { + color: var(--text-color); + } + + summary + ul { + } + ul { + list-style: none; + padding: 0; + margin: 0; + max-height: 50vh; + max-height: 50dvh; + overflow: auto; + border-top: 1px solid var(--outline-color); + border-bottom: 1px solid var(--outline-color); + background-color: var(--bg-faded-color); + + @media (min-width: 40em) { + background-color: var(--bg-color); + border-radius: 16px; + border-width: 0; + } + + li { + display: flex; + padding: 16px; + row-gap: 8px; + column-gap: 16px; + border-bottom: 1px solid var(--outline-color); + } + li:last-child { + border-bottom: none; + } + + .request-notifcations { + min-width: 0; + flex-grow: 1; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 8px; + + .last-post { + max-width: 100%; + + > .status-link { + border-radius: 8px; + overflow: hidden; + --max-height: 160px; + max-height: var(--max-height); + border: 1px solid var(--outline-color); + + &:is(:hover, :focus-visible) { + border-color: var(--outline-hover-color); + } + + .status { + mask-image: linear-gradient( + to bottom, + black calc(var(--max-height) / 2), + transparent calc(var(--max-height) - 8px) + ); + font-size: calc(var(--text-size) * 0.9); + + .content-container { + pointer-events: none; + filter: saturate(0.5); + } + } + } + } + + .request-notifications-account { + display: flex; + align-items: center; + gap: 4px; + + small { + flex: 1; + min-width: 0; + } + } + } + + .notification-request-buttons { + grid-area: buttons; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 4px; + + button { + max-width: 30vw; + } + + .notification-request-states { + min-height: 32px; + text-align: center; + vertical-align: middle; + + .icon { + margin-inline: 8px; + + &.notification-accepted { + color: var(--green-color); + } + + &.notification-dismissed { + color: var(--red-color); + } + } + } + } + } +} + +#notifications-settings { + label { + display: flex; + gap: 8px; + align-items: center; + justify-content: space-between; + + input[type='checkbox'] { + flex-shrink: 0; + } + } + + .notification-policy-fields { + display: flex; + flex-direction: column; + gap: 8px; + + select:has(option[value='accept']:checked) { + box-shadow: 0 0 0 2px var(--green-color); + } + select:has(option[value='filter']:checked) { + box-shadow: 0 0 0 2px var(--orange-color); + } + select:has(option[value='drop']:checked) { + box-shadow: 0 0 0 2px var(--red-color); + } + } +} diff --git a/src/pages/notifications.jsx b/src/pages/notifications.jsx index aa08aafd..36caf316 100644 --- a/src/pages/notifications.jsx +++ b/src/pages/notifications.jsx @@ -1,8 +1,16 @@ import './notifications.css'; +import { msg, Plural, t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { Fragment } from 'preact'; import { memo } from 'preact/compat'; -import { useCallback, useEffect, useRef, useState } from 'preact/hooks'; +import { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; import { InView } from 'react-intersection-observer'; import { useSearchParams } from 'react-router-dom'; @@ -14,22 +22,31 @@ import FollowRequestButtons from '../components/follow-request-buttons'; import Icon from '../components/icon'; import Link from '../components/link'; import Loader from '../components/loader'; +import Modal from '../components/modal'; import NavMenu from '../components/nav-menu'; import Notification from '../components/notification'; +import Status from '../components/status'; import { api } from '../utils/api'; import enhanceContent from '../utils/enhance-content'; -import groupNotifications from '../utils/group-notifications'; +import groupNotifications, { + groupNotifications2, + massageNotifications2, +} from '../utils/group-notifications'; import handleContentLinks from '../utils/handle-content-links'; +import mem from '../utils/mem'; import niceDateTime from '../utils/nice-date-time'; import { getRegistration } from '../utils/push-notifications'; import shortenNumber from '../utils/shorten-number'; +import showToast from '../utils/show-toast'; import states, { saveStatus } from '../utils/states'; import { getCurrentInstance } from '../utils/store-utils'; +import supports from '../utils/supports'; import usePageVisibility from '../utils/usePageVisibility'; import useScroll from '../utils/useScroll'; import useTitle from '../utils/useTitle'; -const LIMIT = 30; // 30 is the maximum limit :( +const NOTIFICATIONS_LIMIT = 80; +const NOTIFICATIONS_GROUPED_LIMIT = 20; const emptySearchParams = new URLSearchParams(); const scrollIntoViewOptions = { @@ -38,8 +55,61 @@ const scrollIntoViewOptions = { behavior: 'smooth', }; +const memSupportsGroupedNotifications = mem( + () => supports('@mastodon/grouped-notifications'), + { + maxAge: 1000 * 60 * 5, // 5 minutes + }, +); + +export function mastoFetchNotifications(opts = {}) { + const { masto } = api(); + if ( + states.settings.groupedNotificationsAlpha && + memSupportsGroupedNotifications() + ) { + // https://github.com/mastodon/mastodon/pull/29889 + return masto.v2.notifications.list({ + limit: NOTIFICATIONS_GROUPED_LIMIT, + ...opts, + }); + } else { + return masto.v1.notifications.list({ + limit: NOTIFICATIONS_LIMIT, + ...opts, + }); + } +} + +export function getGroupedNotifications(notifications) { + if ( + states.settings.groupedNotificationsAlpha && + memSupportsGroupedNotifications() + ) { + return groupNotifications2(notifications); + } else { + return groupNotifications(notifications); + } +} + +const NOTIFICATIONS_POLICIES = [ + 'forNotFollowing', + 'forNotFollowers', + 'forNewAccounts', + 'forPrivateMentions', + 'forLimitedAccounts', +]; +const NOTIFICATIONS_POLICIES_TEXT = { + forNotFollowing: msg`You don't follow`, + forNotFollowers: msg`Who don't follow you`, + forNewAccounts: msg`With a new account`, + forPrivateMentions: msg`Who unsolicitedly private mention you`, + forLimitedAccounts: msg`Who are limited by server moderators`, +}; + function Notifications({ columnMode }) { - useTitle('Notifications', '/notifications'); + const { _ } = useLingui(); + useTitle(t`Notifications`, '/notifications'); const { masto, instance } = api(); const snapStates = useSnapshot(states); const [uiState, setUIState] = useState('default'); @@ -63,13 +133,19 @@ function Notifications({ columnMode }) { async function fetchNotifications(firstLoad) { if (firstLoad || !notificationsIterator.current) { // Reset iterator - notificationsIterator.current = masto.v1.notifications.list({ - limit: LIMIT, + notificationsIterator.current = mastoFetchNotifications({ excludeTypes: ['follow_request'], }); } + if (/max_id=($|&)/i.test(notificationsIterator.current?.nextParams)) { + // Pixelfed returns next paginationed link with empty max_id + // I assume, it's done (end of list) + return { + done: true, + }; + } const allNotifications = await notificationsIterator.current.next(); - const notifications = allNotifications.value; + const notifications = massageNotifications2(allNotifications.value); if (notifications?.length) { notifications.forEach((notification) => { @@ -78,17 +154,43 @@ function Notifications({ columnMode }) { }); }); - const groupedNotifications = groupNotifications(notifications); + // TEST: Slot in a fake notification to test 'severed_relationships' + // notifications.unshift({ + // id: '123123', + // type: 'severed_relationships', + // createdAt: '2024-03-22T19:20:08.316Z', + // event: { + // type: 'account_suspension', + // targetName: 'mastodon.dev', + // followersCount: 0, + // followingCount: 0, + // }, + // }); + + // TEST: Slot in a fake notification to test 'moderation_warning' + // notifications.unshift({ + // id: '123123', + // type: 'moderation_warning', + // createdAt: new Date().toISOString(), + // moderation_warning: { + // id: '1231234', + // action: 'mark_statuses_as_sensitive', + // }, + // }); + + // console.log({ notifications }); + + const groupedNotifications = getGroupedNotifications(notifications); if (firstLoad) { - states.notificationsLast = notifications[0]; + states.notificationsLast = groupedNotifications[0]; states.notifications = groupedNotifications; // Update last read marker masto.v1.markers .create({ notifications: { - lastReadId: notifications[0].id, + lastReadId: groupedNotifications[0].id, }, }) .catch(() => {}); @@ -136,6 +238,28 @@ function Notifications({ columnMode }) { } } + const supportsFilteredNotifications = supports( + '@mastodon/filtered-notifications', + ); + const [showNotificationsSettings, setShowNotificationsSettings] = + useState(false); + const [notificationsPolicy, setNotificationsPolicy] = useState({}); + function fetchNotificationsPolicy() { + return masto.v2.notifications.policy.fetch().catch(() => {}); + } + function loadNotificationsPolicy() { + fetchNotificationsPolicy() + .then((policy) => { + console.log('✨ Notifications policy', policy); + setNotificationsPolicy(policy); + }) + .catch(() => {}); + } + const [notificationsRequests, setNotificationsRequests] = useState(null); + function fetchNotificationsRequest() { + return masto.v1.notifications.requests.list(); + } + const loadNotifications = (firstLoad) => { setShowNew(false); setUIState('loading'); @@ -161,6 +285,10 @@ function Notifications({ columnMode }) { setFollowRequests(requests); }) .catch(() => {}); + + if (supportsFilteredNotifications) { + loadNotificationsPolicy(); + } } const { done } = await fetchNotificationsPromise; @@ -168,6 +296,7 @@ function Notifications({ columnMode }) { setUIState('default'); } catch (e) { + console.error(e); setUIState('error'); } })(); @@ -216,7 +345,6 @@ function Notifications({ columnMode }) { const lastHiddenTime = useRef(); usePageVisibility((visible) => { - let unsub; if (visible) { const timeDiff = Date.now() - lastHiddenTime.current; if (!lastHiddenTime.current || timeDiff > 1000 * 3) { @@ -227,20 +355,21 @@ function Notifications({ columnMode }) { } else { lastHiddenTime.current = Date.now(); } - unsub = subscribeKey(states, 'notificationsShowNew', (v) => { - if (uiState === 'loading') { - return; - } - if (v) { - loadUpdates(); - } - setShowNew(v); - }); } - return () => { - unsub?.(); - }; }); + const firstLoad = useRef(true); + useEffect(() => { + let unsub = subscribeKey(states, 'notificationsShowNew', (v) => { + if (firstLoad.current) { + firstLoad.current = false; + return; + } + if (uiState === 'loading') return; + if (v) loadUpdates(); + setShowNew(v); + }); + return () => unsub?.(); + }, []); const todayDate = new Date(); const yesterdayDate = new Date(todayDate - 24 * 60 * 60 * 1000); @@ -348,15 +477,24 @@ function Notifications({ columnMode }) { } }); + const today = new Date(); + const todaySubHeading = useMemo(() => { + return niceDateTime(today, { + forceOpts: { + weekday: 'long', + }, + }); + }, [today]); + return ( <div id="notifications-page" class="deck-container" ref={(node) => { scrollableRef.current = node; - jRef.current = node; - kRef.current = node; - oRef.current = node; + jRef(node); + kRef(node); + oRef(node); }} tabIndex="-1" > @@ -379,12 +517,28 @@ function Notifications({ columnMode }) { <div class="header-side"> <NavMenu /> <Link to="/" class="button plain"> - <Icon icon="home" size="l" alt="Home" /> + <Icon icon="home" size="l" alt={t`Home`} /> </Link> </div> - <h1>Notifications</h1> + <h1> + <Trans>Notifications</Trans> + </h1> <div class="header-side"> - {/* <Loader hidden={uiState !== 'loading'} /> */} + {supportsFilteredNotifications && ( + <button + type="button" + class="button plain4" + onClick={() => { + setShowNotificationsSettings(true); + }} + > + <Icon + icon="settings" + size="l" + alt={t`Notifications settings`} + /> + </button> + )} </div> </div> {showNew && uiState !== 'loading' && ( @@ -399,7 +553,7 @@ function Notifications({ columnMode }) { }); }} > - <Icon icon="arrow-up" /> New notifications + <Icon icon="arrow-up" /> <Trans>New notifications</Trans> </button> )} </header> @@ -410,7 +564,11 @@ function Notifications({ columnMode }) { <summary> <span> <Icon icon="announce" class="announcement-icon" size="l" />{' '} - <b>Announcement{announcements.length > 1 ? 's' : ''}</b>{' '} + <Plural + value={announcements.length} + one="Announcement" + other="Announcements" + />{' '} <small class="insignificant">{instance}</small> </span> {announcements.length > 1 && ( @@ -452,10 +610,18 @@ function Notifications({ columnMode }) { )} {followRequests.length > 0 && ( <div class="follow-requests"> - <h2 class="timeline-header">Follow requests</h2> + <h2 class="timeline-header"> + <Trans>Follow requests</Trans> + </h2> {followRequests.length > 5 ? ( <details> - <summary>{followRequests.length} follow requests</summary> + <summary> + <Plural + value={followRequests.length} + one="# follow request" + other="# follow requests" + /> + </summary> <ul> {followRequests.map((account) => ( <li key={account.id}> @@ -489,6 +655,79 @@ function Notifications({ columnMode }) { )} </div> )} + {supportsFilteredNotifications && + notificationsPolicy?.summary?.pendingRequestsCount > 0 && ( + <div class="shazam-container"> + <div class="shazam-container-inner"> + <div class="filtered-notifications"> + <details + onToggle={async (e) => { + const { open } = e.target; + if (open) { + const requests = await fetchNotificationsRequest(); + setNotificationsRequests(requests); + console.log({ open, requests }); + } + }} + > + <summary> + <Plural + value={notificationsPolicy.summary.pendingRequestsCount} + one="Filtered notifications from # person" + other="Filtered notifications from # people" + /> + </summary> + {!notificationsRequests ? ( + <p class="ui-state"> + <Loader abrupt /> + </p> + ) : ( + notificationsRequests?.length > 0 && ( + <ul> + {notificationsRequests.map((request) => ( + <li key={request.id}> + <div class="request-notifcations"> + {!request.lastStatus?.id && ( + <AccountBlock + useAvatarStatic + showStats + account={request.account} + /> + )} + {request.lastStatus?.id && ( + <div class="last-post"> + <Link + class="status-link" + to={`/${instance}/s/${request.lastStatus.id}`} + > + <Status + status={request.lastStatus} + size="s" + readOnly + /> + </Link> + </div> + )} + <NotificationRequestModalButton + request={request} + /> + </div> + <NotificationRequestButtons + request={request} + onChange={() => { + loadNotifications(true); + }} + /> + </li> + ))} + </ul> + ) + )} + </details> + </div> + </div> + </div> + )} <div id="mentions-option"> <label> <input @@ -498,13 +737,16 @@ function Notifications({ columnMode }) { setOnlyMentions(e.target.checked); }} />{' '} - Only mentions + <Trans>Only mentions</Trans> </label> </div> - <h2 class="timeline-header">Today</h2> - {showTodayEmpty && !!snapStates.notifications.length && ( + <h2 class="timeline-header"> + <Trans>Today</Trans>{' '} + <small class="insignificant bidi-isolate">{todaySubHeading}</small> + </h2> + {showTodayEmpty && ( <p class="ui-state insignificant"> - {uiState === 'default' ? "You're all caught up." : <>…</>} + {uiState === 'default' ? t`You're all caught up.` : <>…</>} </p> )} {snapStates.notifications.length ? ( @@ -527,17 +769,29 @@ function Notifications({ columnMode }) { const heading = notificationDay.toDateString() === yesterdayDate.toDateString() - ? 'Yesterday' + ? t`Yesterday` : niceDateTime(currentDay, { hideTime: true, }); + const subHeading = niceDateTime(currentDay, { + forceOpts: { + weekday: 'long', + }, + }); return ( - <Fragment key={notification.id}> - {differentDay && <h2 class="timeline-header">{heading}</h2>} + <Fragment key={notification._ids || notification.id}> + {differentDay && ( + <h2 class="timeline-header"> + <span>{heading}</span>{' '} + <small class="insignificant bidi-isolate"> + {subHeading} + </small> + </h2> + )} <Notification instance={instance} notification={notification} - key={notification.id} + key={notification._ids || notification.id} /> </Fragment> ); @@ -563,11 +817,11 @@ function Notifications({ columnMode }) { )} {uiState === 'error' && ( <p class="ui-state"> - Unable to load notifications + <Trans>Unable to load notifications</Trans> <br /> <br /> <button type="button" onClick={() => loadNotifications(true)}> - Try again + <Trans>Try again</Trans> </button> </p> )} @@ -591,12 +845,100 @@ function Notifications({ columnMode }) { {uiState === 'loading' ? ( <Loader abrupt /> ) : ( - <>Show more…</> + <Trans>Show more…</Trans> )} </button> </InView> )} </div> + {supportsFilteredNotifications && showNotificationsSettings && ( + <Modal + onClick={(e) => { + if (e.target === e.currentTarget) { + setShowNotificationsSettings(false); + } + }} + > + <div class="sheet" id="notifications-settings" tabIndex="-1"> + <button + type="button" + class="sheet-close" + onClick={() => setShowNotificationsSettings(false)} + > + <Icon icon="x" alt={t`Close`} /> + </button> + <header> + <h2> + <Trans>Notifications settings</Trans> + </h2> + </header> + <main> + <form + onSubmit={(e) => { + e.preventDefault(); + const { + forNotFollowing, + forNotFollowers, + forNewAccounts, + forPrivateMentions, + forLimitedAccounts, + } = e.target; + const newPolicy = { + ...notificationsPolicy, + forNotFollowing: forNotFollowing.value, + forNotFollowers: forNotFollowers.value, + forNewAccounts: forNewAccounts.value, + forPrivateMentions: forPrivateMentions.value, + forLimitedAccounts: forLimitedAccounts.value, + }; + setNotificationsPolicy(newPolicy); + setShowNotificationsSettings(false); + (async () => { + try { + await masto.v2.notifications.policy.update(newPolicy); + showToast(t`Notifications settings updated`); + } catch (e) { + console.error(e); + } + })(); + }} + > + <p> + <Trans>Filter out notifications from people:</Trans> + </p> + <div class="notification-policy-fields"> + {NOTIFICATIONS_POLICIES.map((key) => { + const value = notificationsPolicy[key]; + return ( + <div key={key}> + <label> + {_(NOTIFICATIONS_POLICIES_TEXT[key])} + <select name={key} defaultValue={value} class="small"> + <option value="accept"> + <Trans>Accept</Trans> + </option> + <option value="filter"> + <Trans>Filter</Trans> + </option> + <option value="drop"> + <Trans>Ignore</Trans> + </option> + </select> + </label> + </div> + ); + })} + </div> + <p> + <button type="submit"> + <Trans>Save</Trans> + </button> + </p> + </form> + </main> + </div> + </Modal> + )} </div> ); } @@ -652,10 +994,12 @@ function AnnouncementBlock({ announcement }) { {' '} •{' '} <span class="ib"> - Updated{' '} - <time datetime={updatedAtDate.toISOString()}> - {niceDateTime(updatedAtDate)} - </time> + <Trans> + Updated{' '} + <time datetime={updatedAtDate.toISOString()}> + {niceDateTime(updatedAtDate)} + </time> + </Trans> </span> </> )} @@ -679,4 +1023,196 @@ function AnnouncementBlock({ announcement }) { ); } +function fetchNotficationsByAccount(accountID) { + const { masto } = api(); + return masto.v1.notifications.list({ + accountID, + }); +} +function NotificationRequestModalButton({ request }) { + const { instance } = api(); + const [uiState, setUIState] = useState('loading'); + const { account, lastStatus } = request; + const [showModal, setShowModal] = useState(false); + const [notifications, setNotifications] = useState([]); + + function onClose() { + setShowModal(false); + } + + useEffect(() => { + if (!request?.account?.id) return; + if (!showModal) return; + setUIState('loading'); + (async () => { + const notifs = await fetchNotficationsByAccount(request.account.id); + setNotifications(notifs || []); + setUIState('default'); + })(); + }, [showModal, request?.account?.id]); + + return ( + <> + <button + type="button" + class="plain4 request-notifications-account" + onClick={() => { + setShowModal(true); + }} + > + <Icon icon="notification" class="more-insignificant" />{' '} + <small> + <Trans> + View notifications from{' '} + <span class="bidi-isolate">@{account.username}</span> + </Trans> + </small>{' '} + <Icon icon="chevron-down" /> + </button> + {showModal && ( + <Modal + onClick={(e) => { + if (e.target === e.currentTarget) { + onClose(); + } + }} + > + <div class="sheet" tabIndex="-1"> + <button type="button" class="sheet-close" onClick={onClose}> + <Icon icon="x" alt={t`Close`} /> + </button> + <header> + <b> + <Trans> + Notifications from{' '} + <span class="bidi-isolate">@{account.username}</span> + </Trans> + </b> + </header> + <main> + {uiState === 'loading' ? ( + <p class="ui-state"> + <Loader abrupt /> + </p> + ) : ( + notifications.map((notification) => ( + <div + class="notification-peek" + onClick={(e) => { + const { target } = e; + // If button or links + if ( + e.target.tagName === 'BUTTON' || + e.target.tagName === 'A' + ) { + onClose(); + } + }} + > + <Notification + instance={instance} + notification={notification} + isStatic + /> + </div> + )) + )} + </main> + </div> + </Modal> + )} + </> + ); +} + +function NotificationRequestButtons({ request, onChange }) { + const { masto } = api(); + const [uiState, setUIState] = useState('default'); + const [requestState, setRequestState] = useState(null); // accept, dismiss + const hasRequestState = requestState !== null; + + return ( + <p class="notification-request-buttons"> + <button + type="button" + disabled={uiState === 'loading' || hasRequestState} + onClick={() => { + setUIState('loading'); + (async () => { + try { + await masto.v1.notifications.requests + .$select(request.id) + .accept(); + setRequestState('accept'); + setUIState('default'); + onChange({ + request, + state: 'accept', + }); + showToast( + t`Notifications from @${request.account.username} will not be filtered from now on.`, + ); + } catch (error) { + setUIState('error'); + console.error(error); + showToast(t`Unable to accept notification request`); + } + })(); + }} + > + <Trans>Allow</Trans> + </button>{' '} + <button + type="button" + disabled={uiState === 'loading' || hasRequestState} + class="light danger" + onClick={() => { + setUIState('loading'); + (async () => { + try { + await masto.v1.notifications.requests + .$select(request.id) + .dismiss(); + setRequestState('dismiss'); + setUIState('default'); + onChange({ + request, + state: 'dismiss', + }); + showToast( + t`Notifications from @${request.account.username} will not show up in Filtered notifications from now on.`, + ); + } catch (error) { + setUIState('error'); + console.error(error); + showToast(t`Unable to dismiss notification request`); + } + })(); + }} + > + <Trans>Dismiss</Trans> + </button> + <span class="notification-request-states"> + {uiState === 'loading' ? ( + <Loader abrupt /> + ) : requestState === 'accept' ? ( + <Icon + icon="check-circle" + alt={t`Accepted`} + class="notification-accepted" + /> + ) : ( + requestState === 'dismiss' && ( + <Icon + icon="x-circle" + alt={t`Dismissed`} + class="notification-dismissed" + /> + ) + )} + </span> + </p> + ); +} + export default memo(Notifications); diff --git a/src/pages/public.jsx b/src/pages/public.jsx index 089d084a..4663c544 100644 --- a/src/pages/public.jsx +++ b/src/pages/public.jsx @@ -1,3 +1,4 @@ +import { t, Trans } from '@lingui/macro'; import { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu'; import { useRef } from 'preact/hooks'; import { useNavigate, useParams } from 'react-router-dom'; @@ -8,8 +9,8 @@ import Menu2 from '../components/menu2'; import Timeline from '../components/timeline'; import { api } from '../utils/api'; import { filteredItems } from '../utils/filters'; -import states from '../utils/states'; -import { saveStatus } from '../utils/states'; +import states, { saveStatus } from '../utils/states'; +import supports from '../utils/supports'; import useTitle from '../utils/useTitle'; const LIMIT = 20; @@ -22,7 +23,9 @@ function Public({ local, columnMode, ...props }) { instance: props?.instance || params.instance, }); const { masto: currentMasto, instance: currentInstance } = api(); - const title = `${isLocal ? 'Local' : 'Federated'} timeline (${instance})`; + const title = isLocal + ? t`Local timeline (${instance})` + : t`Federated timeline (${instance})`; useTitle(title, isLocal ? `/:instance?/p/l` : `/:instance?/p`); // const navigate = useNavigate(); const latestItem = useRef(); @@ -30,10 +33,14 @@ function Public({ local, columnMode, ...props }) { const publicIterator = useRef(); async function fetchPublic(firstLoad) { if (firstLoad || !publicIterator.current) { - publicIterator.current = masto.v1.timelines.public.list({ + const opts = { limit: LIMIT, - local: isLocal, - }); + local: isLocal || undefined, + }; + if (!isLocal && supports('@pixelfed/global-feed')) { + opts.remote = true; + } + publicIterator.current = masto.v1.timelines.public.list(opts); } const results = await publicIterator.current.next(); let { value } = results; @@ -63,8 +70,9 @@ function Public({ local, columnMode, ...props }) { }) .next(); let { value } = results; - value = filteredItems(value, 'public'); - if (value?.length) { + const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported + if (value?.length && !valueContainsLatestItem) { + value = filteredItems(value, 'public'); return true; } return false; @@ -79,14 +87,14 @@ function Public({ local, columnMode, ...props }) { title={title} titleComponent={ <h1 class="header-double-lines"> - <b>{isLocal ? 'Local timeline' : 'Federated timeline'}</b> + <b>{isLocal ? t`Local timeline` : t`Federated timeline`}</b> <div>{instance}</div> </h1> } id="public" instance={instance} - emptyText="No one has posted anything yet." - errorText="Unable to load posts" + emptyText={t`No one has posted anything yet.`} + errorText={t`Unable to load posts`} fetchItems={fetchPublic} checkForUpdates={checkForUpdates} useItemID @@ -103,18 +111,24 @@ function Public({ local, columnMode, ...props }) { position="anchor" menuButton={ <button type="button" class="plain"> - <Icon icon="more" size="l" /> + <Icon icon="more" size="l" alt={t`More`} /> </button> } > <MenuItem href={isLocal ? `/#/${instance}/p` : `/#/${instance}/p/l`}> {isLocal ? ( <> - <Icon icon="transfer" /> <span>Switch to Federated</span> + <Icon icon="transfer" />{' '} + <span> + <Trans>Switch to Federated</Trans> + </span> </> ) : ( <> - <Icon icon="transfer" /> <span>Switch to Local</span> + <Icon icon="transfer" />{' '} + <span> + <Trans>Switch to Local</Trans> + </span> </> )} </MenuItem> @@ -122,10 +136,10 @@ function Public({ local, columnMode, ...props }) { <MenuItem onClick={() => { let newInstance = prompt( - 'Enter a new instance e.g. "mastodon.social"', + t`Enter a new instance e.g. "mastodon.social"`, ); if (!/\./.test(newInstance)) { - if (newInstance) alert('Invalid instance'); + if (newInstance) alert(t`Invalid instance`); return; } if (newInstance) { @@ -137,7 +151,10 @@ function Public({ local, columnMode, ...props }) { } }} > - <Icon icon="bus" /> <span>Go to another instance…</span> + <Icon icon="bus" />{' '} + <span> + <Trans>Go to another instance…</Trans> + </span> </MenuItem> {currentInstance !== instance && ( <MenuItem @@ -149,7 +166,9 @@ function Public({ local, columnMode, ...props }) { > <Icon icon="bus" />{' '} <small class="menu-double-lines"> - Go to my instance (<b>{currentInstance}</b>) + <Trans> + Go to my instance (<b>{currentInstance}</b>) + </Trans> </small> </MenuItem> )} diff --git a/src/pages/search.css b/src/pages/search.css index 8127cffb..1c939c8e 100644 --- a/src/pages/search.css +++ b/src/pages/search.css @@ -48,10 +48,10 @@ a { .icon { vertical-align: middle; - transition: transform 0.2s; + transition: margin 0.2s; } &:hover .icon { - transform: translateX(4px); + margin-inline-start: 4px; } } } @@ -101,9 +101,8 @@ ul.link-list.hashtag-list li a { } .search-popover { position: absolute; - left: 8px; + inset-inline-start: 8px; max-width: calc(100% - 16px); - /* right: 8px; */ background-color: var(--bg-color); border: 1px solid var(--outline-color); box-shadow: 0 4px 24px var(--drop-shadow-color); @@ -118,7 +117,8 @@ ul.link-list.hashtag-list li a { } .search-popover-item { text-decoration: none; - padding: 8px 16px 8px 8px; + padding: 8px; + padding-inline-end: 16px; display: flex; gap: 8px; align-items: center; @@ -132,10 +132,15 @@ ul.link-list.hashtag-list li a { } .search-popover-item:is(:focus, .focus) { box-shadow: inset 4px 0 0 0 var(--button-bg-color); + :dir(rtl) & { + box-shadow: inset -4px 0 0 0 var(--button-bg-color); + } } .search-popover-item :is(mark, q) { color: var(--text-color); background-color: var(--link-bg-color); + unicode-bidi: isolate; + direction: initial; } .search-popover-item:is(:hover, :focus, .focus) :is(mark, q) { background-color: var(--link-bg-color); diff --git a/src/pages/search.jsx b/src/pages/search.jsx index 0e1632ab..61deb3d2 100644 --- a/src/pages/search.jsx +++ b/src/pages/search.jsx @@ -1,6 +1,7 @@ import './search.css'; import { useAutoAnimate } from '@formkit/auto-animate/preact'; +import { t, Trans } from '@lingui/macro'; import { useEffect, useLayoutEffect, useRef, useState } from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; import { InView } from 'react-intersection-observer'; @@ -23,6 +24,12 @@ const SHORT_LIMIT = 5; const LIMIT = 40; const emptySearchParams = new URLSearchParams(); +const scrollIntoViewOptions = { + block: 'nearest', + inline: 'center', + behavior: 'smooth', +}; + function Search({ columnMode, ...props }) { const params = columnMode ? {} : useParams(); const { masto, instance, authenticated } = api({ @@ -35,22 +42,23 @@ function Search({ columnMode, ...props }) { const type = columnMode ? 'statuses' : props?.type || searchParams.get('type'); - useTitle( - q - ? `Search: ${q}${ - type - ? ` (${ - { - statuses: 'Posts', - accounts: 'Accounts', - hashtags: 'Hashtags', - }[type] - })` - : '' - }` - : 'Search', - `/search`, - ); + let title = t`Search`; + if (q) { + switch (type) { + case 'statuses': + title = t`Search: ${q} (Posts)`; + break; + case 'accounts': + title = t`Search: ${q} (Accounts)`; + break; + case 'hashtags': + title = t`Search: ${q} (Hashtags)`; + break; + default: + title = t`Search: ${q}`; + } + } + useTitle(title, `/search`); const [showMore, setShowMore] = useState(false); const offsetRef = useRef(0); @@ -71,6 +79,11 @@ function Search({ columnMode, ...props }) { setAccountResults([]); setHashtagResults([]); }, [q]); + const typeResults = { + statuses: statusResults, + accounts: accountResults, + hashtags: hashtagResults, + }; const setTypeResultsFunc = { statuses: setStatusResults, accounts: setAccountResults, @@ -128,10 +141,16 @@ function Search({ columnMode, ...props }) { offsetRef.current = LIMIT; setShowMore(!!length); } else { - setTypeResultsFunc[type]((prev) => [...prev, ...results[type]]); - const length = results[type]?.length; - offsetRef.current = offsetRef.current + LIMIT; - setShowMore(!!length); + // If first item is the same, it means API doesn't support offset + // I know this is a very basic check, but it works for now + if (results[type]?.[0]?.id === typeResults[type]?.[0]?.id) { + setShowMore(false); + } else { + setTypeResultsFunc[type]((prev) => [...prev, ...results[type]]); + const length = results[type]?.length; + offsetRef.current = offsetRef.current + LIMIT; + setShowMore(!!length); + } } } else { setStatusResults(results.statuses || []); @@ -165,28 +184,102 @@ function Search({ columnMode, ...props }) { }); useEffect(() => { + let timer; searchFormRef.current?.setValue?.(q || ''); if (q) { loadResults(true); } else { - searchFormRef.current?.focus?.(); + timer = setTimeout(() => { + searchFormRef.current?.focus?.(); + }, 150); // Right after focusDeck runs } + return () => clearTimeout(timer); }, [q, type, instance]); useHotkeys( ['/', 'Slash'], (e) => { searchFormRef.current?.focus?.(); + searchFormRef.current?.select?.(); }, { preventDefault: true, }, ); + const itemsSelector = '.timeline > li > a, .hashtag-list > li > a'; + const jRef = useHotkeys('j', () => { + const activeItem = document.activeElement.closest(itemsSelector); + const activeItemRect = activeItem?.getBoundingClientRect(); + const allItems = Array.from( + scrollableRef.current.querySelectorAll(itemsSelector), + ); + if ( + activeItem && + activeItemRect.top < scrollableRef.current.clientHeight && + activeItemRect.bottom > 0 + ) { + const activeItemIndex = allItems.indexOf(activeItem); + let nextItem = allItems[activeItemIndex + 1]; + if (nextItem) { + nextItem.focus(); + nextItem.scrollIntoView(scrollIntoViewOptions); + } + } else { + const topmostItem = allItems.find((item) => { + const itemRect = item.getBoundingClientRect(); + return itemRect.top >= 44 && itemRect.left >= 0; + }); + if (topmostItem) { + topmostItem.focus(); + topmostItem.scrollIntoView(scrollIntoViewOptions); + } + } + }); + + const kRef = useHotkeys('k', () => { + // focus on previous status after active item + const activeItem = document.activeElement.closest(itemsSelector); + const activeItemRect = activeItem?.getBoundingClientRect(); + const allItems = Array.from( + scrollableRef.current.querySelectorAll(itemsSelector), + ); + if ( + activeItem && + activeItemRect.top < scrollableRef.current.clientHeight && + activeItemRect.bottom > 0 + ) { + const activeItemIndex = allItems.indexOf(activeItem); + let prevItem = allItems[activeItemIndex - 1]; + if (prevItem) { + prevItem.focus(); + prevItem.scrollIntoView(scrollIntoViewOptions); + } + } else { + const topmostItem = allItems.find((item) => { + const itemRect = item.getBoundingClientRect(); + return itemRect.top >= 44 && itemRect.left >= 0; + }); + if (topmostItem) { + topmostItem.focus(); + topmostItem.scrollIntoView(scrollIntoViewOptions); + } + } + }); + const [filterBarParent] = useAutoAnimate(); return ( - <div id="search-page" class="deck-container" ref={scrollableRef}> + <div + id="search-page" + class="deck-container" + tabIndex="-1" + ref={(node) => { + scrollableRef.current = node; + jRef(node); + kRef(node); + }} + > <div class="timeline-deck deck"> <header class={uiState === 'loading' ? 'loading' : ''}> <div class="header-grid"> @@ -203,7 +296,7 @@ function Search({ columnMode, ...props }) { }} disabled={uiState === 'loading'} > - <Icon icon="search" size="l" /> + <Icon icon="search" size="l" alt={t`Search`} /> </button> </div> </div> @@ -216,22 +309,22 @@ function Search({ columnMode, ...props }) { > {!!type && ( <Link to={`/search${q ? `?q=${encodeURIComponent(q)}` : ''}`}> - ‹ All + <Icon icon="chevron-left" /> <Trans>All</Trans> </Link> )} {[ { - label: 'Accounts', + label: t`Accounts`, type: 'accounts', to: `/search?q=${encodeURIComponent(q)}&type=accounts`, }, { - label: 'Hashtags', + label: t`Hashtags`, type: 'hashtags', to: `/search?q=${encodeURIComponent(q)}&type=hashtags`, }, { - label: 'Posts', + label: t`Posts`, type: 'statuses', to: `/search?q=${encodeURIComponent(q)}&type=statuses`, }, @@ -254,11 +347,11 @@ function Search({ columnMode, ...props }) { <> {type !== 'accounts' && ( <h2 class="timeline-header"> - Accounts{' '} + <Trans>Accounts</Trans>{' '} <Link to={`/search?q=${encodeURIComponent(q)}&type=accounts`} > - <Icon icon="arrow-right" size="l" /> + <Icon icon="arrow-right" size="l" alt={t`See more`} /> </Link> </h2> )} @@ -284,7 +377,8 @@ function Search({ columnMode, ...props }) { q, )}&type=accounts`} > - See more accounts <Icon icon="arrow-right" /> + <Trans>See more accounts</Trans>{' '} + <Icon icon="arrow-right" /> </Link> </div> )} @@ -296,7 +390,9 @@ function Search({ columnMode, ...props }) { <Loader abrupt /> </p> ) : ( - <p class="ui-state">No accounts found.</p> + <p class="ui-state"> + <Trans>No accounts found.</Trans> + </p> )) )} </> @@ -305,11 +401,11 @@ function Search({ columnMode, ...props }) { <> {type !== 'hashtags' && ( <h2 class="timeline-header"> - Hashtags{' '} + <Trans>Hashtags</Trans>{' '} <Link to={`/search?q=${encodeURIComponent(q)}&type=hashtags`} > - <Icon icon="arrow-right" size="l" /> + <Icon icon="arrow-right" size="l" alt={t`See more`} /> </Link> </h2> )} @@ -331,7 +427,7 @@ function Search({ columnMode, ...props }) { : `/t/${name}` } > - <Icon icon="hashtag" /> + <Icon icon="hashtag" alt="#" /> <span>{name}</span> {!!total && ( <span class="count"> @@ -351,7 +447,8 @@ function Search({ columnMode, ...props }) { q, )}&type=hashtags`} > - See more hashtags <Icon icon="arrow-right" /> + <Trans>See more hashtags</Trans>{' '} + <Icon icon="arrow-right" /> </Link> </div> )} @@ -363,7 +460,9 @@ function Search({ columnMode, ...props }) { <Loader abrupt /> </p> ) : ( - <p class="ui-state">No hashtags found.</p> + <p class="ui-state"> + <Trans>No hashtags found.</Trans> + </p> )) )} </> @@ -372,11 +471,11 @@ function Search({ columnMode, ...props }) { <> {type !== 'statuses' && ( <h2 class="timeline-header"> - Posts{' '} + <Trans>Posts</Trans>{' '} <Link to={`/search?q=${encodeURIComponent(q)}&type=statuses`} > - <Icon icon="arrow-right" size="l" /> + <Icon icon="arrow-right" size="l" alt={t`See more`} /> </Link> </h2> )} @@ -406,7 +505,8 @@ function Search({ columnMode, ...props }) { q, )}&type=statuses`} > - See more posts <Icon icon="arrow-right" /> + <Trans>See more posts</Trans>{' '} + <Icon icon="arrow-right" /> </Link> </div> )} @@ -418,7 +518,9 @@ function Search({ columnMode, ...props }) { <Loader abrupt /> </p> ) : ( - <p class="ui-state">No posts found.</p> + <p class="ui-state"> + <Trans>No posts found.</Trans> + </p> )) )} </> @@ -439,11 +541,13 @@ function Search({ columnMode, ...props }) { onClick={() => loadResults()} style={{ marginBlockEnd: '6em' }} > - Show more… + <Trans>Show more…</Trans> </button> </InView> ) : ( - <p class="ui-state insignificant">The end.</p> + <p class="ui-state insignificant"> + <Trans>The end.</Trans> + </p> ) ) : ( uiState === 'loading' && ( @@ -459,7 +563,9 @@ function Search({ columnMode, ...props }) { </p> ) : ( <p class="ui-state"> - Enter your search term or paste a URL above to get started. + <Trans> + Enter your search term or paste a URL above to get started. + </Trans> </p> )} </main> diff --git a/src/pages/settings.css b/src/pages/settings.css index 1c1481d5..7570d4cd 100644 --- a/src/pages/settings.css +++ b/src/pages/settings.css @@ -1,5 +1,7 @@ #settings-container { background-color: var(--bg-faded-color); + /* Prevent immediate text size change affecting max width */ + max-width: calc(40 * var(--current-text-size) - 50px - 16px); } #settings-container main h3 { @@ -34,14 +36,20 @@ align-items: center; flex-wrap: wrap; border-bottom: var(--hairline-width) solid var(--outline-color); + gap: 4px; + + &.block { + flex-direction: column; + align-items: flex-start; + } } #settings-container section > ul > li > div:last-child { - text-align: right; + text-align: end; } #settings-container section > ul > li .sub-section { - text-align: left !important; + text-align: start !important; margin-top: 8px; - margin-left: 24px; + margin-inline-start: 24px; } #settings-container section > ul > li .sub-section p { margin-block: 0.5em; @@ -121,11 +129,11 @@ grid-template-rows: 1fr 1fr; > span:first-child { - text-align: left; + text-align: start; } > span:last-child { - text-align: right; + text-align: end; } } } @@ -143,14 +151,14 @@ background-color: var(--bg-faded-color); border-radius: 8px; margin: 8px 0; - max-height: 6.5em; + max-height: 10em; overflow: auto; display: flex; flex-wrap: wrap; font-size: 90%; } #settings-container .checkbox-fieldset label { - flex: 1 0 10em; + flex: 1 0 12em; padding: 4px; display: flex; gap: 4px; diff --git a/src/pages/settings.jsx b/src/pages/settings.jsx index 14d961c3..8f847ba4 100644 --- a/src/pages/settings.jsx +++ b/src/pages/settings.jsx @@ -1,17 +1,20 @@ import './settings.css'; +import { Plural, t, Trans } from '@lingui/macro'; import { useEffect, useRef, useState } from 'preact/hooks'; import { useSnapshot } from 'valtio'; import logo from '../assets/logo.svg'; import Icon from '../components/icon'; +import LangSelector from '../components/lang-selector'; import Link from '../components/link'; import RelativeTime from '../components/relative-time'; import targetLanguages from '../data/lingva-target-languages'; import { api } from '../utils/api'; import getTranslateTargetLanguage from '../utils/get-translate-target-language'; import localeCode2Text from '../utils/localeCode2Text'; +import prettyBytes from '../utils/pretty-bytes'; import { initSubscription, isPushSupported, @@ -21,6 +24,7 @@ import { import showToast from '../utils/show-toast'; import states from '../utils/states'; import store from '../utils/store'; +import supports from '../utils/supports'; const DEFAULT_TEXT_SIZE = 16; const TEXT_SIZES = [14, 15, 16, 17, 18, 19, 20]; @@ -28,6 +32,7 @@ const { PHANPY_WEBSITE: WEBSITE, PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL, PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL, + PHANPY_GIPHY_API_KEY: GIPHY_API_KEY, } = import.meta.env; function Settings({ onClose }) { @@ -59,21 +64,32 @@ function Settings({ onClose }) { // }, []); return ( - <div id="settings-container" class="sheet" tabIndex="-1"> + <div + id="settings-container" + class="sheet" + tabIndex="-1" + style={{ + '--current-text-size': `${currentTextSize}px`, + }} + > {!!onClose && ( <button type="button" class="sheet-close" onClick={onClose}> - <Icon icon="x" /> + <Icon icon="x" alt={t`Close`} /> </button> )} <header> - <h2>Settings</h2> + <h2> + <Trans>Settings</Trans> + </h2> </header> <main> <section> <ul> <li> <div> - <label>Appearance</label> + <label> + <Trans>Appearance</Trans> + </label> </div> <div> <form @@ -147,7 +163,9 @@ function Settings({ onClose }) { value="light" defaultChecked={currentTheme === 'light'} /> - <span>Light</span> + <span> + <Trans>Light</Trans> + </span> </label> <label> <input @@ -156,7 +174,9 @@ function Settings({ onClose }) { value="dark" defaultChecked={currentTheme === 'dark'} /> - <span>Dark</span> + <span> + <Trans>Dark</Trans> + </span> </label> <label> <input @@ -167,7 +187,9 @@ function Settings({ onClose }) { currentTheme !== 'light' && currentTheme !== 'dark' } /> - <span>Auto</span> + <span> + <Trans>Auto</Trans> + </span> </label> </div> </form> @@ -175,10 +197,16 @@ function Settings({ onClose }) { </li> <li> <div> - <label>Text size</label> + <label> + <Trans>Text size</Trans> + </label> </div> <div class="range-group"> - <span style={{ fontSize: TEXT_SIZES[0] }}>A</span>{' '} + <span style={{ fontSize: TEXT_SIZES[0] }}> + <Trans comment="Preview of one character, in smallest size"> + A + </Trans> + </span>{' '} <input type="range" min={TEXT_SIZES[0]} @@ -200,7 +228,9 @@ function Settings({ onClose }) { }} />{' '} <span style={{ fontSize: TEXT_SIZES[TEXT_SIZES.length - 1] }}> - A + <Trans comment="Preview of one character, in largest size"> + A + </Trans> </span> <datalist id="sizes"> {TEXT_SIZES.map((size) => ( @@ -209,18 +239,38 @@ function Settings({ onClose }) { </datalist> </div> </li> + <li> + <span> + <label> + <Trans>Display language</Trans> + </label> + <br /> + <small> + <a + href="https://crowdin.com/project/phanpy" + target="_blank" + rel="noopener noreferrer" + > + <Trans>Volunteer translations</Trans> + </a> + </small> + </span> + <LangSelector /> + </li> </ul> </section> {authenticated && ( <> - <h3>Posting</h3> + <h3> + <Trans>Posting</Trans> + </h3> <section> <ul> <li> <div> <label for="posting-privacy-field"> - Default visibility{' '} - <Icon icon="cloud" alt="Synced" class="synced-icon" /> + <Trans>Default visibility</Trans>{' '} + <Icon icon="cloud" alt={t`Synced`} class="synced-icon" /> </label> </div> <div> @@ -245,39 +295,49 @@ function Settings({ onClose }) { 'posting:default:visibility': value, }); } catch (e) { - alert('Failed to update posting privacy'); + alert(t`Failed to update posting privacy`); console.error(e); } })(); }} > - <option value="public">Public</option> - <option value="unlisted">Unlisted</option> - <option value="private">Followers only</option> + <option value="public"> + <Trans>Public</Trans> + </option> + <option value="unlisted"> + <Trans>Unlisted</Trans> + </option> + <option value="private"> + <Trans>Followers only</Trans> + </option> </select> </div> </li> </ul> </section> <p class="section-postnote"> - <Icon icon="cloud" alt="Synced" class="synced-icon" />{' '} + <Icon icon="cloud" alt={t`Synced`} class="synced-icon" />{' '} <small> - Synced to your instance server's settings.{' '} - <a - href={`https://${instance}/`} - target="_blank" - rel="noopener noreferrer" - > - Go to your instance ({instance}) for more settings. - </a> + <Trans> + Synced to your instance server's settings.{' '} + <a + href={`https://${instance}/`} + target="_blank" + rel="noopener noreferrer" + > + Go to your instance ({instance}) for more settings. + </a> + </Trans> </small> </p> </> )} - <h3>Experiments</h3> + <h3> + <Trans>Experiments</Trans> + </h3> <section> <ul> - <li> + <li class="block"> <label> <input type="checkbox" @@ -286,10 +346,10 @@ function Settings({ onClose }) { states.settings.autoRefresh = e.target.checked; }} />{' '} - Auto refresh timeline posts + <Trans>Auto refresh timeline posts</Trans> </label> </li> - <li> + <li class="block"> <label> <input type="checkbox" @@ -298,10 +358,10 @@ function Settings({ onClose }) { states.settings.boostsCarousel = e.target.checked; }} />{' '} - Boosts carousel + <Trans>Boosts carousel</Trans> </label> </li> - <li> + <li class="block"> <label> <input type="checkbox" @@ -314,7 +374,7 @@ function Settings({ onClose }) { } }} />{' '} - Post translation + <Trans>Post translation</Trans> </label> <div class={`sub-section ${ @@ -325,88 +385,117 @@ function Settings({ onClose }) { > <div> <label> - Translate to{' '} + <Trans>Translate to </Trans>{' '} <select value={targetLanguage || ''} disabled={!snapStates.settings.contentTranslation} + style={{ width: '10em' }} onChange={(e) => { states.settings.contentTranslationTargetLanguage = e.target.value || null; }} > <option value=""> - System language ({systemTargetLanguageText}) + <Trans> + System language ({systemTargetLanguageText}) + </Trans> </option> <option disabled>──────────</option> - {targetLanguages.map((lang) => ( - <option value={lang.code}>{lang.name}</option> - ))} + {targetLanguages.map((lang) => { + const common = localeCode2Text({ + code: lang.code, + fallback: lang.name, + }); + const native = localeCode2Text({ + code: lang.code, + locale: lang.code, + }); + const showCommon = common !== native; + return ( + <option value={lang.code}> + {showCommon ? `${native} - ${common}` : common} + </option> + ); + })} </select> </label> </div> <hr /> - <p class="checkbox-fieldset"> - Hide "Translate" button for - {snapStates.settings.contentTranslationHideLanguages.length > - 0 && ( - <> - {' '} - ( - { - snapStates.settings.contentTranslationHideLanguages - .length - } - ) - </> - )} - : + <div class="checkbox-fieldset"> + <Plural + value={ + snapStates.settings.contentTranslationHideLanguages.length + } + _0={`Hide "Translate" button for:`} + other={`Hide "Translate" button for (#):`} + /> <div class="checkbox-fields"> - {targetLanguages.map((lang) => ( - <label> - <input - type="checkbox" - checked={snapStates.settings.contentTranslationHideLanguages.includes( - lang.code, - )} - onChange={(e) => { - const { checked } = e.target; - if (checked) { - states.settings.contentTranslationHideLanguages.push( - lang.code, - ); - } else { - states.settings.contentTranslationHideLanguages = - snapStates.settings.contentTranslationHideLanguages.filter( - (code) => code !== lang.code, + {targetLanguages.map((lang) => { + const common = localeCode2Text({ + code: lang.code, + fallback: lang.name, + }); + const native = localeCode2Text({ + code: lang.code, + locale: lang.code, + }); + const showCommon = common !== native; + return ( + <label> + <input + type="checkbox" + checked={snapStates.settings.contentTranslationHideLanguages.includes( + lang.code, + )} + onChange={(e) => { + const { checked } = e.target; + if (checked) { + states.settings.contentTranslationHideLanguages.push( + lang.code, ); - } - }} - />{' '} - {lang.name} - </label> - ))} + } else { + states.settings.contentTranslationHideLanguages = + snapStates.settings.contentTranslationHideLanguages.filter( + (code) => code !== lang.code, + ); + } + }} + />{' '} + {showCommon ? ( + <span> + {native}{' '} + <span class="insignificant">- {common}</span> + </span> + ) : ( + common + )} + </label> + ); + })} </div> - </p> + </div> <p class="insignificant"> <small> - Note: This feature uses external translation services, - powered by{' '} - <a - href="https://github.com/cheeaun/lingva-api" - target="_blank" - rel="noopener noreferrer" - > - Lingva API - </a>{' '} - &{' '} - <a - href="https://github.com/thedaviddelta/lingva-translate" - target="_blank" - rel="noopener noreferrer" - > - Lingva Translate - </a> - . + <Trans> + Note: This feature uses external translation services, + powered by{' '} + <a + href="https://github.com/cheeaun/lingva-api" + target="_blank" + rel="noopener noreferrer" + > + Lingva API + </a>{' '} + &{' '} + <a + href="https://github.com/thedaviddelta/lingva-translate" + target="_blank" + rel="noopener noreferrer" + > + Lingva Translate + </a> + . + </Trans> </small> </p> <hr /> @@ -421,20 +510,55 @@ function Settings({ onClose }) { e.target.checked; }} />{' '} - Auto inline translation + <Trans>Auto inline translation</Trans> </label> <p class="insignificant"> <small> - Automatically show translation for posts in timeline. Only - works for <b>short</b> posts without content warning, - media and poll. + <Trans> + Automatically show translation for posts in timeline. + Only works for <b>short</b> posts without content + warning, media and poll. + </Trans> </small> </p> </div> </div> </li> + {!!GIPHY_API_KEY && authenticated && ( + <li class="block"> + <label> + <input + type="checkbox" + checked={snapStates.settings.composerGIFPicker} + onChange={(e) => { + states.settings.composerGIFPicker = e.target.checked; + }} + />{' '} + <Trans>GIF Picker for composer</Trans> + </label> + <div class="sub-section insignificant"> + <small> + <Trans> + Note: This feature uses external GIF search service, + powered by{' '} + <a + href="https://developers.giphy.com/" + target="_blank" + rel="noopener noreferrer" + > + GIPHY + </a> + . G-rated (suitable for viewing by all ages), tracking + parameters are stripped, referrer information is omitted + from requests, but search queries and IP address + information will still reach their servers. + </Trans> + </small> + </div> + </li> + )} {!!IMG_ALT_API_URL && authenticated && ( - <li> + <li class="block"> <label> <input type="checkbox" @@ -443,29 +567,58 @@ function Settings({ onClose }) { states.settings.mediaAltGenerator = e.target.checked; }} />{' '} - Image description generator{' '} + <Trans>Image description generator</Trans>{' '} <Icon icon="sparkles2" class="more-insignificant" /> </label> <div class="sub-section insignificant"> - <small>Only for new images while composing new posts.</small> + <small> + <Trans> + Only for new images while composing new posts. + </Trans> + </small> </div> <div class="sub-section insignificant"> <small> - Note: This feature uses external AI service, powered by{' '} - <a - href="https://github.com/cheeaun/img-alt-api" - target="_blank" - rel="noopener noreferrer" - > - img-alt-api - </a> - . May not work well. Only for images and in English. + <Trans> + Note: This feature uses external AI service, powered by{' '} + <a + href="https://github.com/cheeaun/img-alt-api" + target="_blank" + rel="noopener noreferrer" + > + img-alt-api + </a> + . May not work well. Only for images and in English. + </Trans> + </small> + </div> + </li> + )} + {authenticated && supports('@mastodon/grouped-notifications') && ( + <li class="block"> + <label> + <input + type="checkbox" + checked={snapStates.settings.groupedNotificationsAlpha} + onChange={(e) => { + states.settings.groupedNotificationsAlpha = + e.target.checked; + }} + />{' '} + <Trans>Server-side grouped notifications</Trans> + </label> + <div class="sub-section insignificant"> + <small> + <Trans> + Alpha-stage feature. Potentially improved grouping window + but basic grouping logic. + </Trans> </small> </div> </li> )} {authenticated && ( - <li> + <li class="block"> <label> <input type="checkbox" @@ -477,27 +630,31 @@ function Settings({ onClose }) { e.target.checked; }} />{' '} - "Cloud" import/export for shortcuts settings{' '} + <Trans>"Cloud" import/export for shortcuts settings</Trans>{' '} <Icon icon="cloud" class="more-insignificant" /> </label> <div class="sub-section insignificant"> <small> - ⚠️⚠️⚠️ Very experimental. - <br /> - Stored in your own profile’s notes. Profile (private) notes - are mainly used for other profiles, and hidden for own - profile. + <Trans> + ⚠️⚠️⚠️ Very experimental. + <br /> + Stored in your own profile’s notes. Profile (private) + notes are mainly used for other profiles, and hidden for + own profile. + </Trans> </small> </div> <div class="sub-section insignificant"> <small> - Note: This feature uses currently-logged-in instance server - API. + <Trans> + Note: This feature uses currently-logged-in instance + server API. + </Trans> </small> </div> </li> )} - <li> + <li class="block"> <label> <input type="checkbox" @@ -506,15 +663,19 @@ function Settings({ onClose }) { states.settings.cloakMode = e.target.checked; }} />{' '} - Cloak mode{' '} - <span class="insignificant"> - (<samp>Text</samp> → <samp>████</samp>) - </span> + <Trans> + Cloak mode{' '} + <span class="insignificant"> + (<samp>Text</samp> → <samp>████</samp>) + </span> + </Trans> </label> <div class="sub-section insignificant"> <small> - Replace text as blocks, useful when taking screenshots, for - privacy reasons. + <Trans> + Replace text as blocks, useful when taking screenshots, for + privacy reasons. + </Trans> </small> </div> </li> @@ -528,14 +689,16 @@ function Settings({ onClose }) { states.showSettings = false; }} > - Unsent drafts + <Trans>Unsent drafts</Trans> </button> </li> )} </ul> </section> {authenticated && <PushNotificationsSection onClose={onClose} />} - <h3>About</h3> + <h3> + <Trans>About</Trans> + </h3> <section> <div style={{ @@ -573,25 +736,27 @@ function Settings({ onClose }) { @phanpy </a> <br /> - <a - href="https://github.com/cheeaun/phanpy" - target="_blank" - rel="noopener noreferrer" - > - Built - </a>{' '} - by{' '} - <a - href="https://mastodon.social/@cheeaun" - // target="_blank" - rel="noopener noreferrer" - onClick={(e) => { - e.preventDefault(); - states.showAccount = 'cheeaun@mastodon.social'; - }} - > - @cheeaun - </a> + <Trans> + <a + href="https://github.com/cheeaun/phanpy" + target="_blank" + rel="noopener noreferrer" + > + Built + </a>{' '} + by{' '} + <a + href="https://mastodon.social/@cheeaun" + // target="_blank" + rel="noopener noreferrer" + onClick={(e) => { + e.preventDefault(); + states.showAccount = 'cheeaun@mastodon.social'; + }} + > + @cheeaun + </a> + </Trans> </div> </div> <p> @@ -600,7 +765,7 @@ function Settings({ onClose }) { target="_blank" rel="noopener noreferrer" > - Sponsor + <Trans>Sponsor</Trans> </a>{' '} ·{' '} <a @@ -608,7 +773,15 @@ function Settings({ onClose }) { target="_blank" rel="noopener noreferrer" > - Donate + <Trans>Donate</Trans> + </a>{' '} + ·{' '} + <a + href="https://patreon.com/cheeaun" + target="_blank" + rel="noopener noreferrer" + > + Patreon </a>{' '} ·{' '} <a @@ -616,60 +789,173 @@ function Settings({ onClose }) { target="_blank" rel="noopener noreferrer" > - Privacy Policy + <Trans>Privacy Policy</Trans> </a> </p> {__BUILD_TIME__ && ( <p> {WEBSITE && ( <> - <span class="insignificant">Site:</span>{' '} - {WEBSITE.replace(/https?:\/\//g, '').replace(/\/$/, '')} + <Trans> + <span class="insignificant">Site:</span>{' '} + {WEBSITE.replace(/https?:\/\//g, '').replace(/\/$/, '')} + </Trans> <br /> </> )} - <span class="insignificant">Version:</span>{' '} - <input - type="text" - class="version-string" - readOnly - size="18" // Manually calculated here - value={`${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${ - __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : '' - }`} - onClick={(e) => { - e.target.select(); - // Copy to clipboard - try { - navigator.clipboard.writeText(e.target.value); - showToast('Version string copied'); - } catch (e) { - console.warn(e); - showToast('Unable to copy version string'); - } - }} - />{' '} - {!__FAKE_COMMIT_HASH__ && ( - <span class="ib insignificant"> - ( - <a - href={`https://github.com/cheeaun/phanpy/commit/${__COMMIT_HASH__}`} - target="_blank" - rel="noopener noreferrer" - > - <RelativeTime datetime={new Date(__BUILD_TIME__)} /> - </a> - ) - </span> - )} + <Trans> + <span class="insignificant">Version:</span>{' '} + <input + type="text" + class="version-string" + readOnly + size="18" // Manually calculated here + value={`${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${ + __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : '' + }`} + onClick={(e) => { + e.target.select(); + // Copy to clipboard + try { + navigator.clipboard.writeText(e.target.value); + showToast(t`Version string copied`); + } catch (e) { + console.warn(e); + showToast(t`Unable to copy version string`); + } + }} + />{' '} + {!__FAKE_COMMIT_HASH__ && ( + <span class="ib insignificant"> + ( + <a + href={`https://github.com/cheeaun/phanpy/commit/${__COMMIT_HASH__}`} + target="_blank" + rel="noopener noreferrer" + > + <RelativeTime datetime={new Date(__BUILD_TIME__)} /> + </a> + ) + </span> + )} + </Trans> </p> )} </section> + {(import.meta.env.DEV || import.meta.env.PHANPY_DEV) && ( + <details class="debug-info"> + <summary></summary> + <p>Debugging</p> + {__BENCH_RESULTS?.size > 0 && ( + <ul> + {Array.from(__BENCH_RESULTS.entries()).map( + ([name, duration]) => ( + <li> + <b>{name}</b>: {duration}ms + </li> + ), + )} + </ul> + )} + <p>Service Worker Cache</p> + <button + type="button" + class="plain2 small" + onClick={async () => alert(await getCachesKeys())} + > + Show keys count + </button>{' '} + <button + type="button" + class="plain2 small" + onClick={async () => alert(await getCachesSize())} + > + Show cache size + </button>{' '} + <button + type="button" + class="plain2 small" + onClick={() => { + const key = prompt('Enter cache key'); + if (!key) return; + try { + clearCacheKey(key); + } catch (e) { + alert(e); + } + }} + > + Clear cache key + </button>{' '} + <button + type="button" + class="plain2 small" + onClick={() => { + try { + clearCaches(); + } catch (e) { + alert(e); + } + }} + > + Clear all caches + </button> + </details> + )} </main> </div> ); } +async function getCachesKeys() { + const keys = await caches.keys(); + const total = {}; + for (const key of keys) { + const cache = await caches.open(key); + const k = await cache.keys(); + total[key] = k.length; + } + return total; +} + +async function getCachesSize() { + const keys = await caches.keys(); + let total = {}; + let TOTAL = 0; + for (const key of keys) { + const cache = await caches.open(key); + const k = await cache.keys(); + for (const item of k) { + try { + const response = await cache.match(item); + const blob = await response.blob(); + total[key] = (total[key] || 0) + blob.size; + TOTAL += blob.size; + } catch (e) { + alert('Failed to get cache size for ' + item); + alert(e); + } + } + } + return { + ...Object.fromEntries( + Object.entries(total).map(([k, v]) => [k, prettyBytes(v)]), + ), + TOTAL: prettyBytes(TOTAL), + }; +} + +function clearCacheKey(key) { + return caches.delete(key); +} + +async function clearCaches() { + const keys = await caches.keys(); + for (const key of keys) { + await caches.delete(key); + } +} + function PushNotificationsSection({ onClose }) { if (!isPushSupported()) return null; @@ -690,9 +976,10 @@ function PushNotificationsSection({ onClose }) { ) { setAllowNotifications(true); const { alerts, policy } = backendSubscription; + console.log('backendSubscription', backendSubscription); previousPolicyRef.current = policy; const { elements } = pushFormRef.current; - const policyEl = elements.namedItem(policy); + const policyEl = elements.namedItem('policy'); if (policyEl) policyEl.value = policy; // alerts is {}, iterate it Object.keys(alerts).forEach((alert) => { @@ -721,68 +1008,73 @@ function PushNotificationsSection({ onClose }) { <form ref={pushFormRef} onChange={() => { - const values = Object.fromEntries(new FormData(pushFormRef.current)); - const allowNotifications = !!values['policy-allow']; - const params = { - policy: values.policy, - data: { - alerts: { - mention: !!values.mention, - favourite: !!values.favourite, - reblog: !!values.reblog, - follow: !!values.follow, - follow_request: !!values.followRequest, - poll: !!values.poll, - update: !!values.update, - status: !!values.status, + setTimeout(() => { + const values = Object.fromEntries(new FormData(pushFormRef.current)); + const allowNotifications = !!values['policy-allow']; + const params = { + data: { + policy: values.policy, + alerts: { + mention: !!values.mention, + favourite: !!values.favourite, + reblog: !!values.reblog, + follow: !!values.follow, + follow_request: !!values.followRequest, + poll: !!values.poll, + update: !!values.update, + status: !!values.status, + }, }, - }, - }; + }; - let alertsCount = 0; - // Remove false values from data.alerts - // API defaults to false anyway - Object.keys(params.data.alerts).forEach((key) => { - if (!params.data.alerts[key]) { - delete params.data.alerts[key]; - } else { - alertsCount++; - } - }); - const policyChanged = previousPolicyRef.current !== params.policy; + let alertsCount = 0; + // Remove false values from data.alerts + // API defaults to false anyway + Object.keys(params.data.alerts).forEach((key) => { + if (!params.data.alerts[key]) { + delete params.data.alerts[key]; + } else { + alertsCount++; + } + }); + const policyChanged = + previousPolicyRef.current !== params.data.policy; - console.log('PN Form', { - values, - allowNotifications: allowNotifications, - params, - }); + console.log('PN Form', { + values, + allowNotifications: allowNotifications, + params, + }); - if (allowNotifications && alertsCount > 0) { - if (policyChanged) { - console.debug('Policy changed.'); - removeSubscription() - .then(() => { - updateSubscription(params); - }) - .catch((err) => { + if (allowNotifications && alertsCount > 0) { + if (policyChanged) { + console.debug('Policy changed.'); + removeSubscription() + .then(() => { + updateSubscription(params); + }) + .catch((err) => { + console.warn(err); + alert(t`Failed to update subscription. Please try again.`); + }); + } else { + updateSubscription(params).catch((err) => { console.warn(err); - alert('Failed to update subscription. Please try again.'); + alert(t`Failed to update subscription. Please try again.`); }); + } } else { - updateSubscription(params).catch((err) => { + removeSubscription().catch((err) => { console.warn(err); - alert('Failed to update subscription. Please try again.'); + alert(t`Failed to remove subscription. Please try again.`); }); } - } else { - removeSubscription().catch((err) => { - console.warn(err); - alert('Failed to remove subscription. Please try again.'); - }); - } + }, 100); }} > - <h3>Push Notifications (beta)</h3> + <h3> + <Trans>Push Notifications (beta)</Trans> + </h3> <section> <ul> <li> @@ -803,7 +1095,7 @@ function PushNotificationsSection({ onClose }) { setAllowNotifications(false); if (permission === 'denied') { alert( - 'Push notifications are blocked. Please enable them in your browser settings.', + t`Push notifications are blocked. Please enable them in your browser settings.`, ); } } @@ -812,28 +1104,30 @@ function PushNotificationsSection({ onClose }) { } }} />{' '} - Allow from{' '} - <select - name="policy" - disabled={isLoading || needRelogin || !allowNotifications} - > - {[ - { - value: 'all', - label: 'anyone', - }, - { - value: 'followed', - label: 'people I follow', - }, - { - value: 'follower', - label: 'followers', - }, - ].map((type) => ( - <option value={type.value}>{type.label}</option> - ))} - </select> + <Trans> + Allow from{' '} + <select + name="policy" + disabled={isLoading || needRelogin || !allowNotifications} + > + {[ + { + value: 'all', + label: t`anyone`, + }, + { + value: 'followed', + label: t`people I follow`, + }, + { + value: 'follower', + label: t`followers`, + }, + ].map((type) => ( + <option value={type.value}>{type.label}</option> + ))} + </select> + </Trans> </label> <div class="shazam-container no-animation" @@ -848,35 +1142,35 @@ function PushNotificationsSection({ onClose }) { {[ { value: 'mention', - label: 'Mentions', + label: t`Mentions`, }, { value: 'favourite', - label: 'Likes', + label: t`Likes`, }, { value: 'reblog', - label: 'Boosts', + label: t`Boosts`, }, { value: 'follow', - label: 'Follows', + label: t`Follows`, }, { value: 'followRequest', - label: 'Follow requests', + label: t`Follow requests`, }, { value: 'poll', - label: 'Polls', + label: t`Polls`, }, { value: 'update', - label: 'Post edits', + label: t`Post edits`, }, { value: 'status', - label: 'New posts', + label: t`New posts`, }, ].map((alert) => ( <li> @@ -893,12 +1187,14 @@ function PushNotificationsSection({ onClose }) { {needRelogin && ( <div class="sub-section"> <p> - Push permission was not granted since your last login. You'll - need to{' '} - <Link to={`/login?instance=${instance}`} onClick={onClose}> - <b>log in</b> again to grant push permission - </Link> - . + <Trans> + Push permission was not granted since your last login. + You'll need to{' '} + <Link to={`/login?instance=${instance}`} onClick={onClose}> + <b>log in</b> again to grant push permission + </Link> + . + </Trans> </p> </div> )} @@ -907,7 +1203,9 @@ function PushNotificationsSection({ onClose }) { </section> <p class="section-postnote"> <small> - NOTE: Push notifications only work for <b>one account</b>. + <Trans> + NOTE: Push notifications only work for <b>one account</b>. + </Trans> </small> </p> </form> diff --git a/src/pages/status.css b/src/pages/status.css index b971c76e..8380ca96 100644 --- a/src/pages/status.css +++ b/src/pages/status.css @@ -11,7 +11,7 @@ align-self: stretch; } header h1 .deck-back { - margin-left: -16px; + margin-inline-start: -16px; } .button-refresh .icon { @@ -23,12 +23,6 @@ } } -@keyframes spin { - to { - transform: rotate(360deg); - } -} - .hero-heading { font-size: var(--text-size); display: inline-block; @@ -45,7 +39,7 @@ font-size: 70% !important; & > .avatar ~ .avatar { - margin-left: -4px; + margin-inline-start: -4px; } } .ancestors-indicator:not([hidden]) { diff --git a/src/pages/status.jsx b/src/pages/status.jsx index fe638371..311a3439 100644 --- a/src/pages/status.jsx +++ b/src/pages/status.jsx @@ -1,5 +1,6 @@ import './status.css'; +import { Plural, t, Trans } from '@lingui/macro'; import { Menu, MenuDivider, MenuHeader, MenuItem } from '@szhsin/react-menu'; import debounce from 'just-debounce-it'; import pRetry from 'p-retry'; @@ -12,10 +13,10 @@ import { useRef, useState, } from 'preact/hooks'; +import punycode from 'punycode/'; import { useHotkeys } from 'react-hotkeys-hook'; import { InView } from 'react-intersection-observer'; import { matchPath, useSearchParams } from 'react-router-dom'; -import { useDebouncedCallback } from 'use-debounce'; import { useSnapshot } from 'valtio'; import Avatar from '../components/avatar'; @@ -43,6 +44,8 @@ import useTitle from '../utils/useTitle'; import getInstanceStatusURL from './../utils/get-instance-status-url'; +const { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env; + const LIMIT = 40; const SUBCOMMENTS_OPEN_ALL_LIMIT = 10; const MAX_WEIGHT = 5; @@ -122,7 +125,7 @@ function StatusPage(params) { }, [showMedia]); const mediaAttachments = mediaStatusID - ? mediaStatus?.mediaAttachments + ? snapStates.statuses[statusKey(mediaStatusID, instance)]?.mediaAttachments : heroStatus?.mediaAttachments; const handleMediaClose = useCallback(() => { @@ -153,6 +156,18 @@ function StatusPage(params) { return () => clearTimeout(timer); }, [showMediaOnly]); + useEffect(() => { + const $deckContainers = document.querySelectorAll('.deck-container'); + $deckContainers.forEach(($deckContainer) => { + $deckContainer.setAttribute('inert', ''); + }); + return () => { + $deckContainers.forEach(($deckContainer) => { + $deckContainer.removeAttribute('inert'); + }); + }; + }, []); + return ( <div class="deck-backdrop"> {showMedia ? ( @@ -193,6 +208,11 @@ function StatusParent(props) { ); } +// oldest first +function createdAtSort(a, b) { + return new Date(b.created_at) - new Date(a.created_at); +} + function StatusThread({ id, closeLink = '/', instance: propInstance }) { const [searchParams, setSearchParams] = useSearchParams(); const mediaParam = searchParams.get('media'); @@ -306,6 +326,9 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { const context = await contextFetch; const { ancestors, descendants } = context; + ancestors.sort(createdAtSort); + descendants.sort(createdAtSort); + totalDescendants.current = descendants?.length || 0; const missingStatuses = new Set(); @@ -345,7 +368,11 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { nestedDescendants.push(status); } else if ( !status.inReplyToAccountId && - nestedDescendants.find((s) => s.id === status.inReplyToId) && + nestedDescendants.find( + (s) => + s.id === status.inReplyToId && + s.account.id === heroStatus.account.id, + ) && status.account.id === heroStatus.account.id ) { // If replying to hero's own statuses, it's part of the thread, level 1 @@ -365,19 +392,35 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { } }); + // sort hero author to top + nestedDescendants.sort((a, b) => { + const heroAccountID = heroStatus.account.id; + if (a.account.id === heroAccountID && b.account.id !== heroAccountID) + return -1; + if (b.account.id === heroAccountID && a.account.id !== heroAccountID) + return 1; + return 0; + }); + console.log({ ancestors, descendants, nestedDescendants }); if (missingStatuses.size) { console.error('Missing statuses', [...missingStatuses]); } - function expandReplies(_replies) { + let descendantLevelsCount = 1; + function expandReplies(_replies, level) { + const nextLevel = level + 1; + if (nextLevel > descendantLevelsCount) { + descendantLevelsCount = level; + } return _replies?.map((_r) => ({ id: _r.id, account: _r.account, repliesCount: _r.repliesCount, content: _r.content, weight: calcStatusWeight(_r), - replies: expandReplies(_r.__replies), + level: nextLevel, + replies: expandReplies(_r.__replies, nextLevel), })); } @@ -403,7 +446,8 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { descendant: true, thread: s.account.id === heroStatus.account.id, weight: calcStatusWeight(s), - replies: expandReplies(s.__replies), + level: 1, + replies: expandReplies(s.__replies, 1), })), ]; @@ -414,12 +458,13 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { }; // Set limit to hero's index - const heroLimit = allStatuses.findIndex((s) => s.id === id); + // const heroLimit = allStatuses.findIndex((s) => s.id === id); + const heroLimit = ancestors.length || 0; // 0-indexed if (heroLimit >= limit) { setLimit(heroLimit + 1); } - console.log({ allStatuses }); + console.log({ allStatuses, descendantLevelsCount }); setStatuses(allStatuses); cachedStatusesMap[id] = allStatuses; @@ -549,7 +594,10 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { useTitle( heroDisplayName && heroContentText ? `${heroDisplayName}: "${heroContentText}"` - : 'Status', + : t({ + id: 'post.title', + message: 'Post', + }), '/:instance?/s/:id', ); @@ -557,7 +605,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { if (!heroStatus) return; const { url } = heroStatus; if (!url) return; - return new URL(url).hostname; + return URL.parse(url).hostname; }, [heroStatus]); const postSameInstance = useMemo(() => { if (!postInstance) return; @@ -732,6 +780,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { replies, repliesCount, weight, + level, } = status; const isHero = statusID === id; const isLinkable = isThread || ancestor; @@ -770,19 +819,30 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { {uiState !== 'loading' && !authenticated ? ( <div class="post-status-banner"> <p> - You're not logged in. Interactions (reply, boost, etc) are - not possible. + <Trans> + You're not logged in. Interactions (reply, boost, etc) are + not possible. + </Trans> </p> - <Link to="/login" class="button"> - Log in + <Link + to={ + DEFAULT_INSTANCE + ? `/login?instance=${DEFAULT_INSTANCE}&submit=1` + : '/login' + } + class="button" + > + <Trans>Log in</Trans> </Link> </div> ) : ( !sameInstance && ( <div class="post-status-banner"> <p> - This post is from another instance (<b>{instance}</b>). - Interactions (reply, boost, etc) are not possible. + <Trans> + This post is from another instance (<b>{instance}</b>). + Interactions (reply, boost, etc) are not possible. + </Trans> </p> <button type="button" @@ -807,14 +867,16 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { } } catch (e) { setUIState('default'); - alert('Error: ' + e); + alert(t`Error: ${e}`); console.error(e); } })(); }} > - <Icon icon="transfer" /> Switch to my instance to enable - interactions + <Icon icon="transfer" />{' '} + <Trans> + Switch to my instance to enable interactions + </Trans> </button> </div> ) @@ -870,7 +932,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { )} {ancestor && repliesCount > 1 && ( <div class="replies-link"> - <Icon icon="comment2" />{' '} + <Icon icon="comment2" alt={t`Replies`} />{' '} <span title={repliesCount}> {shortenNumber(repliesCount)} </span> @@ -892,7 +954,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { instance={instance} replies={replies} hasParentThread={thread} - level={1} + level={level} accWeight={weight} openAll={totalDescendants.current < SUBCOMMENTS_OPEN_ALL_LIMIT} parentLink={{ @@ -914,7 +976,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { !!heroStatus?.repliesCount && !hasDescendants && ( <div class="status-error"> - Unable to load replies. + <Trans>Unable to load replies.</Trans> <br /> <button type="button" @@ -923,7 +985,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { states.reloadStatusPage++; }} > - Try again + <Trans>Try again</Trans> </button> </div> )} @@ -972,6 +1034,18 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { [statuses, limit, renderStatus], ); + // If there's spoiler in hero status, auto-expand it + useEffect(() => { + let timer = setTimeout(() => { + if (!heroStatusRef.current) return; + const spoilerButton = heroStatusRef.current.querySelector( + '.spoiler-button:not(.spoiling), .spoiler-media-button:not(.spoiling)', + ); + if (spoilerButton) spoilerButton.click(); + }, 1000); + return () => clearTimeout(timer); + }, [id]); + return ( <div tabIndex="-1" @@ -1014,7 +1088,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { history.back(); }} > - <Icon icon="chevron-left" size="xl" /> + <Icon icon="chevron-left" size="xl" alt={t`Back`} /> </button> )} {!heroInView && heroStatus && uiState !== 'loading' ? ( @@ -1045,7 +1119,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { block: 'start', }); }} - title="Go to main post" + title={t`Go to main post`} > <Icon icon={heroPointer === 'down' ? 'arrow-down' : 'arrow-up'} @@ -1054,7 +1128,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { </> ) : ( <> - Post{' '} + <Trans id="post.title">Post</Trans>{' '} <button type="button" class="ancestors-indicator light small" @@ -1068,7 +1142,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { }); }} hidden={!ancestors.length || reachTopPost} - title={`${ancestors.length} posts above ‒ Go to top`} + title={t`${ancestors.length} posts above ‒ Go to top`} > <Icon icon="arrow-up" /> {ancestors @@ -1111,7 +1185,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { searchParams.delete('view'); setSearchParams(searchParams); }} - title="Switch to Side Peek view" + title={t`Switch to Side Peek view`} > <Icon icon="layout4" size="l" /> </button> @@ -1124,7 +1198,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { setShowRefresh(false); }} > - <Icon icon="refresh" size="l" /> + <Icon icon="refresh" size="l" alt={t`Refresh`} /> </button> )} <Menu2 @@ -1135,7 +1209,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { }} menuButton={ <button type="button" class="button plain4"> - <Icon icon="more" alt="Actions" size="xl" /> + <Icon icon="more" alt={t`More`} size="xl" /> </button> } > @@ -1146,7 +1220,9 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { }} > <Icon icon="refresh" /> - <span>Refresh</span> + <span> + <Trans>Refresh</Trans> + </span> </MenuItem> <MenuItem className="menu-switch-view" @@ -1171,7 +1247,9 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { } /> <span> - Switch to {viewMode === 'full' ? 'Side Peek' : 'Full'} view + {viewMode === 'full' + ? t`Switch to Side Peek view` + : t`Switch to Full view`} </span> </MenuItem> <MenuItem @@ -1187,10 +1265,15 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { }); }} > - <Icon icon="eye-open" /> <span>Show all sensitive content</span> + <Icon icon="eye-open" />{' '} + <span> + <Trans>Show all sensitive content</Trans> + </span> </MenuItem> <MenuDivider /> - <MenuHeader className="plain">Experimental</MenuHeader> + <MenuHeader className="plain"> + <Trans>Experimental</Trans> + </MenuHeader> <MenuItem disabled={!postInstance || postSameInstance} onClick={() => { @@ -1198,26 +1281,22 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { if (statusURL) { location.hash = statusURL; } else { - alert('Unable to switch'); + alert(t`Unable to switch`); } }} > <Icon icon="transfer" /> <small class="menu-double-lines"> - Switch to post's instance - {postInstance ? ( - <> - {' '} - (<b>{postInstance}</b>) - </> - ) : ( - '' - )} + {postInstance + ? t`Switch to post's instance (${punycode.toUnicode( + postInstance, + )})` + : t`Switch to post's instance`} </small> </MenuItem> </Menu2> <Link class="button plain deck-close" to={closeLink}> - <Icon icon="x" size="xl" /> + <Icon icon="x" size="xl" alt={t`Close`} /> </Link> </div> </div> @@ -1230,7 +1309,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { > {statusesList} {showMore > 0 && ( - <li> + <li class="descendant descendant-more"> <button type="button" class="plain block show-more" @@ -1250,7 +1329,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { ))} </div>{' '} <div class="ib"> - Show more…{' '} + <Trans>Show more…</Trans>{' '} <span class="tag"> {showMore > LIMIT ? `${LIMIT}+` : showMore} </span> @@ -1270,7 +1349,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { )} {uiState === 'error' && ( <p class="ui-state"> - Unable to load post + <Trans>Unable to load post</Trans> <br /> <br /> <button @@ -1279,7 +1358,7 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { states.reloadStatusPage++; }} > - Try again + <Trans>Try again</Trans> </button> </p> )} @@ -1346,6 +1425,8 @@ function SubComments({ const detailsRef = useRef(); useLayoutEffect(() => { function handleScroll(e) { + // NOTE: this scrollLeft works for RTL too + // Browsers do the magic for us e.target.dataset.scrollLeft = e.target.scrollLeft; } detailsRef.current?.addEventListener('scroll', handleScroll, { @@ -1356,114 +1437,151 @@ function SubComments({ }; }, []); + // If not open, delay render replies + const [renderReplies, setRenderReplies] = useState(openBefore || open); + useEffect(() => { + let timer; + if (!openBefore && !open) { + timer = setTimeout(() => setRenderReplies(true), 100); + } + return () => clearTimeout(timer); + }, [openBefore, open]); + + const Container = open ? 'div' : 'details'; + const isDetails = Container === 'details'; + return ( - <details + <Container ref={detailsRef} class="replies" - open={openBefore || open} - onToggle={(e) => { - const { open } = e.target; - // use first reply as ID - cachedRepliesToggle[replies[0].id] = open; - }} + open={isDetails ? openBefore || open : undefined} + onToggle={ + isDetails + ? (e) => { + const { open } = e.target; + // use first reply as ID + cachedRepliesToggle[replies[0].id] = open; + } + : undefined + } style={{ '--comments-level': level, }} data-comments-level={level} data-comments-level-overflow={level > 4} > - <summary class="replies-summary" hidden={open}> - <span class="avatars"> - {accounts.map((a) => ( - <Avatar - key={a.id} - url={a.avatarStatic} - title={`${a.displayName} @${a.username}`} - squircle={a?.bot} - /> - ))} - </span> - <span class="replies-counts"> - <b> - <span title={replies.length}>{shortenNumber(replies.length)}</span>{' '} - repl - {replies.length === 1 ? 'y' : 'ies'} - </b> - {!sameCount && totalComments > 1 && ( - <> - {' '} - ·{' '} - <span> - <span title={totalComments}> - {shortenNumber(totalComments)} - </span>{' '} - comment - {totalComments === 1 ? '' : 's'} - </span> - </> + {!open && ( + <summary class="replies-summary" hidden={open}> + <span class="avatars"> + {accounts.map((a) => ( + <Avatar + key={a.id} + url={a.avatarStatic} + title={`${a.displayName} @${a.username}`} + squircle={a?.bot} + /> + ))} + </span> + <span class="replies-counts"> + <b> + <Plural + value={replies.length} + one="# reply" + other={ + <Trans> + <span title={replies.length}> + {shortenNumber(replies.length)} + </span>{' '} + replies + </Trans> + } + /> + </b> + {!sameCount && totalComments > 1 && ( + <> + {' '} + ·{' '} + <span> + <Plural + value={totalComments} + one="# comment" + other={ + <Trans> + <span title={totalComments}> + {shortenNumber(totalComments)} + </span>{' '} + comments + </Trans> + } + /> + </span> + </> + )} + </span> + <Icon icon="chevron-down" class="replies-summary-chevron" /> + {!!parentLink && ( + <Link + class="replies-parent-link" + to={parentLink.to} + onClick={parentLink.onClick} + title={t`View post with its replies`} + > + » + </Link> )} - </span> - <Icon icon="chevron-down" class="replies-summary-chevron" /> - {!!parentLink && ( - <Link - class="replies-parent-link" - to={parentLink.to} - onClick={parentLink.onClick} - title="View post with its replies" - > - » - </Link> - )} - </summary> - <ul> - {replies.map((r) => ( - <li key={r.id}> - {/* <Link + </summary> + )} + {renderReplies && ( + <ul> + {replies.map((r) => ( + <li key={r.id}> + {/* <Link class="status-link" to={instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`} onClick={() => { resetScrollPosition(r.id); }} > */} - <div class="status-focus" tabIndex={0}> - <Status - statusID={r.id} - instance={instance} - withinContext - size="s" - enableTranslate - onMediaClick={handleMediaClick} - showActionsBar - /> - {!r.replies?.length && r.repliesCount > 0 && ( - <div class="replies-link"> - <Icon icon="comment2" />{' '} - <span title={r.repliesCount}> - {shortenNumber(r.repliesCount)} - </span> - </div> + <div class="status-focus" tabIndex={0}> + <Status + statusID={r.id} + instance={instance} + withinContext + size="s" + enableTranslate + onMediaClick={handleMediaClick} + showActionsBar + /> + {!r.replies?.length && r.repliesCount > 0 && ( + <div class="replies-link"> + <Icon icon="comment2" alt={t`Replies`} />{' '} + <span title={r.repliesCount}> + {shortenNumber(r.repliesCount)} + </span> + </div> + )} + </div> + {/* </Link> */} + {r.replies?.length && ( + <SubComments + instance={instance} + replies={r.replies} + level={r.level} + accWeight={!open ? r.weight : totalWeight} + openAll={openAll} + parentLink={{ + to: instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`, + onClick: () => { + resetScrollPosition(r.id); + }, + }} + /> )} - </div> - {/* </Link> */} - {r.replies?.length && ( - <SubComments - instance={instance} - replies={r.replies} - level={level + 1} - accWeight={!open ? r.weight : totalWeight} - openAll={openAll} - parentLink={{ - to: instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`, - onClick: () => { - resetScrollPosition(r.id); - }, - }} - /> - )} - </li> - ))} - </ul> - </details> + </li> + ))} + </ul> + )} + </Container> ); } diff --git a/src/pages/trending.css b/src/pages/trending.css new file mode 100644 index 00000000..45ec7ee4 --- /dev/null +++ b/src/pages/trending.css @@ -0,0 +1,55 @@ +#trending-page { + .timeline-header-block { + display: flex; + gap: 12px; + align-items: center; + padding: 16px; + + &.blended { + background-image: linear-gradient( + to bottom, + var(--bg-faded-color), + transparent + ); + } + + @media (min-width: 40em) { + padding: 0 16px; + } + + &.loading { + color: var(--text-insignificant-color); + } + + p { + margin: 0; + padding: 0; + flex-grow: 1; + min-width: 0; + } + + .link-text { + color: var(--text-insignificant-color); + display: block; + font-weight: normal; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 0.9em; + } + } + + .timeline { + transition: opacity 0.3s ease-in-out; + } + .timeline.loading { + pointer-events: none; + opacity: 0.2; + } + + .timeline-link-mentions { + .status .card { + display: none; + } + } +} diff --git a/src/pages/trending.jsx b/src/pages/trending.jsx index c107cc57..09231fc6 100644 --- a/src/pages/trending.jsx +++ b/src/pages/trending.jsx @@ -1,14 +1,19 @@ import '../components/links-bar.css'; +import './trending.css'; +import { t, Trans } from '@lingui/macro'; import { MenuItem } from '@szhsin/react-menu'; import { getBlurHashAverageColor } from 'fast-blurhash'; -import { useMemo, useRef, useState } from 'preact/hooks'; +import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; +import punycode from 'punycode/'; import { useNavigate, useParams } from 'react-router-dom'; import { useSnapshot } from 'valtio'; import Icon from '../components/icon'; import Link from '../components/link'; +import Loader from '../components/loader'; import Menu2 from '../components/menu2'; +import NameText from '../components/name-text'; import RelativeTime from '../components/relative-time'; import Timeline from '../components/timeline'; import { api } from '../utils/api'; @@ -16,22 +21,46 @@ import { oklab2rgb, rgb2oklab } from '../utils/color-utils'; import { filteredItems } from '../utils/filters'; import pmem from '../utils/pmem'; import shortenNumber from '../utils/shorten-number'; -import states from '../utils/states'; -import { saveStatus } from '../utils/states'; +import states, { saveStatus } from '../utils/states'; +import supports from '../utils/supports'; import useTitle from '../utils/useTitle'; const LIMIT = 20; +const TREND_CACHE_TIME = 10 * 60 * 1000; // 10 minutes const fetchLinks = pmem( (masto) => { return masto.v1.trends.links.list().next(); }, { - // News last much longer - maxAge: 10 * 60 * 1000, // 10 minutes + maxAge: TREND_CACHE_TIME, }, ); +const fetchHashtags = pmem( + (masto) => { + return masto.v1.trends.tags.list().next(); + }, + { + maxAge: TREND_CACHE_TIME, + }, +); + +function fetchTrendsStatuses(masto) { + if (supports('@pixelfed/trending')) { + return masto.pixelfed.v2.discover.posts.trending.list({ + range: 'daily', + }); + } + return masto.v1.trends.statuses.list({ + limit: LIMIT, + }); +} + +function fetchLinkList(masto, params) { + return masto.v1.timelines.link.list(params); +} + function Trending({ columnMode, ...props }) { const snapStates = useSnapshot(states); const params = columnMode ? {} : useParams(); @@ -39,44 +68,50 @@ function Trending({ columnMode, ...props }) { instance: props?.instance || params.instance, }); const { masto: currentMasto, instance: currentInstance } = api(); - const title = `Trending (${instance})`; + const title = t`Trending (${instance})`; useTitle(title, `/:instance?/trending`); // const navigate = useNavigate(); const latestItem = useRef(); + const sameCurrentInstance = instance === currentInstance; + const [hashtags, setHashtags] = useState([]); const [links, setLinks] = useState([]); const trendIterator = useRef(); - async function fetchTrend(firstLoad) { + + async function fetchTrends(firstLoad) { + console.log('fetchTrend', firstLoad); if (firstLoad || !trendIterator.current) { - trendIterator.current = masto.v1.trends.statuses.list({ - limit: LIMIT, - }); + trendIterator.current = fetchTrendsStatuses(masto); // Get hashtags - try { - const iterator = masto.v1.trends.tags.list(); - const { value: tags } = await iterator.next(); - console.log('tags', tags); - if (tags?.length) { - setHashtags(tags); + if (supports('@mastodon/trending-hashtags')) { + try { + // const iterator = masto.v1.trends.tags.list(); + const { value: tags } = await fetchHashtags(masto); + console.log('tags', tags); + if (tags?.length) { + setHashtags(tags); + } + } catch (e) { + console.error(e); } - } catch (e) { - console.error(e); } // Get links - try { - const { value } = await fetchLinks(masto, instance); - // 4 types available: link, photo, video, rich - // Only want links for now - const links = value?.filter?.((link) => link.type === 'link'); - console.log('links', links); - if (links?.length) { - setLinks(links); + if (supports('@mastodon/trending-links')) { + try { + const { value } = await fetchLinks(masto, instance); + // 4 types available: link, photo, video, rich + // Only want links for now + const links = value?.filter?.((link) => link.type === 'link'); + console.log('links', links); + if (links?.length) { + setLinks(links); + } + } catch (e) { + console.error(e); } - } catch (e) { - console.error(e); } } const results = await trendIterator.current.next(); @@ -97,6 +132,53 @@ function Trending({ columnMode, ...props }) { }; } + // Link mentions + // https://github.com/mastodon/mastodon/pull/30381 + const [currentLinkMentionsLoading, setCurrentLinkMentionsLoading] = + useState(false); + const currentLinkMentionsIterator = useRef(); + const [currentLink, setCurrentLink] = useState(null); + const hasCurrentLink = !!currentLink; + const currentLinkRef = useRef(); + const supportsTrendingLinkPosts = + sameCurrentInstance && supports('@mastodon/trending-link-posts'); + + useEffect(() => { + if (currentLink && currentLinkRef.current) { + currentLinkRef.current.scrollIntoView({ + behavior: 'smooth', + block: 'nearest', + inline: 'center', + }); + } + }, [currentLink]); + + const prevCurrentLink = useRef(); + async function fetchLinkMentions(firstLoad) { + if (firstLoad || !currentLinkMentionsIterator.current) { + setCurrentLinkMentionsLoading(true); + currentLinkMentionsIterator.current = fetchLinkList(masto, { + url: currentLink, + }); + } + prevCurrentLink.current = currentLink; + const results = await currentLinkMentionsIterator.current.next(); + let { value } = results; + if (value?.length) { + value = filteredItems(value, 'public'); + value.forEach((item) => { + saveStatus(item, instance); + }); + } + if (prevCurrentLink.current === currentLink) { + setCurrentLinkMentionsLoading(false); + } + return { + ...results, + value, + }; + } + async function checkForUpdates() { try { const results = await masto.v1.trends.statuses @@ -129,7 +211,7 @@ function Trending({ columnMode, ...props }) { const total = history.reduce((acc, cur) => acc + +cur.uses, 0); return ( <Link to={`/${instance}/t/${name}`} key={name}> - <span> + <span dir="auto"> <span class="more-insignificant">#</span> {name} </span> @@ -142,10 +224,13 @@ function Trending({ columnMode, ...props }) { {!!links.length && ( <div class="links-bar"> <header> - <h3>Trending News</h3> + <h3> + <Trans>Trending News</Trans> + </h3> </header> {links.map((link) => { const { + authors, authorName, authorUrl, blurhash, @@ -161,9 +246,16 @@ function Trending({ columnMode, ...props }) { url, width, } = link; - const domain = new URL(url).hostname - .replace(/^www\./, '') - .replace(/\/$/, ''); + const author = authors?.[0]?.account?.id + ? authors[0].account + : null; + const isShortTitle = title.length < 30; + const hasAuthor = !!(authorName || author); + const domain = punycode.toUnicode( + URL.parse(url) + .hostname.replace(/^www\./, '') + .replace(/\/$/, ''), + ); let accentColor; if (blurhash) { const averageColor = getBlurHashAverageColor(blurhash); @@ -176,67 +268,168 @@ function Trending({ columnMode, ...props }) { } return ( - <a - key={url} - href={url} - target="_blank" - rel="noopener noreferrer" - style={ - accentColor - ? { - '--accent-color': `rgb(${accentColor.join(',')})`, - '--accent-alpha-color': `rgba(${accentColor.join( - ',', - )}, 0.4)`, - } - : {} - } - > - <article> - <figure> - <img - src={image} - alt={imageDescription} - width={width} - height={height} - loading="lazy" - /> - </figure> - <div class="article-body"> - <header> - <div class="article-meta"> - <span class="domain">{domain}</span>{' '} - {!!publishedAt && <>· </>} - {!!publishedAt && ( - <> - <RelativeTime - datetime={publishedAt} - format="micro" - /> - </> + <div key={url}> + <a + ref={currentLink === url ? currentLinkRef : null} + href={url} + target="_blank" + rel="noopener noreferrer" + class={`link-block ${ + hasCurrentLink + ? currentLink === url + ? 'active' + : 'inactive' + : '' + }`} + style={ + accentColor + ? { + '--accent-color': `rgb(${accentColor.join(',')})`, + '--accent-alpha-color': `rgba(${accentColor.join( + ',', + )}, 0.4)`, + } + : {} + } + > + <article> + <figure> + <img + src={image} + alt={imageDescription} + width={width} + height={height} + loading="lazy" + /> + </figure> + <div class="article-body"> + <header> + <div class="article-meta"> + <span class="domain">{domain}</span>{' '} + {!!publishedAt && <>· </>} + {!!publishedAt && ( + <> + <RelativeTime + datetime={publishedAt} + format="micro" + /> + </> + )} + </div> + {!!title && ( + <h1 + class="title" + lang={language} + dir="auto" + title={title} + > + {title} + </h1> )} - </div> - {!!title && ( - <h1 class="title" lang={language} dir="auto"> - {title} - </h1> + </header> + {!!description && ( + <p + class={`description ${ + hasAuthor && !isShortTitle ? '' : 'more-lines' + }`} + lang={language} + dir="auto" + title={description} + > + {description} + </p> )} - </header> - {!!description && ( - <p class="description" lang={language} dir="auto"> - {description} - </p> - )} - </div> - </article> - </a> + {hasAuthor && ( + <> + <hr /> + <p class="byline"> + <small> + <Trans comment="By [Author]"> + By{' '} + {author ? ( + <NameText account={author} showAvatar /> + ) : authorUrl ? ( + <a + href={authorUrl} + target="_blank" + rel="noopener noreferrer" + > + {authorName} + </a> + ) : ( + authorName + )} + </Trans> + </small> + </p> + </> + )} + </div> + </article> + </a> + {supportsTrendingLinkPosts && ( + <button + type="button" + class="small plain4 block" + onClick={() => { + setCurrentLink(url); + }} + disabled={url === currentLink} + > + <Icon icon="comment2" />{' '} + <span> + <Trans>Mentions</Trans> + </span>{' '} + <Icon icon="chevron-down" /> + </button> + )} + </div> ); })} </div> )} + {supportsTrendingLinkPosts && !!links.length && ( + <div + class={`timeline-header-block ${hasCurrentLink ? 'blended' : ''}`} + > + {hasCurrentLink ? ( + <> + <div style={{ width: 50, flexShrink: 0, textAlign: 'center' }}> + {currentLinkMentionsLoading ? ( + <Loader abrupt /> + ) : ( + <button + type="button" + class="light" + onClick={() => { + setCurrentLink(null); + }} + > + <Icon icon="x" alt={t`Back to showing trending posts`} /> + </button> + )} + </div> + <p> + <Trans> + Showing posts mentioning{' '} + <span class="link-text"> + {currentLink + .replace(/^https?:\/\/(www\.)?/i, '') + .replace(/\/$/, '')} + </span> + </Trans> + </p> + </> + ) : ( + <p class="insignificant"> + <Trans>Trending posts</Trans> + </p> + )} + </div> + )} </> ); - }, [hashtags, links]); + }, [hashtags, links, currentLink, currentLinkMentionsLoading]); return ( <Timeline @@ -244,16 +437,18 @@ function Trending({ columnMode, ...props }) { title={title} titleComponent={ <h1 class="header-double-lines"> - <b>Trending</b> + <b> + <Trans>Trending</Trans> + </b> <div>{instance}</div> </h1> } id="trending" instance={instance} - emptyText="No trending posts." - errorText="Unable to load posts" - fetchItems={fetchTrend} - checkForUpdates={checkForUpdates} + emptyText={t`No trending posts.`} + errorText={t`Unable to load posts`} + fetchItems={hasCurrentLink ? fetchLinkMentions : fetchTrends} + checkForUpdates={hasCurrentLink ? undefined : checkForUpdates} checkForUpdatesInterval={5 * 60 * 1000} // 5 minutes useItemID headerStart={<></>} @@ -261,6 +456,9 @@ function Trending({ columnMode, ...props }) { // allowFilters filterContext="public" timelineStart={TimelineStart} + refresh={currentLink} + clearWhenRefresh + view={hasCurrentLink ? 'link-mentions' : undefined} headerEnd={ <Menu2 portal @@ -270,17 +468,17 @@ function Trending({ columnMode, ...props }) { position="anchor" menuButton={ <button type="button" class="plain"> - <Icon icon="more" size="l" /> + <Icon icon="more" size="l" alt={t`More`} /> </button> } > <MenuItem onClick={() => { let newInstance = prompt( - 'Enter a new instance e.g. "mastodon.social"', + t`Enter a new instance e.g. "mastodon.social"`, ); if (!/\./.test(newInstance)) { - if (newInstance) alert('Invalid instance'); + if (newInstance) alert(t`Invalid instance`); return; } if (newInstance) { @@ -290,7 +488,10 @@ function Trending({ columnMode, ...props }) { } }} > - <Icon icon="bus" /> <span>Go to another instance…</span> + <Icon icon="bus" />{' '} + <span> + <Trans>Go to another instance…</Trans> + </span> </MenuItem> {currentInstance !== instance && ( <MenuItem @@ -300,7 +501,9 @@ function Trending({ columnMode, ...props }) { > <Icon icon="bus" />{' '} <small class="menu-double-lines"> - Go to my instance (<b>{currentInstance}</b>) + <Trans> + Go to my instance (<b>{currentInstance}</b>) + </Trans> </small> </MenuItem> )} diff --git a/src/pages/welcome.css b/src/pages/welcome.css index c79a2c71..d020170b 100644 --- a/src/pages/welcome.css +++ b/src/pages/welcome.css @@ -140,7 +140,7 @@ height: auto; max-height: none; position: fixed; - left: 0; + inset-inline-start: 0; top: 0; bottom: 0; width: 50%; @@ -153,8 +153,9 @@ } #why-container { - padding: 32px 32px 32px 8px; - margin-left: 50%; + padding: 32px; + padding-inline-start: 8px; + margin-inline-start: 50%; /* overflow: auto; mask-image: linear-gradient(to top, transparent 16px, black 64px); */ diff --git a/src/pages/welcome.jsx b/src/pages/welcome.jsx index 2f62b134..dbaa90cf 100644 --- a/src/pages/welcome.jsx +++ b/src/pages/welcome.jsx @@ -1,5 +1,7 @@ import './welcome.css'; +import { t, Trans } from '@lingui/macro'; + import boostsCarouselUrl from '../assets/features/boosts-carousel.jpg'; import groupedNotificationsUrl from '../assets/features/grouped-notifications.jpg'; import multiColumnUrl from '../assets/features/multi-column.jpg'; @@ -8,6 +10,7 @@ import nestedCommentsThreadUrl from '../assets/features/nested-comments-thread.j import logoText from '../assets/logo-text.svg'; import logo from '../assets/logo.svg'; +import LangSelector from '../components/lang-selector'; import Link from '../components/link'; import states from '../utils/states'; import useTitle from '../utils/useTitle'; @@ -46,7 +49,9 @@ function Welcome() { /> <img src={logoText} alt="Phanpy" width="200" /> </h1> - <p class="desc">A minimalistic opinionated Mastodon web client.</p> + <p class="desc"> + <Trans>A minimalistic opinionated Mastodon web client.</Trans> + </p> <p> <Link to={ @@ -56,22 +61,24 @@ function Welcome() { } class="button" > - {DEFAULT_INSTANCE ? 'Log in' : 'Log in with Mastodon'} + {DEFAULT_INSTANCE ? t`Log in` : t`Log in with Mastodon`} </Link> </p> {DEFAULT_INSTANCE && DEFAULT_INSTANCE_REGISTRATION_URL && ( <p> <a href={DEFAULT_INSTANCE_REGISTRATION_URL} class="button plain5"> - Sign up + <Trans>Sign up</Trans> </a> </p> )} {!DEFAULT_INSTANCE && ( <p class="insignificant"> <small> - Connect your existing Mastodon/Fediverse account. - <br /> - Your credentials are not stored on this server. + <Trans> + Connect your existing Mastodon/Fediverse account. + <br /> + Your credentials are not stored on this server. + </Trans> </small> </p> )} @@ -84,81 +91,109 @@ function Welcome() { </p> )} <p> - <a href="https://github.com/cheeaun/phanpy" target="_blank"> - Built - </a>{' '} - by{' '} - <a - href="https://mastodon.social/@cheeaun" - target="_blank" - onClick={(e) => { - e.preventDefault(); - states.showAccount = 'cheeaun@mastodon.social'; - }} - > - @cheeaun - </a> - .{' '} - <a href={PRIVACY_POLICY_URL} target="_blank"> - Privacy Policy - </a> - . + <Trans> + <a href="https://github.com/cheeaun/phanpy" target="_blank"> + Built + </a>{' '} + by{' '} + <a + href="https://mastodon.social/@cheeaun" + target="_blank" + onClick={(e) => { + e.preventDefault(); + states.showAccount = 'cheeaun@mastodon.social'; + }} + > + @cheeaun + </a> + .{' '} + <a href={PRIVACY_POLICY_URL} target="_blank"> + Privacy Policy + </a> + . + </Trans> </p> + <div> + <LangSelector /> + </div> </div> <div id="why-container"> <div class="sections"> <section> <img src={boostsCarouselUrl} - alt="Screenshot of Boosts Carousel" + alt={t`Screenshot of Boosts Carousel`} loading="lazy" /> - <h4>Boosts Carousel</h4> + <h4> + <Trans>Boosts Carousel</Trans> + </h4> <p> - Visually separate original posts and re-shared posts (boosted - posts). + <Trans> + Visually separate original posts and re-shared posts (boosted + posts). + </Trans> </p> </section> <section> <img src={nestedCommentsThreadUrl} - alt="Screenshot of nested comments thread" + alt={t`Screenshot of nested comments thread`} loading="lazy" /> - <h4>Nested comments thread</h4> - <p>Effortlessly follow conversations. Semi-collapsible replies.</p> + <h4> + <Trans>Nested comments thread</Trans> + </h4> + <p> + <Trans> + Effortlessly follow conversations. Semi-collapsible replies. + </Trans> + </p> </section> <section> <img src={groupedNotificationsUrl} - alt="Screenshot of grouped notifications" + alt={t`Screenshot of grouped notifications`} loading="lazy" /> - <h4>Grouped notifications</h4> + <h4> + <Trans>Grouped notifications</Trans> + </h4> <p> - Similar notifications are grouped and collapsed to reduce clutter. + <Trans> + Similar notifications are grouped and collapsed to reduce + clutter. + </Trans> </p> </section> <section> <img src={multiColumnUrl} - alt="Screenshot of multi-column UI" + alt={t`Screenshot of multi-column UI`} loading="lazy" /> - <h4>Single or multi-column</h4> + <h4> + <Trans>Single or multi-column</Trans> + </h4> <p> - By default, single column for zen-mode seekers. Configurable - multi-column for power users. + <Trans> + By default, single column for zen-mode seekers. Configurable + multi-column for power users. + </Trans> </p> </section> <section> <img src={multiHashtagTimelineUrl} - alt="Screenshot of multi-hashtag timeline with a form to add more hashtags" + alt={t`Screenshot of multi-hashtag timeline with a form to add more hashtags`} loading="lazy" /> - <h4>Multi-hashtag timeline</h4> - <p>Up to 5 hashtags combined into a single timeline.</p> + <h4> + <Trans>Multi-hashtag timeline</Trans> + </h4> + <p> + <Trans>Up to 5 hashtags combined into a single timeline.</Trans> + </p> </section> </div> </div> diff --git a/src/polyfills.js b/src/polyfills.js new file mode 100644 index 00000000..514dad86 --- /dev/null +++ b/src/polyfills.js @@ -0,0 +1,24 @@ +// AbortSignal.timeout polyfill +// Temporary fix from https://github.com/mo/abortcontroller-polyfill/issues/73#issuecomment-1541180943 +// Incorrect implementation, but should be good enough for now +if ('AbortSignal' in window) { + AbortSignal.timeout = + AbortSignal.timeout || + ((duration) => { + const controller = new AbortController(); + setTimeout(() => controller.abort(), duration); + return controller.signal; + }); +} + +// URL.parse() polyfill +if ('URL' in window && typeof URL.parse !== 'function') { + URL.parse = function (url, base) { + if (!url) return null; + try { + return base ? new URL(url, base) : new URL(url); + } catch (e) { + return null; + } + }; +} diff --git a/src/utils/api.js b/src/utils/api.js index 52fd8cc1..94da413f 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -7,6 +7,7 @@ import { getAccountByInstance, getCurrentAccount, saveAccount, + setCurrentAccountID, } from './store-utils'; const { PHANPY_SCHEME: SCHEME = 'https' } = import.meta.env; @@ -60,6 +61,11 @@ export function initClient({ instance, accessToken }) { return client; } +export function hasInstance(instance) { + const instances = store.local.getJSON('instances') || {}; + return !!instances[instance]; +} + // Get the instance information // The config is needed for composing export async function initInstance(client, instance) { @@ -67,6 +73,7 @@ export async function initInstance(client, instance) { const { masto, accessToken } = client; // Request v2, fallback to v1 if fail let info; + __BENCHMARK.start('fetch-instance'); try { info = await masto.v2.instance.fetch(); } catch (e) {} @@ -75,6 +82,7 @@ export async function initInstance(client, instance) { info = await masto.v1.instance.fetch(); } catch (e) {} } + __BENCHMARK.end('fetch-instance'); if (!info) return; console.log(info); const { @@ -85,6 +93,7 @@ export async function initInstance(client, instance) { domain, configuration: { urls: { streaming } = {} } = {}, } = info; + const instances = store.local.getJSON('instances') || {}; if (uri || domain) { instances[ @@ -98,6 +107,34 @@ export async function initInstance(client, instance) { instances[instance.toLowerCase()] = info; } store.local.setJSON('instances', instances); + + let nodeInfo; + // GoToSocial requires we get the NodeInfo to identify server type + // spec: https://github.com/jhass/nodeinfo + try { + if (uri || domain) { + let urlBase = uri || `https://${domain}`; + const wellKnown = await ( + await fetch(`${urlBase}/.well-known/nodeinfo`) + ).json(); + if (Array.isArray(wellKnown?.links)) { + const nodeInfoUrl = wellKnown.links.find( + (link) => + typeof link.rel === 'string' && + link.rel.startsWith('http://nodeinfo.diaspora.software/ns/schema/'), + )?.href; + if (nodeInfoUrl && nodeInfoUrl.startsWith(urlBase)) { + nodeInfo = await (await fetch(nodeInfoUrl)).json(); + } + } + } + } catch (e) {} + const nodeInfos = store.local.getJSON('nodeInfos') || {}; + if (nodeInfo) { + nodeInfos[instance.toLowerCase()] = nodeInfo; + } + store.local.setJSON('nodeInfos', nodeInfos); + // This is a weird place to put this but here's updating the masto instance with the streaming API URL set in the configuration // Reason: Streaming WebSocket URL may change, unlike the standard API REST URLs const supportsWebSocket = 'WebSocket' in window; @@ -114,6 +151,7 @@ export async function initInstance(client, instance) { // masto.ws = streamClient; console.log('🎏 Streaming API client:', client); } + __BENCHMARK.end('init-instance'); } // Get the account information and store it @@ -122,7 +160,7 @@ export async function initAccount(client, instance, accessToken, vapidKey) { const mastoAccount = await masto.v1.accounts.verifyCredentials(); console.log('CURRENTACCOUNT SET', mastoAccount.id); - store.session.set('currentAccount', mastoAccount.id); + setCurrentAccountID(mastoAccount.id); saveAccount({ info: mastoAccount, @@ -132,11 +170,17 @@ export async function initAccount(client, instance, accessToken, vapidKey) { }); } +export function hasPreferences() { + return !!store.account.get('preferences'); +} + // Get preferences export async function initPreferences(client) { try { const { masto } = client; + __BENCHMARK.start('fetch-preferences'); const preferences = await masto.v1.preferences.fetch(); + __BENCHMARK.end('fetch-preferences'); store.account.set('preferences', preferences); } catch (e) { // silently fail diff --git a/src/utils/auth.js b/src/utils/auth.js index c1a1a5f9..5a2af511 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -3,13 +3,29 @@ const { PHANPY_WEBSITE: WEBSITE, PHANPY_SCHEME: SCHEME = 'https', } = import.meta.env; +import { generateCodeChallenge, verifier } from './oauth-pkce'; const SCOPES = 'read write follow push'; +/* + PHANPY_WEBSITE is set to the default official site. + It's used in pre-built releases, so there's no way to change it dynamically + without rebuilding. + Therefore, we can't use it as redirect_uri. + We only use PHANPY_WEBSITE if it's "same" as current location URL. + + Very basic check based on location.hostname for now +*/ +const sameSite = WEBSITE + ? WEBSITE.toLowerCase().includes(location.hostname) + : false; +const currentLocation = location.origin + location.pathname; +const REDIRECT_URI = DEV || !sameSite ? currentLocation : WEBSITE; + export async function registerApplication({ instanceURL }) { const registrationParams = new URLSearchParams({ client_name: CLIENT_NAME, - redirect_uris: location.origin + location.pathname, + redirect_uris: REDIRECT_URI, scopes: SCOPES, website: WEBSITE, }); @@ -28,11 +44,26 @@ export async function registerApplication({ instanceURL }) { return registrationJSON; } +export async function getPKCEAuthorizationURL({ instanceURL, client_id }) { + const codeVerifier = verifier(); + const codeChallenge = await generateCodeChallenge(codeVerifier); + const params = new URLSearchParams({ + client_id, + code_challenge_method: 'S256', + code_challenge: codeChallenge, + redirect_uri: REDIRECT_URI, + response_type: 'code', + scope: SCOPES, + }); + const authorizationURL = `https://${instanceURL}/oauth/authorize?${params.toString()}`; + return [authorizationURL, codeVerifier]; +} + export async function getAuthorizationURL({ instanceURL, client_id }) { const authorizationParams = new URLSearchParams({ client_id, scope: SCOPES, - redirect_uri: location.origin + location.pathname, + redirect_uri: REDIRECT_URI, // redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', response_type: 'code', }); @@ -45,15 +76,23 @@ export async function getAccessToken({ client_id, client_secret, code, + code_verifier, }) { const params = new URLSearchParams({ client_id, - client_secret, - redirect_uri: location.origin + location.pathname, + redirect_uri: REDIRECT_URI, grant_type: 'authorization_code', code, scope: SCOPES, + // client_secret, + // code_verifier, }); + if (client_secret) { + params.append('client_secret', client_secret); + } + if (code_verifier) { + params.append('code_verifier', code_verifier); + } const tokenResponse = await fetch(`${SCHEME}://${instanceURL}/oauth/token`, { method: 'POST', headers: { diff --git a/src/utils/color-utils.js b/src/utils/color-utils.js index 02f5eed7..52c8e3d8 100644 --- a/src/utils/color-utils.js +++ b/src/utils/color-utils.js @@ -1,52 +1,6 @@ -// https://gist.github.com/earthbound19/e7fe15fdf8ca3ef814750a61bc75b5ce -function clamp(value, min, max) { - return Math.max(Math.min(value, max), min); -} +import oklab2rgb from 'chroma-js/src/io/oklab/oklab2rgb.js'; +import rgb2oklab from 'chroma-js/src/io/oklab/rgb2oklab.js'; +import oklch2rgb from 'chroma-js/src/io/oklch/oklch2rgb.js'; +import rgb2oklch from 'chroma-js/src/io/oklch/rgb2oklch.js'; -const gammaToLinear = (c) => - c >= 0.04045 ? Math.pow((c + 0.055) / 1.055, 2.4) : c / 12.92; -const linearToGamma = (c) => - c >= 0.0031308 ? 1.055 * Math.pow(c, 1 / 2.4) - 0.055 : 12.92 * c; - -export function rgb2oklab([r, g, b]) { - r = gammaToLinear(r / 255); - g = gammaToLinear(g / 255); - b = gammaToLinear(b / 255); - var l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b; - var m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b; - var s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b; - l = Math.cbrt(l); - m = Math.cbrt(m); - s = Math.cbrt(s); - return [ - l * +0.2104542553 + m * +0.793617785 + s * -0.0040720468, - l * +1.9779984951 + m * -2.428592205 + s * +0.4505937099, - l * +0.0259040371 + m * +0.7827717662 + s * -0.808675766, - ]; -} - -export function oklab2rgb([L, a, b]) { - var l = L + a * +0.3963377774 + b * +0.2158037573; - var m = L + a * -0.1055613458 + b * -0.0638541728; - var s = L + a * -0.0894841775 + b * -1.291485548; - // The ** operator here cubes; same as l_*l_*l_ in the C++ example: - l = l ** 3; - m = m ** 3; - s = s ** 3; - var r = l * +4.0767416621 + m * -3.3077115913 + s * +0.2309699292; - var g = l * -1.2684380046 + m * +2.6097574011 + s * -0.3413193965; - var b = l * -0.0041960863 + m * -0.7034186147 + s * +1.707614701; - // Convert linear RGB values returned from oklab math to sRGB for our use before returning them: - r = 255 * linearToGamma(r); - g = 255 * linearToGamma(g); - b = 255 * linearToGamma(b); - // OPTION: clamp r g and b values to the range 0-255; but if you use the values immediately to draw, JavaScript clamps them on use: - r = clamp(r, 0, 255); - g = clamp(g, 0, 255); - b = clamp(b, 0, 255); - // OPTION: round the values. May not be necessary if you use them immediately for rendering in JavaScript, as JavaScript (also) discards decimals on render: - r = Math.round(r); - g = Math.round(g); - b = Math.round(b); - return [r, g, b]; -} +export { oklab2rgb, rgb2oklab, oklch2rgb, rgb2oklch }; diff --git a/src/utils/emojify-text.js b/src/utils/emojify-text.js index 757920fb..3c8cd43d 100644 --- a/src/utils/emojify-text.js +++ b/src/utils/emojify-text.js @@ -8,7 +8,7 @@ function emojifyText(text, emojis = []) { const { shortcode, staticUrl, url } = emoji; text = text.replace( new RegExp(`:${shortcode}:`, 'g'), - `<picture><source srcset="${staticUrl}" media="(prefers-reduced-motion: reduce)"></source><img class="shortcode-emoji emoji" src="${url}" alt=":${shortcode}:" width="16" height="16" loading="lazy" decoding="async" /></picture>`, + `<picture><source srcset="${staticUrl}" media="(prefers-reduced-motion: reduce)"></source><img class="shortcode-emoji emoji" src="${url}" alt=":${shortcode}:" width="16" height="16" loading="lazy" decoding="async" fetchPriority="low" /></picture>`, ); }); // console.log(text, emojis); diff --git a/src/utils/enhance-content.js b/src/utils/enhance-content.js index d6157352..70e92e38 100644 --- a/src/utils/enhance-content.js +++ b/src/utils/enhance-content.js @@ -4,53 +4,92 @@ import mem from './mem'; const fauxDiv = document.createElement('div'); const whitelistLinkClasses = ['u-url', 'mention', 'hashtag']; +const HTML_CHARS_REGEX = /[&<>]/g; +function escapeHTML(html) { + return html.replace( + HTML_CHARS_REGEX, + (c) => + ({ + '&': '&', + '<': '<', + '>': '>', + })[c], + ); +} + +const LINK_REGEX = /<a/i; +const HTTP_LINK_REGEX = /^https?:\/\//i; +const MENTION_REGEX = /^@[^@]+(@[^@]+)?$/; +const HASHTAG_REGEX = /^#[^#]+$/; +const CODE_BLOCK_REGEX = /^```[^]+```$/; +const CODE_BLOCK_START_REGEX = /^```/; +const CODE_BLOCK_END_REGEX = /```$/; +const INLINE_CODE_REGEX = /`[^`]+`/; +const TWITTER_DOMAIN_REGEX = /(twitter|x)\.com/i; +const TWITTER_MENTION_REGEX = /@[a-zA-Z0-9_]+@(twitter|x)\.com/; +const TWITTER_MENTION_CAPTURE_REGEX = /(@([a-zA-Z0-9_]+)@(twitter|x)\.com)/g; +const CODE_INLINE_CAPTURE_REGEX = /(`[^]+?`)/g; + +function createDOM(html, isDocumentFragment) { + if (isDocumentFragment) { + const tpl = document.createElement('template'); + tpl.innerHTML = html; + return tpl.content; + } else { + const tpl = document.createElement('div'); + tpl.innerHTML = html; + return tpl; + } +} + function _enhanceContent(content, opts = {}) { - const { emojis, postEnhanceDOM = () => {} } = opts; + const { emojis, returnDOM, postEnhanceDOM = () => {} } = opts; let enhancedContent = content; - const dom = document.createElement('div'); - dom.innerHTML = enhancedContent; - const hasLink = /<a/i.test(enhancedContent); + // const dom = document.createElement('div'); + // dom.innerHTML = enhancedContent; + const dom = createDOM(enhancedContent, returnDOM); + const hasLink = LINK_REGEX.test(enhancedContent); const hasCodeBlock = enhancedContent.includes('```'); if (hasLink) { // Add target="_blank" to all links with no target="_blank" // E.g. `note` in `account` const noTargetBlankLinks = dom.querySelectorAll('a:not([target="_blank"])'); - noTargetBlankLinks.forEach((link) => { + for (const link of noTargetBlankLinks) { link.setAttribute('target', '_blank'); - }); + } // Remove all classes except `u-url`, `mention`, `hashtag` const links = dom.querySelectorAll('a[class]'); - links.forEach((link) => { - link.classList.forEach((c) => { + for (const link of links) { + for (const c of link.classList) { if (!whitelistLinkClasses.includes(c)) { link.classList.remove(c); } - }); - }); + } + } } // Add 'has-url-text' to all links that contains a url if (hasLink) { const links = dom.querySelectorAll('a[href]'); - links.forEach((link) => { - if (/^https?:\/\//i.test(link.textContent.trim())) { + for (const link of links) { + if (HTTP_LINK_REGEX.test(link.textContent.trim())) { link.classList.add('has-url-text'); shortenLink(link); } - }); + } } // Spanify un-spanned mentions if (hasLink) { const links = dom.querySelectorAll('a[href]'); const usernames = []; - links.forEach((link) => { + for (const link of links) { const text = link.innerText.trim(); const hasChildren = link.querySelector('*'); // If text looks like @username@domain, then it's a mention - if (/^@[^@]+(@[^@]+)?$/g.test(text)) { + if (MENTION_REGEX.test(text)) { // Only show @username const [_, username, domain] = text.split('@'); if (!hasChildren) { @@ -67,31 +106,25 @@ function _enhanceContent(content, opts = {}) { link.classList.add('mention'); } // If text looks like #hashtag, then it's a hashtag - if (/^#[^#]+$/g.test(text)) { + if (HASHTAG_REGEX.test(text)) { if (!hasChildren) link.innerHTML = `#<span>${text.slice(1)}</span>`; link.classList.add('mention', 'hashtag'); } - }); + } } // EMOJIS // ====== // Convert :shortcode: to <img /> let textNodes; - if (enhancedContent.includes(':')) { + if (enhancedContent.includes(':') && emojis?.length) { textNodes = extractTextNodes(dom); - textNodes.forEach((node) => { - let html = node.nodeValue - .replace(/&/g, '&') - .replace(/</g, '<') - .replace(/>/g, '>'); - if (emojis) { - html = emojifyText(html, emojis); - } + for (const node of textNodes) { + let html = escapeHTML(node.nodeValue); + html = emojifyText(html, emojis); fauxDiv.innerHTML = html; - // const nodes = [...fauxDiv.childNodes]; node.replaceWith(...fauxDiv.childNodes); - }); + } } // CODE BLOCKS @@ -99,31 +132,35 @@ function _enhanceContent(content, opts = {}) { // Convert ```code``` to <pre><code>code</code></pre> if (hasCodeBlock) { const blocks = [...dom.querySelectorAll('p')].filter((p) => - /^```[^]+```$/g.test(p.innerText.trim()), + CODE_BLOCK_REGEX.test(p.innerText.trim()), ); - blocks.forEach((block) => { + for (const block of blocks) { const pre = document.createElement('pre'); // Replace <br /> with newlines - block.querySelectorAll('br').forEach((br) => br.replaceWith('\n')); + for (const br of block.querySelectorAll('br')) { + br.replaceWith('\n'); + } pre.innerHTML = `<code>${block.innerHTML.trim()}</code>`; block.replaceWith(pre); - }); + } } // Convert multi-paragraph code blocks to <pre><code>code</code></pre> if (hasCodeBlock) { const paragraphs = [...dom.querySelectorAll('p')]; // Filter out paragraphs with ``` in beginning only - const codeBlocks = paragraphs.filter((p) => /^```/g.test(p.innerText)); + const codeBlocks = paragraphs.filter((p) => + CODE_BLOCK_START_REGEX.test(p.innerText), + ); // For each codeBlocks, get all paragraphs until the last paragraph with ``` at the end only - codeBlocks.forEach((block) => { + for (const block of codeBlocks) { const nextParagraphs = [block]; let hasCodeBlock = false; let currentBlock = block; while (currentBlock.nextElementSibling) { const next = currentBlock.nextElementSibling; if (next && next.tagName === 'P') { - if (/```$/g.test(next.innerText)) { + if (CODE_BLOCK_END_REGEX.test(next.innerText)) { nextParagraphs.push(next); hasCodeBlock = true; break; @@ -137,16 +174,20 @@ function _enhanceContent(content, opts = {}) { } if (hasCodeBlock) { const pre = document.createElement('pre'); - nextParagraphs.forEach((p) => { + for (const p of nextParagraphs) { // Replace <br /> with newlines - p.querySelectorAll('br').forEach((br) => br.replaceWith('\n')); - }); + for (const br of p.querySelectorAll('br')) { + br.replaceWith('\n'); + } + } const codeText = nextParagraphs.map((p) => p.innerHTML).join('\n\n'); pre.innerHTML = `<code tabindex="0">${codeText}</code>`; block.replaceWith(pre); - nextParagraphs.forEach((p) => p.remove()); + for (const p of nextParagraphs) { + p.remove(); + } } - }); + } } // INLINE CODE @@ -154,42 +195,36 @@ function _enhanceContent(content, opts = {}) { // Convert `code` to <code>code</code> if (enhancedContent.includes('`')) { textNodes = extractTextNodes(dom); - textNodes.forEach((node) => { - let html = node.nodeValue - .replace(/&/g, '&') - .replace(/</g, '<') - .replace(/>/g, '>'); - if (/`[^`]+`/g.test(html)) { - html = html.replaceAll(/(`[^]+?`)/g, '<code>$1</code>'); + for (const node of textNodes) { + let html = escapeHTML(node.nodeValue); + if (INLINE_CODE_REGEX.test(html)) { + html = html.replaceAll(CODE_INLINE_CAPTURE_REGEX, '<code>$1</code>'); } fauxDiv.innerHTML = html; // const nodes = [...fauxDiv.childNodes]; node.replaceWith(...fauxDiv.childNodes); - }); + } } // TWITTER USERNAMES // ================= // Convert @username@twitter.com to <a href="https://twitter.com/username">@username@twitter.com</a> - if (/twitter\.com/i.test(enhancedContent)) { + if (TWITTER_DOMAIN_REGEX.test(enhancedContent)) { textNodes = extractTextNodes(dom, { rejectFilter: ['A'], }); - textNodes.forEach((node) => { - let html = node.nodeValue - .replace(/&/g, '&') - .replace(/</g, '<') - .replace(/>/g, '>'); - if (/@[a-zA-Z0-9_]+@twitter\.com/g.test(html)) { + for (const node of textNodes) { + let html = escapeHTML(node.nodeValue); + if (TWITTER_MENTION_REGEX.test(html)) { html = html.replaceAll( - /(@([a-zA-Z0-9_]+)@twitter\.com)/g, + TWITTER_MENTION_CAPTURE_REGEX, '<a href="https://twitter.com/$2" rel="nofollow noopener noreferrer" target="_blank">$1</a>', ); } fauxDiv.innerHTML = html; // const nodes = [...fauxDiv.childNodes]; node.replaceWith(...fauxDiv.childNodes); - }); + } } // HASHTAG STUFFING @@ -235,10 +270,34 @@ function _enhanceContent(content, opts = {}) { }, ); if (hashtagStuffedParagraphs?.length) { - hashtagStuffedParagraphs.forEach((p) => { + for (const p of hashtagStuffedParagraphs) { p.classList.add('hashtag-stuffing'); p.title = p.innerText; - }); + } + } + } + + // ADD ASPECT RATIO TO ALL IMAGES + if (enhancedContent.includes('<img')) { + const imgs = dom.querySelectorAll('img'); + for (let i = 0; i < imgs.length; i++) { + const img = imgs[i]; + const width = img.getAttribute('width') || img.naturalWidth; + const height = img.getAttribute('height') || img.naturalHeight; + if (width && height) { + img.style.setProperty('--original-aspect-ratio', `${width}/${height}`); + } + } + } + + // FIX CLOAK MODE FOR SAFARI + // Workaround for Safari so that `text-decoration-thickness` works + // Wrap child text nodes in spans + for (const node of dom.childNodes) { + if (node.nodeType === Node.TEXT_NODE) { + const span = document.createElement('span'); + span.textContent = node.textContent; + dom.replaceChild(span, node); } } @@ -247,9 +306,7 @@ function _enhanceContent(content, opts = {}) { // postEnhanceDOM(dom); // mutate dom } - enhancedContent = dom.innerHTML; - - return enhancedContent; + return returnDOM ? dom : dom.innerHTML; } const enhanceContent = mem(_enhanceContent); diff --git a/src/utils/filters.jsx b/src/utils/filters.js similarity index 93% rename from src/utils/filters.jsx rename to src/utils/filters.js index 5d51bc0b..794d6179 100644 --- a/src/utils/filters.jsx +++ b/src/utils/filters.js @@ -1,5 +1,5 @@ import mem from './mem'; -import store from './store'; +import { getCurrentAccountID } from './store-utils'; function _isFiltered(filtered, filterContext) { if (!filtered?.length) return false; @@ -43,7 +43,7 @@ export function filteredItem(item, filterContext, currentAccountID) { export function filteredItems(items, filterContext) { if (!items?.length) return []; if (!filterContext) return items; - const currentAccountID = store.session.get('currentAccount'); + const currentAccountID = getCurrentAccountID(); return items.filter((item) => filteredItem(item, filterContext, currentAccountID), ); diff --git a/src/utils/focus-deck.jsx b/src/utils/focus-deck.js similarity index 59% rename from src/utils/focus-deck.jsx rename to src/utils/focus-deck.js index 16a8fded..0dac6e46 100644 --- a/src/utils/focus-deck.jsx +++ b/src/utils/focus-deck.js @@ -2,8 +2,25 @@ const focusDeck = () => { let timer = setTimeout(() => { const columns = document.getElementById('columns'); if (columns) { - // Focus first column - // columns.querySelector('.deck-container')?.focus?.(); + // Focus focused column + const focusedColumn = columns.querySelector('.deck-container.focus'); + if (focusedColumn) { + focusedColumn.focus(); + } else { + // Focus first column within viewport + const firstVisibleColumn = columns + .querySelectorAll('.deck-container') + .find((column) => { + const columnRect = column.getBoundingClientRect(); + return columnRect.left >= 0; + }); + if (firstVisibleColumn) { + firstVisibleColumn.focus(); + } else { + // Focus first column + columns.querySelector('.deck-container')?.focus?.(); + } + } } else { const modals = document.querySelectorAll('#modal-container > *'); if (modals?.length) { diff --git a/src/utils/format-duration.js b/src/utils/format-duration.js new file mode 100644 index 00000000..935faa9a --- /dev/null +++ b/src/utils/format-duration.js @@ -0,0 +1,14 @@ +export default function formatDuration(time) { + if (!time) return; + let hours = Math.floor(time / 3600); + let minutes = Math.floor((time % 3600) / 60); + let seconds = Math.round(time % 60); + + if (hours === 0) { + return `${minutes}:${seconds.toString().padStart(2, '0')}`; + } else { + return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds + .toString() + .padStart(2, '0')}`; + } +} diff --git a/src/utils/get-instance-status-url.js b/src/utils/get-instance-status-url.js index 042e8583..157c08bd 100644 --- a/src/utils/get-instance-status-url.js +++ b/src/utils/get-instance-status-url.js @@ -5,12 +5,14 @@ const statusPostRegexes = [ /^\/@[^@\/]+\/(?:statuses|posts)\/([^\/]+)/i, // GoToSocial, Takahe /\/notes\/([^\/]+)/i, // Misskey, Firefish /^\/(?:notice|objects)\/([a-z0-9-]+)/i, // Pleroma + /\/@[^@\/]+\/post\/([^\/]+)/i, // Threads /\/@[^@\/]+@?[^\/]+?\/([^\/]+)/i, // Mastodon + /^\/p\/[^\/]+\/([^\/]+)/i, // Pixelfed ]; export function getInstanceStatusObject(url) { // Regex /:username/:id, where username = @username or @username@domain, id = anything - const { hostname, pathname } = new URL(url); + const { hostname, pathname } = URL.parse(url); // const [, username, domain, id] = pathname.match(statusRegex) || []; for (const regex of statusPostRegexes) { const [, id] = pathname.match(regex) || []; diff --git a/src/utils/get-translate-target-language.jsx b/src/utils/get-translate-target-language.js similarity index 63% rename from src/utils/get-translate-target-language.jsx rename to src/utils/get-translate-target-language.js index 9fcc9568..cb0c5749 100644 --- a/src/utils/get-translate-target-language.jsx +++ b/src/utils/get-translate-target-language.js @@ -1,18 +1,20 @@ import translationTargetLanguages from '../data/lingva-target-languages'; import localeMatch from './locale-match'; +import mem from './mem'; import states from './states'; -const locales = [ +const locales = mem(() => [ new Intl.DateTimeFormat().resolvedOptions().locale, ...navigator.languages, -]; +]); -const localeTargetLanguages = localeMatch( - locales, - translationTargetLanguages.map((l) => l.code.replace('_', '-')), // The underscore will fail Intl.Locale inside `match` - 'en', -); +const localeTargetLanguages = () => + localeMatch( + locales(), + translationTargetLanguages.map((l) => l.code.replace('_', '-')), // The underscore will fail Intl.Locale inside `match` + 'en', + ); function getTranslateTargetLanguage(fromSettings = false) { if (fromSettings) { @@ -21,7 +23,7 @@ function getTranslateTargetLanguage(fromSettings = false) { return contentTranslationTargetLanguage; } } - return localeTargetLanguages; + return localeTargetLanguages(); } export default getTranslateTargetLanguage; diff --git a/src/utils/getHTMLText.jsx b/src/utils/getHTMLText.js similarity index 86% rename from src/utils/getHTMLText.jsx rename to src/utils/getHTMLText.js index 9ad74a3c..eadf9640 100644 --- a/src/utils/getHTMLText.jsx +++ b/src/utils/getHTMLText.js @@ -1,8 +1,10 @@ import mem from './mem'; const div = document.createElement('div'); -function getHTMLText(html) { +function getHTMLText(html, opts) { if (!html) return ''; + const { preProcess } = opts || {}; + div.innerHTML = html .replace(/<\/p>/g, '</p>\n\n') .replace(/<\/li>/g, '</li>\n'); @@ -10,6 +12,8 @@ function getHTMLText(html) { br.replaceWith('\n'); }); + preProcess?.(div); + // MASTODON-SPECIFIC classes // Remove .invisible div.querySelectorAll('.invisible').forEach((el) => { diff --git a/src/utils/group-notifications.js b/src/utils/group-notifications.js new file mode 100644 index 00000000..4017a8bd --- /dev/null +++ b/src/utils/group-notifications.js @@ -0,0 +1,270 @@ +// This is like very lame "type-checking" lol +const notificationTypeKeys = { + mention: ['account', 'status'], + status: ['account', 'status'], + reblog: ['account', 'status'], + follow: ['account'], + follow_request: ['account'], + favourite: ['account', 'status'], + poll: ['status'], + update: ['status'], +}; + +const GROUP_TYPES = ['favourite', 'reblog', 'follow']; +const groupable = (type) => GROUP_TYPES.includes(type); + +export function fixNotifications(notifications) { + return notifications.filter((notification) => { + const { type, id, createdAt } = notification; + if (!type) { + console.warn('Notification missing type', notification); + return false; + } + if (!id || !createdAt) { + console.warn('Notification missing id or createdAt', notification); + // Continue processing this despite missing id or createdAt + } + const keys = notificationTypeKeys[type]; + if (keys?.length) { + return keys.every((key) => !!notification[key]); + } + return true; // skip other types + }); +} + +export function massageNotifications2(notifications) { + if (notifications?.notificationGroups) { + const { + accounts = [], + notificationGroups = [], + statuses = [], + } = notifications; + return notificationGroups.map((group) => { + const { sampleAccountIds, statusId } = group; + const sampleAccounts = + sampleAccountIds?.map((id) => accounts.find((a) => a.id === id)) || []; + const status = statuses?.find((s) => s.id === statusId) || null; + return { + ...group, + sampleAccounts, + status, + }; + }); + } + return notifications; +} + +export function groupNotifications2(groupNotifications) { + // Make grouped notifications to look like faux grouped notifications + const newGroupNotifications = groupNotifications.map((gn) => { + const { + latestPageNotificationAt, + mostRecentNotificationId, + sampleAccounts, + notificationsCount, + } = gn; + + return { + id: '' + mostRecentNotificationId, + createdAt: latestPageNotificationAt, + account: sampleAccounts[0], + ...gn, + }; + }); + + // Merge favourited and reblogged of same status into a single notification + // - new type: "favourite+reblog" + // - sum numbers for `notificationsCount` and `sampleAccounts` + const notificationsMap = {}; + const newGroupNotifications1 = []; + for (let i = 0; i < newGroupNotifications.length; i++) { + const gn = newGroupNotifications[i]; + const { + type, + status, + createdAt, + notificationsCount, + sampleAccounts, + groupKey, + } = gn; + const date = createdAt ? new Date(createdAt).toLocaleDateString() : ''; + let virtualType = type; + // const sameCount = + notificationsCount > 0 && notificationsCount === sampleAccounts?.length; + // if (sameCount && (type === 'favourite' || type === 'reblog')) { + if (type === 'favourite' || type === 'reblog') { + virtualType = 'favourite+reblog'; + } + // const key = `${status?.id}-${virtualType}-${date}-${sameCount ? 1 : 0}`; + const key = `${status?.id}-${virtualType}-${date}`; + const mappedNotification = notificationsMap[key]; + if (!groupable(type)) { + newGroupNotifications1.push(gn); + } else if (mappedNotification) { + // Merge sampleAccounts + merge _types + sampleAccounts.forEach((a) => { + const mappedAccount = mappedNotification.sampleAccounts.find( + (ma) => ma.id === a.id, + ); + if (!mappedAccount) { + mappedNotification.sampleAccounts.push({ + ...a, + _types: [type], + }); + } else { + mappedAccount._types.push(type); + mappedAccount._types.sort().reverse(); + } + }); + // mappedNotification.notificationsCount = + // mappedNotification.sampleAccounts.length; + mappedNotification.notificationsCount = Math.min( + mappedNotification.notificationsCount, + notificationsCount, + ); + mappedNotification._notificationsCount.push(notificationsCount); + mappedNotification._accounts = mappedNotification.sampleAccounts; + mappedNotification._groupKeys.push(groupKey); + } else { + const accounts = sampleAccounts.map((a) => ({ + ...a, + _types: [type], + })); + notificationsMap[key] = { + ...gn, + sampleAccounts: accounts, + type: virtualType, + _accounts: accounts, + _groupKeys: groupKey ? [groupKey] : [], + _notificationsCount: [notificationsCount], + }; + newGroupNotifications1.push(notificationsMap[key]); + } + } + + // 2nd pass. + // - Group 1 account favourte/reblog multiple posts + // - _statuses: [status, status, ...] + const notificationsMap2 = {}; + const newGroupNotifications2 = []; + for (let i = 0; i < newGroupNotifications1.length; i++) { + const gn = newGroupNotifications1[i]; + const { type, account, _accounts, sampleAccounts, createdAt, groupKey } = + gn; + const date = createdAt ? new Date(createdAt).toLocaleDateString() : ''; + const hasOneAccount = + sampleAccounts?.length === 1 || _accounts?.length === 1; + if ( + (type === 'favourite' || + type === 'reblog' || + type === 'favourite+reblog') && + hasOneAccount + ) { + const key = `${account?.id}-${type}-${date}`; + const mappedNotification = notificationsMap2[key]; + if (mappedNotification) { + mappedNotification._statuses.push(gn.status); + mappedNotification._ids += `-${gn.id}`; + mappedNotification._groupKeys.push(groupKey); + } else { + let n = (notificationsMap2[key] = { + ...gn, + type, + _ids: gn.id, + _statuses: [gn.status], + _groupKeys: groupKey ? [groupKey] : [], + }); + newGroupNotifications2.push(n); + } + } else { + newGroupNotifications2.push(gn); + } + } + + console.log('newGroupNotifications2', newGroupNotifications2); + + return newGroupNotifications2; +} + +export default function groupNotifications(notifications) { + // Filter out invalid notifications + notifications = fixNotifications(notifications); + + // Create new flat list of notifications + // Combine sibling notifications based on type and status id + // Concat all notification.account into an array of _accounts + const notificationsMap = {}; + const cleanNotifications = []; + for (let i = 0, j = 0; i < notifications.length; i++) { + const notification = notifications[i]; + const { id, status, account, type, createdAt } = notification; + const date = createdAt ? new Date(createdAt).toLocaleDateString() : ''; + let virtualType = type; + if (type === 'favourite' || type === 'reblog') { + virtualType = 'favourite+reblog'; + } + const key = `${status?.id}-${virtualType}-${date}`; + const mappedNotification = notificationsMap[key]; + if (!groupable(type)) { + cleanNotifications[j++] = notification; + } else if (mappedNotification?.account) { + const mappedAccount = mappedNotification._accounts.find( + (a) => a.id === account.id, + ); + if (mappedAccount) { + mappedAccount._types.push(type); + mappedAccount._types.sort().reverse(); + mappedNotification._ids += `-${id}`; + } else { + account._types = [type]; + mappedNotification._accounts.push(account); + mappedNotification._ids += `-${id}`; + } + } else { + if (account) account._types = [type]; + let n = (notificationsMap[key] = { + ...notification, + type: virtualType, + _ids: id, + _accounts: account ? [account] : [], + }); + cleanNotifications[j++] = n; + } + } + + // 2nd pass to group "favourite+reblog"-type notifications by account if _accounts.length <= 1 + // This means one acount has favourited and reblogged the multiple statuses + // The grouped notification + // - type: "favourite+reblog+account" + // - _statuses: [status, status, ...] + const notificationsMap2 = {}; + const cleanNotifications2 = []; + for (let i = 0, j = 0; i < cleanNotifications.length; i++) { + const notification = cleanNotifications[i]; + const { id, account, _accounts, type, createdAt } = notification; + const date = createdAt ? new Date(createdAt).toLocaleDateString() : ''; + if (type === 'favourite+reblog' && account && _accounts.length === 1) { + const key = `${account?.id}-${type}-${date}`; + const mappedNotification = notificationsMap2[key]; + if (mappedNotification) { + mappedNotification._statuses.push(notification.status); + mappedNotification._ids += `-${id}`; + } else { + let n = (notificationsMap2[key] = { + ...notification, + type, + _ids: id, + _statuses: [notification.status], + }); + cleanNotifications2[j++] = n; + } + } else { + cleanNotifications2[j++] = notification; + } + } + + console.log({ notifications, cleanNotifications, cleanNotifications2 }); + + // return cleanNotifications; + return cleanNotifications2; +} diff --git a/src/utils/group-notifications.jsx b/src/utils/group-notifications.jsx deleted file mode 100644 index 132fd32a..00000000 --- a/src/utils/group-notifications.jsx +++ /dev/null @@ -1,112 +0,0 @@ -// This is like very lame "type-checking" lol -const notificationTypeKeys = { - mention: ['account', 'status'], - status: ['account', 'status'], - reblog: ['account', 'status'], - follow: ['account'], - follow_request: ['account'], - favourite: ['account', 'status'], - poll: ['status'], - update: ['status'], -}; -function fixNotifications(notifications) { - return notifications.filter((notification) => { - const { type, id, createdAt } = notification; - if (!type) { - console.warn('Notification missing type', notification); - return false; - } - if (!id || !createdAt) { - console.warn('Notification missing id or createdAt', notification); - // Continue processing this despite missing id or createdAt - } - const keys = notificationTypeKeys[type]; - if (keys?.length) { - return keys.every((key) => !!notification[key]); - } - return true; // skip other types - }); -} - -function groupNotifications(notifications) { - // Filter out invalid notifications - notifications = fixNotifications(notifications); - - // Create new flat list of notifications - // Combine sibling notifications based on type and status id - // Concat all notification.account into an array of _accounts - const notificationsMap = {}; - const cleanNotifications = []; - for (let i = 0, j = 0; i < notifications.length; i++) { - const notification = notifications[i]; - const { id, status, account, type, createdAt } = notification; - const date = createdAt ? new Date(createdAt).toLocaleDateString() : ''; - let virtualType = type; - if (type === 'favourite' || type === 'reblog') { - virtualType = 'favourite+reblog'; - } - const key = `${status?.id}-${virtualType}-${date}`; - const mappedNotification = notificationsMap[key]; - if (virtualType === 'follow_request') { - cleanNotifications[j++] = notification; - } else if (mappedNotification?.account) { - const mappedAccount = mappedNotification._accounts.find( - (a) => a.id === account.id, - ); - if (mappedAccount) { - mappedAccount._types.push(type); - mappedAccount._types.sort().reverse(); - mappedNotification.id += `-${id}`; - } else { - account._types = [type]; - mappedNotification._accounts.push(account); - mappedNotification.id += `-${id}`; - } - } else { - account._types = [type]; - let n = (notificationsMap[key] = { - ...notification, - type: virtualType, - _accounts: [account], - }); - cleanNotifications[j++] = n; - } - } - - // 2nd pass to group "favourite+reblog"-type notifications by account if _accounts.length <= 1 - // This means one acount has favourited and reblogged the multiple statuses - // The grouped notification - // - type: "favourite+reblog+account" - // - _statuses: [status, status, ...] - const notificationsMap2 = {}; - const cleanNotifications2 = []; - for (let i = 0, j = 0; i < cleanNotifications.length; i++) { - const notification = cleanNotifications[i]; - const { id, account, _accounts, type, createdAt } = notification; - const date = createdAt ? new Date(createdAt).toLocaleDateString() : ''; - if (type === 'favourite+reblog' && account && _accounts.length === 1) { - const key = `${account?.id}-${type}-${date}`; - const mappedNotification = notificationsMap2[key]; - if (mappedNotification) { - mappedNotification._statuses.push(notification.status); - mappedNotification.id += `-${id}`; - } else { - let n = (notificationsMap2[key] = { - ...notification, - type, - _statuses: [notification.status], - }); - cleanNotifications2[j++] = n; - } - } else { - cleanNotifications2[j++] = notification; - } - } - - console.log({ notifications, cleanNotifications, cleanNotifications2 }); - - // return cleanNotifications; - return cleanNotifications2; -} - -export default groupNotifications; diff --git a/src/utils/handle-content-links.js b/src/utils/handle-content-links.js index be6547fb..f1bf712a 100644 --- a/src/utils/handle-content-links.js +++ b/src/utils/handle-content-links.js @@ -16,7 +16,9 @@ function handleContentLinks(opts) { const textBeforeLinkIsAt = prevText?.endsWith('@'); const textStartsWithAt = target.innerText.startsWith('@'); if ( - (target.classList.contains('u-url') && textStartsWithAt) || + ((target.classList.contains('u-url') || + target.classList.contains('mention')) && + textStartsWithAt) || (textBeforeLinkIsAt && !textStartsWithAt) ) { const targetText = ( diff --git a/src/utils/i18n-duration.js b/src/utils/i18n-duration.js new file mode 100644 index 00000000..76d94420 --- /dev/null +++ b/src/utils/i18n-duration.js @@ -0,0 +1,10 @@ +import { i18n } from '@lingui/core'; + +export default function i18nDuration(duration, unit) { + return () => + i18n.number(duration, { + style: 'unit', + unit, + unitDisplay: 'long', + }); +} diff --git a/src/utils/is-rtl.js b/src/utils/is-rtl.js new file mode 100644 index 00000000..5e4b5a4e --- /dev/null +++ b/src/utils/is-rtl.js @@ -0,0 +1,27 @@ +let IS_RTL = false; + +// Use MutationObserver to detect RTL +const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.type === 'attributes') { + const { dir } = mutation.target; + if (dir === 'rtl') { + IS_RTL = true; + } else { + IS_RTL = false; + } + console.log({ IS_RTL }); + // Fire custom event 'dirchange' on document + // document.dispatchEvent(new Event('dirchange')); + } + }); +}); +observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['dir'], +}); + +export default function isRTL() { + return IS_RTL; + // return document.documentElement.dir === 'rtl'; +} diff --git a/src/utils/isMastodonLinkMaybe.jsx b/src/utils/isMastodonLinkMaybe.js similarity index 61% rename from src/utils/isMastodonLinkMaybe.jsx rename to src/utils/isMastodonLinkMaybe.js index 78873536..753fc3bb 100644 --- a/src/utils/isMastodonLinkMaybe.jsx +++ b/src/utils/isMastodonLinkMaybe.js @@ -1,11 +1,14 @@ export default function isMastodonLinkMaybe(url) { try { - const { pathname, hash } = new URL(url); + const { pathname, hash, hostname } = URL.parse(url); return ( /^\/.*\/\d+$/i.test(pathname) || /^\/(@[^/]+|users\/[^/]+)\/(statuses|posts)\/\w+\/?$/i.test(pathname) || // GoToSocial, Takahe /^\/notes\/[a-z0-9]+$/i.test(pathname) || // Misskey, Firefish /^\/(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 + (hostname === 'fed.brid.gy' && pathname.startsWith('/r/http')) || // Bridgy Fed /#\/[^\/]+\.[^\/]+\/s\/.+/i.test(hash) // Phanpy 🫣 ); } catch (e) { diff --git a/src/utils/lang.js b/src/utils/lang.js new file mode 100644 index 00000000..9a147c28 --- /dev/null +++ b/src/utils/lang.js @@ -0,0 +1,73 @@ +import { i18n } from '@lingui/core'; +import { + fromNavigator, + fromStorage, + fromUrl, + multipleDetect, +} from '@lingui/detect-locale'; +import Locale from 'intl-locale-textinfo-polyfill'; + +import { ALL_LOCALES, DEFAULT_LANG } from '../locales'; +import { messages } from '../locales/en.po'; +import localeMatch from '../utils/locale-match'; + +const { PHANPY_DEFAULT_LANG } = import.meta.env; + +const langFileMaps = { + // kab: 'kab-KAB', +}; + +i18n.load(DEFAULT_LANG, messages); +i18n.on('change', () => { + const lang = i18n.locale; + if (lang) { + // lang + document.documentElement.lang = lang; + // LTR or RTL + try { + const { direction } = new Locale(lang).textInfo; + document.documentElement.dir = direction; + } catch (e) { + console.error(e); + } + } +}); + +export async function activateLang(lang) { + if (!lang || lang === DEFAULT_LANG) { + i18n.activate(DEFAULT_LANG); + console.log('💬 ACTIVATE LANG', DEFAULT_LANG, lang); + } else { + try { + const { messages } = await import( + `../locales/${langFileMaps[lang] || lang}.po` + ); + i18n.loadAndActivate({ locale: lang, messages }); + console.log('💬 ACTIVATE LANG', lang, messages); + } catch (e) { + console.error(e); + // Fallback to default language + i18n.activate(DEFAULT_LANG); + console.log('💬 ACTIVATE LANG', DEFAULT_LANG, lang); + } + } +} + +export function initActivateLang() { + const languages = multipleDetect( + fromUrl('lang'), + fromStorage('lang'), + fromNavigator(), + PHANPY_DEFAULT_LANG, + DEFAULT_LANG, + ); + const matchedLang = + languages.find((l) => ALL_LOCALES.includes(l)) || + localeMatch(languages, ALL_LOCALES); + activateLang(matchedLang); + + // const yes = confirm(t`Reload to apply language setting?`); + // if (yes) { + // window.location.reload(); + // } +} diff --git a/src/utils/lists.js b/src/utils/lists.js new file mode 100644 index 00000000..1edc000c --- /dev/null +++ b/src/utils/lists.js @@ -0,0 +1,114 @@ +import { api } from './api'; +import pmem from './pmem'; +import store from './store'; + +const FETCH_MAX_AGE = 1000 * 60; // 1 minute +const MAX_AGE = 24 * 60 * 60 * 1000; // 1 day + +export const fetchLists = pmem( + async () => { + const { masto } = api(); + const lists = await masto.v1.lists.list(); + lists.sort((a, b) => a.title.localeCompare(b.title)); + + if (lists.length) { + setTimeout(() => { + // Save to local storage, with saved timestamp + store.account.set('lists', { + lists, + updatedAt: Date.now(), + }); + }, 1); + } + + return lists; + }, + { + maxAge: FETCH_MAX_AGE, + }, +); + +export async function getLists() { + try { + const { lists, updatedAt } = store.account.get('lists') || {}; + if (!lists?.length) return await fetchLists(); + if (Date.now() - updatedAt > MAX_AGE) { + // Stale-while-revalidate + fetchLists(); + return lists; + } + return lists; + } catch (e) { + return []; + } +} + +export const fetchList = pmem( + (id) => { + const { masto } = api(); + return masto.v1.lists.$select(id).fetch(); + }, + { + maxAge: FETCH_MAX_AGE, + }, +); + +export async function getList(id) { + const { lists } = store.account.get('lists') || {}; + console.log({ lists }); + if (lists?.length) { + const theList = lists.find((l) => l.id === id); + if (theList) return theList; + } + try { + return fetchList(id); + } catch (e) { + return null; + } +} + +export async function getListTitle(id) { + const list = await getList(id); + return list?.title || ''; +} + +export function addListStore(list) { + const { lists } = store.account.get('lists') || {}; + if (lists?.length) { + lists.push(list); + lists.sort((a, b) => a.title.localeCompare(b.title)); + store.account.set('lists', { + lists, + updatedAt: Date.now(), + }); + } +} + +export function updateListStore(list) { + const { lists } = store.account.get('lists') || {}; + if (lists?.length) { + const index = lists.findIndex((l) => l.id === list.id); + if (index !== -1) { + lists[index] = list; + lists.sort((a, b) => a.title.localeCompare(b.title)); + store.account.set('lists', { + lists, + updatedAt: Date.now(), + }); + } + } +} + +export function deleteListStore(listID) { + const { lists } = store.account.get('lists') || {}; + if (lists?.length) { + const index = lists.findIndex((l) => l.id === listID); + if (index !== -1) { + lists.splice(index, 1); + store.account.set('lists', { + lists, + updatedAt: Date.now(), + }); + } + } +} diff --git a/src/utils/locale-match.jsx b/src/utils/locale-match.js similarity index 100% rename from src/utils/locale-match.jsx rename to src/utils/locale-match.js diff --git a/src/utils/localeCode2Text.js b/src/utils/localeCode2Text.js new file mode 100644 index 00000000..93778e3b --- /dev/null +++ b/src/utils/localeCode2Text.js @@ -0,0 +1,49 @@ +import { i18n } from '@lingui/core'; + +import mem from './mem'; + +// Some codes are not supported by Intl.DisplayNames +// These are mapped to other codes as fallback +const codeMappings = { + 'zh-YUE': 'YUE', + zh_HANT: 'zh-Hant', +}; + +const IntlDN = mem( + (locale) => + new Intl.DisplayNames(locale || undefined, { + type: 'language', + }), +); + +function _localeCode2Text(code) { + let locale; + let fallback; + if (typeof code === 'object') { + ({ code, locale, fallback } = code); + } + try { + const text = IntlDN(locale || i18n.locale).of(code); + if (text !== code) return text; + if (!fallback) { + const anotherText = IntlDN(code).of(code); + if (anotherText !== code) return anotherText; + } + return fallback || ''; + } catch (e) { + if (codeMappings[code]) { + try { + const text = IntlDN(codeMappings[locale] || locale || i18n.locale).of( + codeMappings[code], + ); + if (text !== codeMappings[code]) return text; + return fallback || ''; + } catch (e2) { + console.warn(code, e2); + } + } + return fallback || ''; + } +} + +export default mem(_localeCode2Text); diff --git a/src/utils/localeCode2Text.jsx b/src/utils/localeCode2Text.jsx deleted file mode 100644 index e9843ace..00000000 --- a/src/utils/localeCode2Text.jsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function localeCode2Text(code) { - try { - return new Intl.DisplayNames(navigator.languages, { - type: 'language', - }).of(code); - } catch (e) { - console.error(e); - return null; - } -} diff --git a/src/utils/mem.js b/src/utils/mem.js index 620ab6df..c4fcb1b8 100644 --- a/src/utils/mem.js +++ b/src/utils/mem.js @@ -3,5 +3,9 @@ import moize from 'moize'; window._moize = moize; export default function mem(fn, opts = {}) { - return moize(fn, { ...opts, maxSize: 50, isDeepEqual: true }); + return moize(fn, { + ...opts, + maxSize: 30, + isDeepEqual: true, + }); } diff --git a/src/utils/nice-date-time.js b/src/utils/nice-date-time.js index adeedff5..65e37cfc 100644 --- a/src/utils/nice-date-time.js +++ b/src/utils/nice-date-time.js @@ -1,11 +1,18 @@ +import { i18n } from '@lingui/core'; + +import localeMatch from './locale-match'; import mem from './mem'; -const { locale } = new Intl.DateTimeFormat().resolvedOptions(); +const defaultLocale = mem( + () => new Intl.DateTimeFormat().resolvedOptions().locale, +); const _DateTimeFormat = (opts) => { - const { dateYear, hideTime, formatOpts } = opts || {}; + const { locale, dateYear, hideTime, formatOpts, forceOpts } = opts || {}; + const regionlessLocale = locale.replace(/-[a-z]+$/i, ''); + const loc = localeMatch([regionlessLocale], [defaultLocale], locale); const currentYear = new Date().getFullYear(); - return Intl.DateTimeFormat(locale, { + const options = forceOpts || { // Show year if not current year year: dateYear === currentYear ? undefined : 'numeric', month: 'short', @@ -14,7 +21,14 @@ const _DateTimeFormat = (opts) => { hour: hideTime ? undefined : 'numeric', minute: hideTime ? undefined : 'numeric', ...formatOpts, - }); + }; + try { + return Intl.DateTimeFormat(loc, options); + } catch (e) {} + try { + return Intl.DateTimeFormat(locale, options); + } catch (e) {} + return Intl.DateTimeFormat(undefined, options); }; const DateTimeFormat = mem(_DateTimeFormat); @@ -24,6 +38,7 @@ function niceDateTime(date, dtfOpts) { } const DTF = DateTimeFormat({ dateYear: date.getFullYear(), + locale: i18n.locale, ...dtfOpts, }); const dateText = DTF.format(date); diff --git a/src/utils/oauth-pkce.js b/src/utils/oauth-pkce.js new file mode 100644 index 00000000..084309b2 --- /dev/null +++ b/src/utils/oauth-pkce.js @@ -0,0 +1,46 @@ +function dec2hex(dec) { + return ('0' + dec.toString(16)).slice(-2); +} +export function verifier() { + var array = new Uint32Array(56 / 2); + window.crypto.getRandomValues(array); + return Array.from(array, dec2hex).join(''); +} +function sha256(plain) { + // returns promise ArrayBuffer + const encoder = new TextEncoder(); + const data = encoder.encode(plain); + return window.crypto.subtle.digest('SHA-256', data); +} +function base64urlencode(a) { + let str = ''; + const bytes = new Uint8Array(a); + const len = bytes.byteLength; + for (var i = 0; i < len; i++) { + str += String.fromCharCode(bytes[i]); + } + return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); +} +export async function generateCodeChallenge(v) { + const hashed = await sha256(v); + return base64urlencode(hashed); +} + +// If /.well-known/oauth-authorization-server exists and code_challenge_methods_supported includes "S256", means support PKCE +export async function supportsPKCE({ instanceURL }) { + if (!instanceURL) return false; + try { + const res = await fetch( + `https://${instanceURL}/.well-known/oauth-authorization-server`, + ); + if (!res.ok || res.status !== 200) return false; + const json = await res.json(); + if (json.code_challenge_methods_supported?.includes('S256')) return true; + return false; + } catch (e) { + return false; + } +} + +// For debugging +window.__generateCodeChallenge = generateCodeChallenge; diff --git a/src/utils/open-compose.js b/src/utils/open-compose.js index b8192876..a5478b0b 100644 --- a/src/utils/open-compose.js +++ b/src/utils/open-compose.js @@ -1,5 +1,7 @@ +import { t, Trans } from '@lingui/macro'; + export default function openCompose(opts) { - const url = new URL('/compose/', window.location); + const url = URL.parse('/compose/', window.location); const { width: screenWidth, height: screenHeight } = window.screen; const left = Math.max(0, (screenWidth - 600) / 2); const top = Math.max(0, (screenHeight - 450) / 2); @@ -19,7 +21,7 @@ export default function openCompose(opts) { newWin.__COMPOSE__ = opts; } else { - alert('Looks like your browser is blocking popups.'); + alert(t`Looks like your browser is blocking popups.`); } return newWin; diff --git a/src/utils/open-osk.js b/src/utils/open-osk.js new file mode 100644 index 00000000..188a5e9f --- /dev/null +++ b/src/utils/open-osk.js @@ -0,0 +1,16 @@ +const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755 + +export default function openOSK() { + if (isSafari) { + const fauxEl = document.createElement('input'); + fauxEl.style.position = 'absolute'; + fauxEl.style.top = '0'; + fauxEl.style.left = '0'; + fauxEl.style.opacity = '0'; + document.body.appendChild(fauxEl); + fauxEl.focus(); + setTimeout(() => { + document.body.removeChild(fauxEl); + }, 500); + } +} diff --git a/src/utils/pretty-bytes.js b/src/utils/pretty-bytes.js new file mode 100644 index 00000000..f49a6ce4 --- /dev/null +++ b/src/utils/pretty-bytes.js @@ -0,0 +1,24 @@ +import { i18n } from '@lingui/core'; + +// https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers +const BYTES_UNITS = [ + 'byte', + 'kilobyte', + 'megabyte', + 'gigabyte', + 'terabyte', + 'petabyte', +]; +export default function prettyBytes(bytes) { + const unitIndex = Math.min( + Math.floor(Math.log2(bytes) / 10), + BYTES_UNITS.length - 1, + ); + const value = bytes / 1024 ** unitIndex; + return i18n.number(value, { + style: 'unit', + unit: BYTES_UNITS[unitIndex], + unitDisplay: 'narrow', + maximumFractionDigits: 0, + }); +} diff --git a/src/utils/push-notifications.js b/src/utils/push-notifications.js index e186547c..b4621e51 100644 --- a/src/utils/push-notifications.js +++ b/src/utils/push-notifications.js @@ -1,6 +1,6 @@ // Utils for push notifications import { api } from './api'; -import { getCurrentAccount } from './store-utils'; +import { getVapidKey } from './store-utils'; // Subscription is an object with the following structure: // { @@ -113,7 +113,7 @@ export async function initSubscription() { // Check if the subscription changed if (backendSubscription && subscription) { const sameEndpoint = backendSubscription.endpoint === subscription.endpoint; - const { vapidKey } = getCurrentAccount(); + const vapidKey = getVapidKey(); const sameKey = backendSubscription.serverKey === vapidKey; if (!sameEndpoint) { throw new Error('Backend subscription endpoint changed'); @@ -146,25 +146,29 @@ export async function initSubscription() { if (subscription && !backendSubscription) { // check if account's vapidKey is same as subscription's applicationServerKey - const { vapidKey } = getCurrentAccount(); - const { applicationServerKey } = subscription.options; - const vapidKeyStr = urlBase64ToUint8Array(vapidKey).toString(); - const applicationServerKeyStr = new Uint8Array( - applicationServerKey, - ).toString(); - const sameKey = vapidKeyStr === applicationServerKeyStr; - if (sameKey) { - // Subscription didn't change + const vapidKey = getVapidKey(); + if (vapidKey) { + const { applicationServerKey } = subscription.options; + const vapidKeyStr = urlBase64ToUint8Array(vapidKey).toString(); + const applicationServerKeyStr = new Uint8Array( + applicationServerKey, + ).toString(); + const sameKey = vapidKeyStr === applicationServerKeyStr; + if (sameKey) { + // Subscription didn't change + } else { + // Subscription changed + console.error('🔔 Subscription changed', { + vapidKeyStr, + applicationServerKeyStr, + sameKey, + }); + // Unsubscribe since backend doesn't have a subscription + await subscription.unsubscribe(); + throw new Error('Subscription key and vapid key changed'); + } } else { - // Subscription changed - console.error('🔔 Subscription changed', { - vapidKeyStr, - applicationServerKeyStr, - sameKey, - }); - // Unsubscribe since backend doesn't have a subscription - await subscription.unsubscribe(); - throw new Error('Subscription key and vapid key changed'); + console.warn('No vapidKey found'); } } @@ -206,7 +210,7 @@ export async function updateSubscription({ data, policy }) { } } else { // User is not subscribed - const { vapidKey } = getCurrentAccount(); + const vapidKey = getVapidKey(); if (!vapidKey) throw new Error('No server key found'); subscription = await registration.pushManager.subscribe({ userVisibleOnly: true, diff --git a/src/utils/relationships.js b/src/utils/relationships.js index eb80da5f..868a8b97 100644 --- a/src/utils/relationships.js +++ b/src/utils/relationships.js @@ -1,11 +1,11 @@ import { api } from './api'; -import store from './store'; +import { getCurrentAccountID } from './store-utils'; export async function fetchRelationships(accounts, relationshipsMap = {}) { if (!accounts?.length) return; const { masto } = api(); - const currentAccount = store.session.get('currentAccount'); + const currentAccount = getCurrentAccountID(); const uniqueAccountIds = accounts.reduce((acc, a) => { // 1. Ignore duplicate accounts // 2. Ignore accounts that are already inside relationshipsMap diff --git a/src/utils/shorten-number.js b/src/utils/shorten-number.js new file mode 100644 index 00000000..5dc32350 --- /dev/null +++ b/src/utils/shorten-number.js @@ -0,0 +1,12 @@ +import { i18n } from '@lingui/core'; + +export default function shortenNumber(num) { + try { + return i18n.number(num, { + notation: 'compact', + roundingMode: 'floor', + }); + } catch (e) { + return num; + } +} diff --git a/src/utils/shorten-number.jsx b/src/utils/shorten-number.jsx deleted file mode 100644 index 0960ec05..00000000 --- a/src/utils/shorten-number.jsx +++ /dev/null @@ -1,5 +0,0 @@ -const { locale } = Intl.NumberFormat().resolvedOptions(); -const shortenNumber = Intl.NumberFormat(locale, { - notation: 'compact', -}).format; -export default shortenNumber; diff --git a/src/utils/show-compose.js b/src/utils/show-compose.js new file mode 100644 index 00000000..9e2b7bde --- /dev/null +++ b/src/utils/show-compose.js @@ -0,0 +1,29 @@ +import { t, Trans } from '@lingui/macro'; + +import openOSK from './open-osk'; +import showToast from './show-toast'; +import states from './states'; + +const TOAST_DURATION = 5_000; // 5 seconds + +export default function showCompose(opts) { + if (!opts) opts = true; + + if (states.showCompose) { + if (states.composerState.minimized) { + showToast({ + duration: TOAST_DURATION, + text: t`A draft post is currently minimized. Post or discard it before creating a new one.`, + }); + } else { + showToast({ + duration: TOAST_DURATION, + text: t`A post is currently open. Post or discard it before creating a new one.`, + }); + } + return; + } + + openOSK(); + states.showCompose = opts; +} diff --git a/src/utils/states.js b/src/utils/states.js index 569f1a0d..efb650f5 100644 --- a/src/utils/states.js +++ b/src/utils/states.js @@ -40,6 +40,7 @@ const states = proxy({ statusReply: {}, accounts: {}, routeNotification: null, + composerState: {}, // Modals showCompose: false, showSettings: false, @@ -67,7 +68,9 @@ const states = proxy({ contentTranslationAutoInline: false, shortcutSettingsCloudImportExport: false, mediaAltGenerator: false, + composerGIFPicker: false, cloakMode: false, + groupedNotificationsAlpha: false, }, }); @@ -99,7 +102,11 @@ export function initStates() { store.account.get('settings-shortcutSettingsCloudImportExport') ?? false; states.settings.mediaAltGenerator = store.account.get('settings-mediaAltGenerator') ?? false; + states.settings.composerGIFPicker = + store.account.get('settings-composerGIFPicker') ?? false; states.settings.cloakMode = store.account.get('settings-cloakMode') ?? false; + states.settings.groupedNotificationsAlpha = + store.account.get('settings-groupedNotificationsAlpha') ?? false; } subscribeKey(states, 'notificationsLast', (v) => { @@ -140,12 +147,18 @@ subscribe(states, (changes) => { if (path.join('.') === 'settings.mediaAltGenerator') { store.account.set('settings-mediaAltGenerator', !!value); } + if (path.join('.') === 'settings.composerGIFPicker') { + store.account.set('settings-composerGIFPicker', !!value); + } if (path?.[0] === 'shortcuts') { store.account.set('shortcuts', states.shortcuts); } if (path.join('.') === 'settings.cloakMode') { store.account.set('settings-cloakMode', !!value); } + if (path.join('.') === 'settings.groupedNotificationsAlpha') { + store.account.set('settings-groupedNotificationsAlpha', !!value); + } } }); @@ -288,6 +301,16 @@ export function unfurlStatus(status, instance) { unfurlMastodonLink(currentInstance, a.href).then((result) => { if (!result) return; if (!sKey) return; + if (result?.id === status.id) { + // Unfurled post is the post itself??? + // Scenario: + // 1. Post with [URL] + // 2. Unfurl [URL], API returns the same post that contains [URL] + // 3. 💥 Recursive quote posts 💥 + // Note: Mastodon search doesn't return posts that contains [URL], it's actually used to *resolve* the URL + // But some non-Mastodon servers, their search API will eventually search posts that contains [URL] and return them + return; + } if (!Array.isArray(states.statusQuotes[sKey])) { states.statusQuotes[sKey] = []; } diff --git a/src/utils/status-peek.jsx b/src/utils/status-peek.js similarity index 96% rename from src/utils/status-peek.jsx rename to src/utils/status-peek.js index 9a9388e4..cd2ba645 100644 --- a/src/utils/status-peek.jsx +++ b/src/utils/status-peek.js @@ -26,7 +26,7 @@ function statusPeek(status) { video: '📹', audio: '🎵', unknown: '', - }[m.type] || ''), + })[m.type] || '', ) .join(''); } diff --git a/src/utils/store-utils.js b/src/utils/store-utils.js index 7746a080..02fd38b2 100644 --- a/src/utils/store-utils.js +++ b/src/utils/store-utils.js @@ -2,6 +2,7 @@ import store from './store'; export function getAccount(id) { const accounts = store.local.getJSON('accounts') || []; + if (!id) return accounts[0]; return accounts.find((a) => a.info.id === id) || accounts[0]; } @@ -15,13 +16,40 @@ export function getAccountByInstance(instance) { return accounts.find((a) => a.instanceURL === instance); } +const standaloneMQ = window.matchMedia('(display-mode: standalone)'); + +export function getCurrentAccountID() { + try { + const id = store.session.get('currentAccount'); + if (id) return id; + } catch (e) {} + if (standaloneMQ.matches) { + try { + const id = store.local.get('currentAccount'); + if (id) return id; + } catch (e) {} + } + return null; +} + +export function setCurrentAccountID(id) { + try { + store.session.set('currentAccount', id); + } catch (e) {} + if (standaloneMQ.matches) { + try { + store.local.set('currentAccount', id); + } catch (e) {} + } +} + export function getCurrentAccount() { if (!window.__IGNORE_GET_ACCOUNT_ERROR__) { // Track down getCurrentAccount() calls before account-based states are initialized console.error('getCurrentAccount() called before states are initialized'); if (import.meta.env.DEV) console.trace(); } - const currentAccount = store.session.get('currentAccount'); + const currentAccount = getCurrentAccountID(); const account = getAccount(currentAccount); return account; } @@ -47,7 +75,7 @@ export function saveAccount(account) { accounts.push(account); } store.local.setJSON('accounts', accounts); - store.session.set('currentAccount', account.info.id); + setCurrentAccountID(account.info.id); } export function updateAccount(accountInfo) { @@ -79,10 +107,24 @@ export function getCurrentInstance() { return (currentInstance = instances[instance]); } catch (e) { console.error(e); - alert(`Failed to load instance configuration. Please try again.\n\n${e}`); + // alert(`Failed to load instance configuration. Please try again.\n\n${e}`); // Temporary fix for corrupted data - store.local.del('instances'); - location.reload(); + // store.local.del('instances'); + // location.reload(); + return {}; + } +} + +let currentNodeInfo = null; +export function getCurrentNodeInfo() { + if (currentNodeInfo) return currentNodeInfo; + try { + const account = getCurrentAccount(); + const nodeInfos = store.local.getJSON('nodeInfos') || {}; + const instanceURL = account.instanceURL.toLowerCase(); + return (currentNodeInfo = nodeInfos[instanceURL] || {}); + } catch (e) { + console.error(e); return {}; } } @@ -90,18 +132,14 @@ export function getCurrentInstance() { // Massage these instance configurations to match the Mastodon API // - Pleroma function getInstanceConfiguration(instance) { - const { - configuration, - maxMediaAttachments, - maxTootChars, - pleroma, - pollLimits, - } = instance; + const { configuration, maxMediaAttachments, maxTootChars, pollLimits } = + instance; const statuses = configuration?.statuses || {}; if (maxMediaAttachments) { statuses.maxMediaAttachments ??= maxMediaAttachments; } + if (maxTootChars) { statuses.maxCharacters ??= maxTootChars; } @@ -125,3 +163,15 @@ export function getCurrentInstanceConfiguration() { const instance = getCurrentInstance(); return getInstanceConfiguration(instance); } + +export function getVapidKey() { + // Vapid key has moved from account to instance config + const config = getCurrentInstanceConfiguration(); + const vapidKey = config?.vapid?.publicKey || config?.vapid?.public_key; + return vapidKey || getCurrentAccount()?.vapidKey; +} + +export function isMediaFirstInstance() { + const instance = getCurrentInstance(); + return /pixelfed/i.test(instance?.version); +} diff --git a/src/utils/store.js b/src/utils/store.js index fb587b11..19309885 100644 --- a/src/utils/store.js +++ b/src/utils/store.js @@ -1,5 +1,9 @@ +import Cookies from 'js-cookie'; + import { getCurrentAccountNS } from './store-utils'; +const cookies = Cookies.withAttributes({ sameSite: 'strict', secure: true }); + const local = { get: (key) => { try { @@ -86,6 +90,38 @@ const session = { }, }; +// Session secure cookie +const cookie = { + get: (key) => cookies.get(key), + set: (key, value) => cookies.set(key, value), + del: (key) => cookies.remove(key), +}; + +// Cookie with sessionStorage fallback +const sessionCookie = { + get: (key) => { + if (navigator.cookieEnabled) { + return cookie.get(key); + } else { + return session.get(key); + } + }, + set: (key, value) => { + if (navigator.cookieEnabled) { + return cookie.set(key, value); + } else { + return session.set(key, value); + } + }, + del: (key) => { + if (navigator.cookieEnabled) { + return cookie.del(key); + } else { + return session.del(key); + } + }, +}; + // Store with account namespace (id@domain.tld) <- uses id, not username const account = { get: (key) => { @@ -118,4 +154,4 @@ const account = { }, }; -export default { local, session, account }; +export default { local, session, sessionCookie, cookie, account }; diff --git a/src/utils/supports.js b/src/utils/supports.js index 02b1a496..e240037a 100644 --- a/src/utils/supports.js +++ b/src/utils/supports.js @@ -2,21 +2,63 @@ import { satisfies } from 'compare-versions'; import features from '../data/features.json'; -import { getCurrentInstance } from './store-utils'; +import { getCurrentInstance, getCurrentNodeInfo } from './store-utils'; + +// Non-semver(?) UA string detection +const containPixelfed = /pixelfed/i; +const notContainPixelfed = /^(?!.*pixelfed).*$/i; +const containPleroma = /pleroma/i; +const containAkkoma = /akkoma/i; +const containGTS = /gotosocial/i; +const platformFeatures = { + '@mastodon/lists': notContainPixelfed, + '@mastodon/filters': notContainPixelfed, + '@mastodon/mentions': notContainPixelfed, + '@mastodon/trending-hashtags': notContainPixelfed, + '@mastodon/trending-links': notContainPixelfed, + '@mastodon/post-bookmark': notContainPixelfed, + '@mastodon/post-edit': notContainPixelfed, + '@mastodon/profile-edit': notContainPixelfed, + '@mastodon/profile-private-note': notContainPixelfed, + '@pixelfed/trending': containPixelfed, + '@pixelfed/home-include-reblogs': containPixelfed, + '@pixelfed/global-feed': containPixelfed, + '@pleroma/local-visibility-post': containPleroma, + '@akkoma/local-visibility-post': containAkkoma, +}; const supportsCache = {}; function supports(feature) { try { - const { version, domain } = getCurrentInstance(); + let { version, domain } = getCurrentInstance(); + let softwareName = getCurrentNodeInfo()?.software?.name || 'mastodon'; + + if (softwareName === 'hometown') { + // Hometown is a Mastodon fork and inherits its features + softwareName = 'mastodon'; + } + const key = `${domain}-${feature}`; if (supportsCache[key]) return supportsCache[key]; + + if (platformFeatures[feature]) { + return (supportsCache[key] = platformFeatures[feature].test(version)); + } + const range = features[feature]; if (!range) return false; - return (supportsCache[key] = satisfies(version, range, { - includePrerelease: true, - loose: true, - })); + + // '@mastodon/blah' => 'mastodon' + const featureSoftware = feature.match(/^@([a-z]+)\//)[1]; + + const doesSoftwareMatch = featureSoftware === softwareName.toLowerCase(); + return (supportsCache[key] = + doesSoftwareMatch && + satisfies(version, range, { + includePrerelease: true, + loose: true, + })); } catch (e) { return false; } diff --git a/src/utils/timeline-utils.jsx b/src/utils/timeline-utils.js similarity index 74% rename from src/utils/timeline-utils.jsx rename to src/utils/timeline-utils.js index d41be58e..af902766 100644 --- a/src/utils/timeline-utils.jsx +++ b/src/utils/timeline-utils.js @@ -4,6 +4,7 @@ import pmem from './pmem'; import { fetchRelationships } from './relationships'; import states, { saveStatus, statusKey } from './states'; import store from './store'; +import supports from './supports'; export function groupBoosts(values) { let newValues = []; @@ -149,6 +150,7 @@ export function groupContext(items, instance) { const newItems = []; const appliedContextIndices = []; + const inReplyToIds = []; items.forEach((item) => { if (item.reblog) { newItems.push(item); @@ -176,36 +178,106 @@ export function groupContext(items, instance) { } } + // PREPARE FOR REPLY HINTS if (item.inReplyToId && item.inReplyToAccountId !== item.account.id) { const sKey = statusKey(item.id, instance); if (!states.statusReply[sKey]) { // If it's a reply and not a thread - queueMicrotask(async () => { - try { - const { masto } = api({ instance }); - // const replyToStatus = await masto.v1.statuses - // .$select(item.inReplyToId) - // .fetch(); - const replyToStatus = await fetchStatus(item.inReplyToId, masto); - saveStatus(replyToStatus, instance, { - skipThreading: true, - skipUnfurling: true, - }); - states.statusReply[sKey] = { - id: replyToStatus.id, - instance, - }; - } catch (e) { - // Silently fail - console.error(e); - } + inReplyToIds.push({ + sKey, + inReplyToId: item.inReplyToId, }); + // queueMicrotask(async () => { + // try { + // const { masto } = api({ instance }); + // // const replyToStatus = await masto.v1.statuses + // // .$select(item.inReplyToId) + // // .fetch(); + // const replyToStatus = await fetchStatus(item.inReplyToId, masto); + // saveStatus(replyToStatus, instance, { + // skipThreading: true, + // skipUnfurling: true, + // }); + // states.statusReply[sKey] = { + // id: replyToStatus.id, + // instance, + // }; + // } catch (e) { + // // Silently fail + // console.error(e); + // } + // }); } } newItems.push(item); }); + // FETCH AND SHOW REPLY HINTS + if (inReplyToIds?.length) { + queueMicrotask(() => { + const { masto } = api({ instance }); + console.log('REPLYHINT', inReplyToIds); + + // Fallback if batch fetch fails or returns nothing or not supported + async function fallbackFetch() { + for (let i = 0; i < inReplyToIds.length; i++) { + const { sKey, inReplyToId } = inReplyToIds[i]; + try { + const replyToStatus = await fetchStatus(inReplyToId, masto); + saveStatus(replyToStatus, instance, { + skipThreading: true, + }); + states.statusReply[sKey] = { + id: replyToStatus.id, + instance, + }; + // Pause 1s + await new Promise((resolve) => setTimeout(resolve, 1000)); + } catch (e) { + // Silently fail + console.error(e); + } + } + } + + if (supports('@mastodon/fetch-multiple-statuses')) { + // This is batch fetching yooo, woot + // Limit 20, returns 422 if exceeded https://github.com/mastodon/mastodon/pull/27871 + const ids = inReplyToIds.map(({ inReplyToId }) => inReplyToId); + (async () => { + try { + const replyToStatuses = await masto.v1.statuses.list({ id: ids }); + if (replyToStatuses?.length) { + for (const replyToStatus of replyToStatuses) { + saveStatus(replyToStatus, instance, { + skipThreading: true, + }); + const sKey = inReplyToIds.find( + ({ inReplyToId }) => inReplyToId === replyToStatus.id, + )?.sKey; + if (sKey) { + states.statusReply[sKey] = { + id: replyToStatus.id, + instance, + }; + } + } + } else { + fallbackFetch(); + } + } catch (e) { + // Silently fail + console.error(e); + fallbackFetch(); + } + })(); + } else { + fallbackFetch(); + } + }); + } + return newItems; } diff --git a/src/utils/unfurl-link.jsx b/src/utils/unfurl-link.js similarity index 76% rename from src/utils/unfurl-link.jsx rename to src/utils/unfurl-link.js index 6d596559..c4063a02 100644 --- a/src/utils/unfurl-link.jsx +++ b/src/utils/unfurl-link.js @@ -9,6 +9,20 @@ export const throttle = pThrottle({ interval: 1000, }); +const STATUS_ID_REGEXES = [ + /\/@[^@\/]+@?[^\/]+?\/(\d+)$/i, // Mastodon + /\/notice\/(\w+)$/i, // Pleroma +]; +function getStatusID(path) { + for (let i = 0; i < STATUS_ID_REGEXES.length; i++) { + const statusMatchID = path.match(STATUS_ID_REGEXES[i])?.[1]; + if (statusMatchID) { + return statusMatchID; + } + } + return null; +} + const denylistDomains = /(twitter|github)\.com/i; const failedUnfurls = {}; function _unfurlMastodonLink(instance, url) { @@ -45,19 +59,15 @@ function _unfurlMastodonLink(instance, url) { theURL = `https://${finalURL}`; } - let urlObj; - try { - urlObj = new URL(theURL); - } catch (e) { - return; - } + const urlObj = URL.parse(theURL); + if (!urlObj) return; const domain = urlObj.hostname; const path = urlObj.pathname; - // Regex /:username/:id, where username = @username or @username@domain, id = number - const statusRegex = /\/@([^@\/]+)@?([^\/]+)?\/(\d+)$/i; - const statusMatch = statusRegex.exec(path); - if (statusMatch) { - const id = statusMatch[3]; + // Regex /:username/:id, where username = @username or @username@domain, id = post ID + let statusMatchID = getStatusID(path); + + if (statusMatchID) { + const id = statusMatchID; const { masto } = api({ instance: domain }); remoteInstanceFetch = masto.v1.statuses .$select(id) @@ -83,15 +93,23 @@ function _unfurlMastodonLink(instance, url) { limit: 1, }) .then((results) => { - if (results.statuses.length > 0) { - const status = results.statuses[0]; - return { - status, - instance, - }; - } else { - throw new Error('No results'); + const { statuses } = results; + if (statuses.length > 0) { + // Filter out statuses that has content that contains the URL, in-case-sensitive + const theStatuses = statuses.filter( + (status) => + !status.content?.toLowerCase().includes(theURL.toLowerCase()), + ); + + if (theStatuses.length === 1) { + return { + status: theStatuses[0], + instance, + }; + } + // If there are multiple statuses, give up, something is wrong } + throw new Error('No results'); }); function handleFulfill(result) { diff --git a/src/utils/useWindowSize.js b/src/utils/useWindowSize.js new file mode 100644 index 00000000..0907cee7 --- /dev/null +++ b/src/utils/useWindowSize.js @@ -0,0 +1,28 @@ +import { useLayoutEffect, useState } from 'preact/hooks'; + +export default function useWindowSize() { + const [size, setSize] = useState({ + width: null, + height: null, + }); + + useLayoutEffect(() => { + const handleResize = () => { + setSize({ + width: window.innerWidth, + height: window.innerHeight, + }); + }; + + handleResize(); + window.addEventListener('resize', handleResize, { + passive: true, + }); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }, []); + + return size; +} diff --git a/src/utils/visibility-icons-map.js b/src/utils/visibility-icons-map.js index 867c2dba..835f7406 100644 --- a/src/utils/visibility-icons-map.js +++ b/src/utils/visibility-icons-map.js @@ -3,4 +3,5 @@ export default { unlisted: 'group', private: 'lock', direct: 'message', + local: 'building', }; diff --git a/vite.config.js b/vite.config.js index 83925733..d39a49f5 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,17 +1,24 @@ -import preact from '@preact/preset-vite'; import { execSync } from 'child_process'; import fs from 'fs'; import { resolve } from 'path'; + +import { lingui } from '@lingui/vite-plugin'; +import preact from '@preact/preset-vite'; +import { SondaRollupPlugin } from 'sonda'; import { uid } from 'uid/single'; import { defineConfig, loadEnv, splitVendorChunkPlugin } from 'vite'; import generateFile from 'vite-plugin-generate-file'; import htmlPlugin from 'vite-plugin-html-config'; import { VitePWA } from 'vite-plugin-pwa'; import removeConsole from 'vite-plugin-remove-console'; +import { run } from 'vite-plugin-run'; + +import { ALL_LOCALES } from './src/locales'; const allowedEnvPrefixes = ['VITE_', 'PHANPY_']; const { NODE_ENV } = process.env; const { + PHANPY_WEBSITE: WEBSITE, PHANPY_CLIENT_NAME: CLIENT_NAME, PHANPY_APP_ERROR_LOGGING: ERROR_LOGGING, } = loadEnv('production', process.cwd(), allowedEnvPrefixes); @@ -51,13 +58,49 @@ export default defineConfig({ preprocessorMaxWorkers: 1, }, plugins: [ - preact(), + preact({ + // Force use Babel instead of ESBuild due to this change: https://github.com/preactjs/preset-vite/pull/114 + // Else, a bug will happen with importing variables from import.meta.env + babel: { + plugins: ['macros'], + }, + }), + lingui(), + run({ + silent: false, + input: [ + { + name: 'messages:extract:clean', + run: ['npm', 'run', 'messages:extract:clean'], + pattern: 'src/**/*.{js,jsx,ts,tsx}', + }, + // { + // name: 'update-catalogs', + // run: ['node', 'scripts/catalogs.js'], + // pattern: 'src/locales/*.po', + // }, + ], + }), splitVendorChunkPlugin(), removeConsole({ includes: ['log', 'debug', 'info', 'warn', 'error'], }), htmlPlugin({ headScripts: ERROR_LOGGING ? [rollbarCode] : [], + links: [ + ...ALL_LOCALES.map((lang) => ({ + rel: 'alternate', + hreflang: lang, + // *Fully-qualified* URLs + href: `${WEBSITE}/?lang=${lang}`, + })), + // https://developers.google.com/search/docs/specialty/international/localized-versions#xdefault + { + rel: 'alternate', + hreflang: 'x-default', + href: `${WEBSITE}`, + }, + ], }), generateFile([ { @@ -107,9 +150,14 @@ export default defineConfig({ type: 'module', }, }), + SondaRollupPlugin({ + detailed: true, + brotli: true, + }), ], build: { sourcemap: true, + cssCodeSplit: false, rollupOptions: { treeshake: false, input: { @@ -118,13 +166,17 @@ export default defineConfig({ }, output: { manualChunks: { - 'intl-segmenter-polyfill': ['@formatjs/intl-segmenter/polyfill'], + // 'intl-segmenter-polyfill': ['@formatjs/intl-segmenter/polyfill'], + 'tinyld-light': ['tinyld/light'], }, chunkFileNames: (chunkInfo) => { const { facadeModuleId } = chunkInfo; if (facadeModuleId && facadeModuleId.includes('icon')) { return 'assets/icons/[name]-[hash].js'; } + if (facadeModuleId && facadeModuleId.includes('locales')) { + return 'assets/locales/[name]-[hash].js'; + } return 'assets/[name]-[hash].js'; }, },