Compare commits

..

95 commits

Author SHA1 Message Date
teutat3s 3354bdd606
feat: add fly.toml 2024-09-26 11:59:24 +02:00
patak-dev 1335bbfcd5 chore: release v0.15.1 2024-09-26 09:13:34 +02:00
Joaquín Sánchez 44074ff1a3
fix: change page reload and account switch logic (#2975) 2024-09-25 15:55:32 +00:00
Joaquín Sánchez 54344acf4b
fix: prevent reloading page (#2973) 2024-09-23 16:08:02 +00:00
Daniel Roe fe58a2b522
chore: release v0.15.0 2024-09-23 15:02:26 +01:00
Joaquín Sánchez 4d95c17e86
fix: add new service worker (#2971) 2024-09-23 12:45:46 +00:00
renovate[bot] 2f4ee35561
chore(deps): update dependency vitest to v2.1.1 (#2960)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 11:29:55 +00:00
Joaquín Sánchez 10076be909
fix: top level await (chrome 129) (#2970) 2024-09-23 10:53:10 +00:00
renovate[bot] 7ab2f16f35
chore(deps): update dependency eslint to ^9.11.0 (#2968)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 09:27:38 +00:00
renovate[bot] 7a1ed8f9a2
chore(deps): update pnpm to v9.11.0 (#2969)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 09:27:34 +00:00
TAKAHASHI Shuuji 744c1784c3
fix: fix invalid permissions-policy value for fullscreen (#2941) 2024-09-19 12:00:39 +00:00
renovate[bot] 7aabe17860
fix(deps): update dependency prosemirror-highlight to ^0.9.0 (#2961)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-19 11:59:36 +00:00
renovate[bot] bc324ec8ae
chore(deps): update dependency nuxt-component-meta to v0.8.2 (#2958)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-19 11:59:01 +00:00
renovate[bot] ff9c025126
chore(deps): update devdependencies (#2959)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-19 11:58:15 +00:00
Joaquín Sánchez 662a8aec69
chore: cleanup ModalContainer.vue (#2956) 2024-09-14 03:56:25 +00:00
Joaquín Sánchez 01ffb1a3e1
fix(ui): composer dialog layout broken (#2955) 2024-09-12 09:36:43 +00:00
Joaquín Sánchez 4061075dde
fix(ui): generate only one thread composer in PublishWidgetList and provide it to each widget (#2953) 2024-09-11 20:37:14 +00:00
Joaquín Sánchez dbf743afd9
fix(ui): bind attributes to PublishWidgetList list (#2952) 2024-09-11 15:43:30 +00:00
renovate[bot] dd6fab86ee
chore(deps): update dependency nuxt to ^3.13.1 (#2946)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-09-11 14:37:59 +00:00
renovate[bot] 344ec56da0
chore(deps): update all non-major dependencies (#2949)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 11:29:26 +00:00
Daniel Roe 672e8a9a24
fix: bump unstorage and address type issues (#2951) 2024-09-11 11:20:26 +00:00
renovate[bot] 201ab3b13a
chore(deps): update dependency eslint to ^9.10.0 (#2948)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-09 11:24:14 +00:00
renovate[bot] 6fd288dcc1
fix(deps): update dependency @vueuse/motion to v2.2.5 (#2947)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-09 11:23:00 +00:00
Joaquín Sánchez 41eb84416a
fix(ui): add loading indicator (#2769) 2024-09-07 09:37:01 +00:00
Shinigami e477cd8ee2
chore: use script setup lang=ts everywhere (#2944) 2024-09-07 09:30:43 +00:00
Shinigami 4caa63e84f
perf: reduce timeline limit on slow connection (#2945) 2024-09-07 09:27:01 +00:00
Shinigami 3054667050
chore: unify script setup lang order (#2943) 2024-09-07 07:38:18 +00:00
renovate[bot] b2102732cf
chore(deps): update devdependencies (#2939)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-02 06:56:23 +00:00
renovate[bot] 7141a75544
chore(deps): update pnpm to v9.9.0 (#2940)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-02 06:55:39 +00:00
Sho Sakuma 926f7769c2
fix(i18n): Fix redundant Japanese translation (#2938) 2024-09-02 06:54:39 +00:00
Duy 538fadc908
feat(i18n): Update vi-VN.json (#2937) 2024-08-31 13:53:17 +00:00
renovate[bot] f605d96836
chore(deps): update devdependencies (#2931)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 03:20:57 +00:00
renovate[bot] 0c1dd1cb7b
chore(deps): update lint (#2932)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 02:56:38 +00:00
Ao Ito 53f3d44f21
refactor: remove redundant imports (#2927) 2024-08-24 12:16:10 +00:00
renovate[bot] faae7e32f4
fix(deps): update dependencies (major) (#2921)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-22 10:28:35 +00:00
renovate[bot] b8efd67e83
fix(deps): update vueuse to v11 (major) (#2922)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-08-20 15:51:05 +00:00
renovate[bot] 7de45d154e
chore(deps): update all non-major dependencies (#2920)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 02:54:17 +00:00
renovate[bot] 1353f62ebb
chore(deps): update dependency prettier to ^3.3.3 (#2919)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 02:51:09 +00:00
renovate[bot] e22555b581
fix(deps): update dependencies (major) (#2559)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-08-16 15:49:14 +00:00
renovate[bot] 55372aa530
chore(deps): update devdependencies (#2782)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-08-16 15:20:49 +00:00
renovate[bot] efa8a89f92
chore(deps): update dependency eslint to v9 (#2785)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-16 14:58:14 +00:00
renovate[bot] 0fba07e6e5
chore(deps): update dependency @antfu/eslint-config to ^2.19.0 (#2726)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-08-16 14:52:08 +00:00
renovate[bot] 23f82d3296
fix(deps): update dependencies (#2526)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-08-16 14:35:44 +00:00
Ao Ito bd7fd961d0
feat: add custom metadata type for PageMeta (#2907) 2024-08-16 14:33:39 +00:00
renovate[bot] 1a8d365779
chore(deps): update dependency vitest to v2.0.5 (#2911)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-16 14:29:39 +00:00
Daniel Roe 335ae78a67
chore: bump and patch dependencies to augment vue (#2918) 2024-08-16 13:31:43 +00:00
renovate[bot] bdf5a18b4d
chore(deps): update pnpm to v9.7.0 (#2917)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-13 15:52:58 +00:00
Chris​‌​‮ ‬Hayes‌​​​ 71369c4c78
fix(ui): profile name gets cut off by roles (#2915) 2024-08-13 15:45:09 +00:00
TAKAHASHI Shuuji 1d62c2640e
fix(ui): adjust z-index of Embedded Media Player and sticky header (#2848) 2024-08-10 14:55:05 +00:00
TAKAHASHI Shuuji d79add2ddb
fix(ui): fix z-index of horizontal line between statuses (#2778) 2024-08-10 14:54:01 +00:00
KaKi87 f15c8a18d0
feat(i18n): Update French translations (#1839)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-08-09 06:06:09 +00:00
TAKAHASHI Shuuji 879f0d8648
feat(ui): overlap multiple account icons in notification (#2869) 2024-08-09 06:00:19 +00:00
Lixou 20ac0d5066
fix(ui): change apple app status bar style (#2903)
Co-authored-by: Joaquín Sánchez <userquin@gmail.com>
2024-08-09 05:58:49 +00:00
Chris​‌​‮ ‬Hayes‌​​​ fb7f2b5a8e
docs(contributing): update node and pnpm version (#2913) 2024-08-09 05:57:18 +00:00
renovate[bot] 4a3218dae3
chore(deps): update dependency vitest to v2.0.4 (#2909)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-29 02:19:26 +00:00
renovate[bot] 21f7a029fa
chore(deps): update pnpm to v9.6.0 (#2908)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-22 06:38:20 +00:00
renovate[bot] f8b4f700e7
chore(deps): update dependency vitest to v2 (#2906)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-16 04:06:56 +00:00
renovate[bot] d2aee8fc37
chore(deps): update pnpm to v9.5.0 (#2905)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-08 07:31:58 +00:00
renovate[bot] 2144f2484b
chore(deps): update amannn/action-semantic-pull-request action to v5.5.3 (#2898)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-01 02:43:41 +00:00
Ediz Baha 83de5da08a
fix(i18n): Update tr-TR.json (#2894) 2024-06-25 00:24:54 +00:00
renovate[bot] 108db77a9d
chore(deps): update all non-major dependencies (#2783)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-24 03:11:24 +00:00
renovate[bot] 385f218e7b
fix(deps): update dependency @vueuse/motion to v2.2.3 (#2881)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-24 03:05:38 +00:00
renovate[bot] f224acb4e2
chore(deps): update docker/build-push-action action to v6 (#2892)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-24 03:00:20 +00:00
Sebastian Di Luzio 0d84257ac0
docs: add crab.bumscode.com to list of community elk deployments (#2887) 2024-06-17 17:34:59 +00:00
renovate[bot] b4886fa135
chore(deps): update dependency vitest to v1.6.0 (#2822)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-14 08:19:42 +00:00
Daniel Roe 16a09cd959
fix: use correct meta attribute for twitter info 2024-06-10 22:20:54 +01:00
TAKAHASHI Shuuji 97ce2fc819
feat: keyboard status navigation with j/k (#2739) 2024-05-31 10:35:04 +00:00
Lixou 9a864e8bcb
chore(deps): Update masto.js (#2876) 2024-05-30 19:40:17 +00:00
Francesco ca34d3df70
feat(i18n): Update it-IT locale (#2879) 2024-05-30 01:16:21 +00:00
Joaquín Sánchez 2c889a39b8
chore: fix invalid html markup in SettingsToggleItem (#2810) 2024-05-29 03:42:58 +00:00
Joaquín Sánchez 7047968cfc
feat(a11y): add semantic markup to language settings (#2812) 2024-05-29 03:42:54 +00:00
Shinigami 0b207c3bb5
chore: set package-manager-strict to false (#2873) 2024-05-28 14:23:45 +02:00
Shinigami 6f7efc9f32
fix(i18n): update de-DE (#2874) 2024-05-28 00:21:00 +00:00
renovate[bot] a88d51b60b
chore(deps): update pnpm to v9 (#2841)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-27 23:27:17 +00:00
Lefteris T 65557fab5e
feat(i18n): added greek translation (#2831)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-05-11 15:26:21 +00:00
Valtteri Laitinen 09b5dd6ac9
feat(i18n): update Finnish localization (#2867) 2024-05-09 10:15:01 +00:00
Alex a1b5cbc12e
feat(i18n): update zh-CN translations (#2868) 2024-05-08 11:34:34 +00:00
Xabi bd950af9cf
feat(i18n): update eu-ES.json (#2866) 2024-05-07 23:58:56 +00:00
lazzzis 04befd6138
feat(i18n): update zh-CN.json (#2865) 2024-05-05 18:25:29 +00:00
Kevin Pliester 0b53dfc89f
feat(i18n): update German translations (#2861) 2024-05-03 20:32:24 +00:00
lzh c39b60d448
feat(i18n): update zh-CN.json (#2858) 2024-05-02 19:50:19 +00:00
lzh 50481af19e
docs(i18n): Update dev path in the contribution guide (#2857) 2024-05-02 13:40:15 +00:00
Dohány Tamás 6c2e5849ef
feat(i18n): update hu-HU.json (#2856) 2024-05-02 13:40:08 +00:00
pt 9496ffc3e6
feat(i18n): update uk-UA.json (#2854) 2024-04-28 08:18:37 +00:00
pt ab92fd696c
feat(i18n): update uk-UA.json (#2852) 2024-04-26 04:39:42 +00:00
Francesco 7d4b84fda8
feat(i18n): Update it-IT locale (#2851) 2024-04-25 03:27:21 +00:00
Xabi a67b3efde2
feat(i18n): update eu-ES.json (#2840) 2024-04-24 03:17:03 +00:00
Duy e546e665d8
feat(i18n): Update vi-VN.json (#2838) 2024-04-24 03:17:00 +00:00
Emanuel Pina d1ae45de14
feat(i18n): update pt-PT translation (#2850) 2024-04-24 03:16:55 +00:00
Joaquín Sánchez 8ad05dfd47
feat(i18n): add open image preview dialog spanish translation (#2839) 2024-04-22 15:38:06 +00:00
TAKAHASHI Shuuji 09cae9f924
fix(ui): fix publish dialog layout (#2842) 2024-04-22 12:54:20 +00:00
TAKAHASHI Shuuji bd8cfc7b57
fix(i18n,a11y): fix missing or incorrect translations in aria-label strings (#2837) 2024-04-21 10:26:35 +00:00
Joaquín Sánchez 77f0e2c2f8
feat(a11y): add semantic markup to preference settings (#2811) 2024-04-21 07:14:12 +00:00
lazzzis 57ff04853b
fix(ui): show custom emoji in spoiler text (#2836) 2024-04-21 05:25:40 +00:00
Joaquín Sánchez 1eaaa6ce9a
feat(i18n): add manage lists spanish translation (#2832) 2024-04-18 19:39:08 +00:00
140 changed files with 15447 additions and 11326 deletions

View file

@ -40,7 +40,6 @@
"groupName": "lint", "groupName": "lint",
"matchPackageNames": [ "matchPackageNames": [
"@antfu/eslint-config", "@antfu/eslint-config",
"@types/prettier",
"eslint", "eslint",
"prettier" "prettier"
] ]

View file

@ -35,7 +35,7 @@ jobs:
username: ${{ github.actor }} username: ${{ github.actor }}
password: ${{ github.token }} password: ${{ github.token }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v5 uses: docker/build-push-action@v6
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64

View file

@ -19,6 +19,6 @@ jobs:
name: Semantic Pull Request name: Semantic Pull Request
steps: steps:
- name: Validate PR title - name: Validate PR title
uses: amannn/action-semantic-pull-request@v5.4.0 uses: amannn/action-semantic-pull-request@v5.5.3
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

1
.npmrc
View file

@ -1,3 +1,4 @@
shamefully-hoist=true shamefully-hoist=true
shell-emulator=true shell-emulator=true
ignore-workspace-root-check=true ignore-workspace-root-check=true
package-manager-strict=false

View file

@ -18,10 +18,10 @@ To develop and test the Elk package:
1. Fork the Elk repository to your own GitHub account and then clone it to your local device. 1. Fork the Elk repository to your own GitHub account and then clone it to your local device.
2. Ensure using the latest Node.js (16.x). 2. Ensure using the latest Node.js (20.x).
If you have [nvm](https://github.com/nvm-sh/nvm), you can run `nvm i` to install the required version. If you have [nvm](https://github.com/nvm-sh/nvm), you can run `nvm i` to install the required version.
3. The package manager used to install and link dependencies must be [pnpm](https://pnpm.io/) v7. To use it you must first enable [Corepack](https://github.com/nodejs/corepack) by running `corepack enable`. (Note: on Linux in a standard Node 16+ environment, you should follow the instructions to install via Node's `corepack` rather than using the `curl` command) 3. The package manager used to install and link dependencies must be [pnpm](https://pnpm.io/) v9. To use it you must first enable [Corepack](https://github.com/nodejs/corepack) by running `corepack enable`. (Note: on Linux in a standard Node 20+ environment, you should follow the instructions to install via Node's `corepack` rather than using the `curl` command)
4. Check out a branch where you can work and commit your changes: 4. Check out a branch where you can work and commit your changes:
```shell ```shell
@ -97,7 +97,7 @@ You can check the current [translation status](https://docs.elk.zone/docs/guide/
If you are updating a translation in your local environment, you can run the following commands to check the status: If you are updating a translation in your local environment, you can run the following commands to check the status:
- from root folder: `nr prepare-translation-status` - from root folder: `nr prepare-translation-status`
- change to `docs` folder and run docs dev server `nr dev` - change to `docs` folder and run docs dev server `nr dev`
- open `http://localhost:3000/docs/guide/contributing#translation-status` in your browser - open `http://localhost:3000/guide/contributing#translation-status` in your browser
### Adding a new language ### Adding a new language

View file

@ -67,6 +67,7 @@ These are known deployments using Elk as an alternative Web client for Mastodon
- [elk.mstdn.ca](https://elk.mstdn.ca) - Use Elk for the `mstdn.ca` Server - [elk.mstdn.ca](https://elk.mstdn.ca) - Use Elk for the `mstdn.ca` Server
- [elk.mastodonapp.uk](https://elk.mastodonapp.uk) - Use Elk for the `mastodonapp.uk` Server - [elk.mastodonapp.uk](https://elk.mastodonapp.uk) - Use Elk for the `mastodonapp.uk` Server
- [elk.bolha.us](https://elk.bolha.us) - Use Elk for the `bolha.us` Server - [elk.bolha.us](https://elk.bolha.us) - Use Elk for the `bolha.us` Server
- [crab.bumscode.com](https://crab.bumscode.com) - Use [crab](https://github.com/maybeanerd/crab) - a soft fork of Elk - for the `bumscode.com` Server
> **Note**: Community deployments are **NOT** maintained by the Elk team. It may not be synced with Elk's source code. Please do your own research about the host servers before using them. > **Note**: Community deployments are **NOT** maintained by the Elk team. It may not be synced with Elk's source code. Please do your own research about the host servers before using them.

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
defineOptions({ defineOptions({

View file

@ -189,7 +189,6 @@ async function copyAccountName() {
<div flex="~ col gap1" pt2> <div flex="~ col gap1" pt2>
<div flex gap2 items-center flex-wrap> <div flex gap2 items-center flex-wrap>
<AccountDisplayName :account="account" font-bold sm:text-2xl text-xl /> <AccountDisplayName :account="account" font-bold sm:text-2xl text-xl />
<AccountRolesIndicator v-if="account.roles?.length" :account="account" />
<AccountLockIndicator v-if="account.locked" show-label /> <AccountLockIndicator v-if="account.locked" show-label />
<AccountBotIndicator v-if="account.bot" show-label /> <AccountBotIndicator v-if="account.bot" show-label />
</div> </div>
@ -202,6 +201,9 @@ async function copyAccountName() {
</button> </button>
</CommonTooltip> </CommonTooltip>
</div> </div>
<div self-start mt-1>
<AccountRolesIndicator v-if="account.roles?.length" :account="account" />
</div>
</div> </div>
</div> </div>
<label <label

View file

@ -12,7 +12,7 @@ const relationship = useRelationship(account)
<div v-show="relationship" flex="~ col gap2" rounded min-w-90 max-w-120 z-100 overflow-hidden p-4> <div v-show="relationship" flex="~ col gap2" rounded min-w-90 max-w-120 z-100 overflow-hidden p-4>
<div flex="~ gap2" items-center> <div flex="~ gap2" items-center>
<NuxtLink :to="getAccountRoute(account)" flex-auto rounded-full hover:bg-active transition-100 pe5 me-a> <NuxtLink :to="getAccountRoute(account)" flex-auto rounded-full hover:bg-active transition-100 pe5 me-a>
<AccountInfo :account="account" /> <AccountInfo :account="account" :hover-card="true" />
</NuxtLink> </NuxtLink>
<AccountFollowButton text-sm :account="account" :relationship="relationship" /> <AccountFollowButton text-sm :account="account" :relationship="relationship" />
</div> </div>

View file

@ -16,18 +16,20 @@ const { account, as = 'div' } = defineProps<{
<!-- TODO: Make this work for both buttons and links --> <!-- TODO: Make this work for both buttons and links -->
<!-- This is sometimes (like in the sidebar) used directly as a button, and sometimes, like in follow notifications, as a link. I think this component may need a second refactor that either lets an implementation pass in a link or an action and adapt to what's passed in, or the implementations need to be updated to wrap in the action they want to take and this be just the layout for these items --> <!-- This is sometimes (like in the sidebar) used directly as a button, and sometimes, like in follow notifications, as a link. I think this component may need a second refactor that either lets an implementation pass in a link or an action and adapt to what's passed in, or the implementations need to be updated to wrap in the action they want to take and this be just the layout for these items -->
<template> <template>
<component :is="as" flex gap-3 v-bind="$attrs"> <component :is="as" flex items-center gap-3 v-bind="$attrs">
<AccountHoverWrapper :disabled="!hoverCard" :account="account"> <AccountHoverWrapper :disabled="!hoverCard" :account="account">
<AccountBigAvatar :account="account" shrink-0 :square="square" /> <AccountBigAvatar :account="account" shrink-0 :square="square" />
</AccountHoverWrapper> </AccountHoverWrapper>
<div flex="~ col" shrink pt-1 h-full overflow-hidden justify-center leading-none select-none> <div flex="~ col" shrink h-full overflow-hidden justify-center leading-none select-none p-1>
<div flex="~" gap-2> <div flex="~" gap-2>
<AccountDisplayName :account="account" font-bold line-clamp-1 ws-pre-wrap break-all text-lg /> <AccountDisplayName :account="account" font-bold line-clamp-1 ws-pre-wrap break-all text-lg />
<AccountRolesIndicator v-if="account.roles?.length" :account="account" :limit="1" />
<AccountLockIndicator v-if="account.locked" text-xs /> <AccountLockIndicator v-if="account.locked" text-xs />
<AccountBotIndicator v-if="account.bot" text-xs /> <AccountBotIndicator v-if="account.bot" text-xs />
</div> </div>
<AccountHandle :account="account" text-secondary-light /> <AccountHandle :account="account" text-secondary-light />
<div self-start mt-1>
<AccountRolesIndicator v-if="account.roles?.length" :account="account" :limit="1" />
</div>
</div> </div>
</component> </component>
</template> </template>

View file

@ -56,7 +56,7 @@ async function removeUserNote() {
<template> <template>
<CommonDropdown :eager-mount="command"> <CommonDropdown :eager-mount="command">
<button flex gap-1 items-center w-full rounded op75 hover="op100 text-purple" group aria-label="More actions"> <button flex gap-1 items-center w-full rounded op75 hover="op100 text-purple" group :aria-label="t('actions.more')">
<div rounded-5 p2 elk-group-hover="bg-purple/10"> <div rounded-5 p2 elk-group-hover="bg-purple/10">
<div i-ri:more-2-fill /> <div i-ri:more-2-fill />
</div> </div>

View file

@ -38,12 +38,14 @@ onMounted(() => {
announce(t('a11y.loading_page')) announce(t('a11y.loading_page'))
}) })
router.afterEach((to, from) => { router.afterEach((to, from) => {
from && setTimeout(() => { if (from) {
setTimeout(() => {
requestAnimationFrame(() => { requestAnimationFrame(() => {
const title = document.title.trim().split('|') const title = document.title.trim().split('|')
announce(t('a11y.route_loaded', [title[0]])) announce(t('a11y.route_loaded', [title[0]]))
}) })
}, 512) }, 512)
}
}) })
}) })
</script> </script>

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import type { ResolvedCommand } from '~/composables/command' import type { ResolvedCommand } from '~/composables/command'
const { const {

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
const emit = defineEmits<{ const emit = defineEmits<{
(event: 'close'): void (event: 'close'): void
}>() }>()

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import type { Boundaries } from 'vue-advanced-cropper' import type { Boundaries } from 'vue-advanced-cropper'
import { Cropper } from 'vue-advanced-cropper' import { Cropper } from 'vue-advanced-cropper'
import 'vue-advanced-cropper/dist/style.css' import 'vue-advanced-cropper/dist/style.css'

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import { fileOpen } from 'browser-fs-access' import { fileOpen } from 'browser-fs-access'
import type { FileWithHandle } from 'browser-fs-access' import type { FileWithHandle } from 'browser-fs-access'

View file

@ -3,7 +3,6 @@
import { DynamicScroller } from 'vue-virtual-scroller' import { DynamicScroller } from 'vue-virtual-scroller'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css' import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
import type { UnwrapRef } from 'vue'
const { const {
paginator, paginator,
@ -33,7 +32,7 @@ defineSlots<{
newer: U // newer is undefined when index === 0 newer: U // newer is undefined when index === 0
}) => void }) => void
items: (props: { items: (props: {
items: UnwrapRef<U[]> items: U[]
}) => void }) => void
updater: (props: { updater: (props: {
number: number number: number
@ -74,7 +73,7 @@ defineExpose({ createEntry, removeEntry, updateEntry })
<template> <template>
<div> <div>
<slot v-if="prevItems.length" name="updater" v-bind="{ number: prevItems.length, update }" /> <slot v-if="prevItems.length" name="updater" v-bind="{ number: prevItems.length, update }" />
<slot name="items" :items="items"> <slot name="items" :items="items as U[]">
<template v-if="virtualScroller"> <template v-if="virtualScroller">
<DynamicScroller <DynamicScroller
v-slot="{ item, active, index }" v-slot="{ item, active, index }"

View file

@ -20,7 +20,7 @@ const tabs = computed(() => {
}) })
function toValidName(option: string) { function toValidName(option: string) {
return option.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-') return option.toLowerCase().replace(/[^a-z0-9]/gi, '-')
} }
useCommands(() => command useCommands(() => command

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
const { const {

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
import sparkline from '@fnando/sparkline' import sparkline from '@fnando/sparkline'

View file

@ -8,7 +8,7 @@ const vAutoFocus = (el: HTMLElement) => el.focus()
<template> <template>
<div my-8 px-3 sm:px-8 md:max-w-200 flex="~ col gap-4" relative> <div my-8 px-3 sm:px-8 md:max-w-200 flex="~ col gap-4" relative>
<button v-auto-focus type="button" btn-action-icon absolute top--8 right-0 m1 aria-label="Close" @click="emit('close')"> <button v-auto-focus type="button" btn-action-icon absolute top--8 right-0 m1 :aria-label="$t('action.close')" @click="emit('close')">
<span i-ri:close-line /> <span i-ri:close-line />
</button> </button>

View file

@ -15,9 +15,10 @@ const isRemoved = ref(false)
async function edit() { async function edit() {
try { try {
isRemoved.value if (isRemoved.value)
? await client.v1.lists.$select(list).accounts.create({ accountIds: [account.id] }) await client.v1.lists.$select(list).accounts.create({ accountIds: [account.id] })
: await client.v1.lists.$select(list).accounts.remove({ accountIds: [account.id] }) else
await client.v1.lists.$select(list).accounts.remove({ accountIds: [account.id] })
isRemoved.value = !isRemoved.value isRemoved.value = !isRemoved.value
} }
catch (err) { catch (err) {

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
const { userId } = defineProps<{ const { userId } = defineProps<{
userId: string userId: string
}>() }>()

View file

@ -32,14 +32,14 @@ const shortcutItemGroups = computed<ShortcutItemGroup[]>(() => [
description: t('magic_keys.groups.navigation.shortcut_help'), description: t('magic_keys.groups.navigation.shortcut_help'),
shortcut: { keys: ['?'], isSequence: false }, shortcut: { keys: ['?'], isSequence: false },
}, },
// { {
// description: t('magic_keys.groups.navigation.next_status'), description: t('magic_keys.groups.navigation.next_status'),
// shortcut: { keys: ['j'], isSequence: false }, shortcut: { keys: ['j'], isSequence: false },
// }, },
// { {
// description: t('magic_keys.groups.navigation.previous_status'), description: t('magic_keys.groups.navigation.previous_status'),
// shortcut: { keys: ['k'], isSequence: false }, shortcut: { keys: ['k'], isSequence: false },
// }, },
{ {
description: t('magic_keys.groups.navigation.go_to_search'), description: t('magic_keys.groups.navigation.go_to_search'),
shortcut: { keys: ['/'], isSequence: false }, shortcut: { keys: ['/'], isSequence: false },

View file

@ -27,7 +27,7 @@ const containerClass = computed(() => {
<template> <template>
<div ref="container" :class="containerClass"> <div ref="container" :class="containerClass">
<div <div
sticky top-0 z10 sticky top-0 z-20
pt="[env(safe-area-inset-top,0)]" pt="[env(safe-area-inset-top,0)]"
bg="[rgba(var(--rgb-bg-base),0.7)]" bg="[rgba(var(--rgb-bg-base),0.7)]"
class="native:lg:w-[calc(100vw-5rem)] native:xl:w-[calc(135%+(100vw-1200px)/2)]" class="native:lg:w-[calc(100vw-5rem)] native:xl:w-[calc(135%+(100vw-1200px)/2)]"

View file

@ -1,6 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ConfirmDialogChoice, ConfirmDialogOptions } from '~/types' import type { ConfirmDialogChoice, ConfirmDialogOptions } from '~/types'
import DurationPicker from '~/components/modal/DurationPicker.vue'
const props = defineProps<ConfirmDialogOptions>() const props = defineProps<ConfirmDialogOptions>()

View file

@ -63,13 +63,14 @@ function handleFavouritedBoostedByClose() {
</ModalDialog> </ModalDialog>
<ModalDialog <ModalDialog
v-model="isPublishDialogOpen" v-model="isPublishDialogOpen"
max-w-180 flex max-w-180 flex w-full
@close="handlePublishClose" @close="handlePublishClose"
> >
<!-- This `w-0` style is used to avoid overflow problems in flex layoutsso don't remove it unless you know what you're doing -->
<PublishWidgetList <PublishWidgetList
v-if="dialogDraftKey" v-if="dialogDraftKey"
:draft-key="dialogDraftKey" expanded flex-1 w-0 :draft-key="dialogDraftKey"
expanded
class="flex-1"
@published="handlePublished" @published="handlePublished"
/> />
</ModalDialog> </ModalDialog>

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap' import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
export interface Props { export interface Props {

View file

@ -39,14 +39,14 @@ onUnmounted(() => locked.value = false)
<template> <template>
<div relative h-full w-full flex pt-12 @click="onClick"> <div relative h-full w-full flex pt-12 @click="onClick">
<button <button
v-if="hasNext" pointer-events-auto btn-action-icon bg="black/20" :aria-label="$t('action.previous')" v-if="hasNext" pointer-events-auto btn-action-icon bg="black/20" :aria-label="$t('action.next')"
hover:bg="black/40" dark:bg="white/30" dark-hover:bg="white/20" absolute top="1/2" right-1 z5 hover:bg="black/40" dark:bg="white/30" dark-hover:bg="white/20" absolute top="1/2" right-1 z5
:title="$t('action.next')" @click="next" :title="$t('action.next')" @click="next"
> >
<div i-ri:arrow-right-s-line text-white /> <div i-ri:arrow-right-s-line text-white />
</button> </button>
<button <button
v-if="hasPrev" pointer-events-auto btn-action-icon bg="black/20" aria-label="action.next" v-if="hasPrev" pointer-events-auto btn-action-icon bg="black/20" :aria-label="$t('action.prev')"
hover:bg="black/40" dark:bg="white/30" dark:hover-bg="white/20" absolute top="1/2" left-1 z5 hover:bg="black/40" dark:bg="white/30" dark:hover-bg="white/20" absolute top="1/2" left-1 z5
:title="$t('action.prev')" @click="prev" :title="$t('action.prev')" @click="prev"
> >
@ -71,7 +71,7 @@ onUnmounted(() => locked.value = false)
<div absolute top-0 w-full flex justify-end> <div absolute top-0 w-full flex justify-end>
<button <button
btn-action-icon bg="black/30" aria-label="action.close" hover:bg="black/40" dark:bg="white/30" btn-action-icon bg="black/30" :aria-label="$t('action.close')" hover:bg="black/40" dark:bg="white/30"
dark:hover-bg="white/20" pointer-events-auto shrink-0 @click="emit('close')" dark:hover-bg="white/20" pointer-events-auto shrink-0 @click="emit('close')"
> >
<div i-ri:close-line text-white /> <div i-ri:close-line text-white />

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import { invoke } from '@vueuse/core' import { invoke } from '@vueuse/core'
const modelValue = defineModel<boolean>({ required: true }) const modelValue = defineModel<boolean>({ required: true })

View file

@ -8,6 +8,31 @@ const { notifications } = useNotifications()
const useStarFavoriteIcon = usePreferences('useStarFavoriteIcon') const useStarFavoriteIcon = usePreferences('useStarFavoriteIcon')
const lastAccessedNotificationRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE, '') const lastAccessedNotificationRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE, '')
const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '') const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '')
const notificationsLink = computed(() => {
const hydrated = isHydrated.value
const user = currentUser.value
const lastRoute = lastAccessedNotificationRoute.value
if (!hydrated || !user || !lastRoute) {
return '/notifications'
}
return `/notifications/${lastRoute}`
})
const exploreLink = computed(() => {
const hydrated = isHydrated.value
const server = currentServer.value
let lastRoute = lastAccessedExploreRoute.value
if (!hydrated) {
return '/explore'
}
if (lastRoute.length) {
lastRoute = `/${lastRoute}`
}
return server ? `/${server}/explore${lastRoute}` : `/explore${lastRoute}`
})
</script> </script>
<template> <template>
@ -16,7 +41,7 @@ const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLO
<div class="spacer" shrink xl:hidden /> <div class="spacer" shrink xl:hidden />
<NavSideItem :text="$t('nav.home')" to="/home" icon="i-ri:home-5-line" user-only :command="command" /> <NavSideItem :text="$t('nav.home')" to="/home" icon="i-ri:home-5-line" user-only :command="command" />
<NavSideItem :text="$t('nav.notifications')" :to="`/notifications/${lastAccessedNotificationRoute}`" icon="i-ri:notification-4-line" user-only :command="command"> <NavSideItem :text="$t('nav.notifications')" :to="notificationsLink" icon="i-ri:notification-4-line" user-only :command="command">
<template #icon> <template #icon>
<div flex relative> <div flex relative>
<div class="i-ri:notification-4-line" text-xl /> <div class="i-ri:notification-4-line" text-xl />
@ -34,7 +59,7 @@ const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLO
<NavSideItem :text="$t('action.compose')" to="/compose" icon="i-ri:quill-pen-line" user-only :command="command" /> <NavSideItem :text="$t('action.compose')" to="/compose" icon="i-ri:quill-pen-line" user-only :command="command" />
<div class="spacer" shrink hidden sm:block /> <div class="spacer" shrink hidden sm:block />
<NavSideItem :text="$t('nav.explore')" :to="isHydrated ? `/${currentServer}/explore/${lastAccessedExploreRoute}` : `/explore/${lastAccessedExploreRoute}`" icon="i-ri:compass-3-line" :command="command" /> <NavSideItem :text="$t('nav.explore')" :to="exploreLink" icon="i-ri:compass-3-line" :command="command" />
<NavSideItem :text="$t('nav.local')" :to="isHydrated ? `/${currentServer}/public/local` : '/public/local'" icon="i-ri:group-2-line " :command="command" /> <NavSideItem :text="$t('nav.local')" :to="isHydrated ? `/${currentServer}/public/local` : '/public/local'" icon="i-ri:group-2-line " :command="command" />
<NavSideItem :text="$t('nav.federated')" :to="isHydrated ? `/${currentServer}/public` : '/public'" icon="i-ri:earth-line" :command="command" /> <NavSideItem :text="$t('nav.federated')" :to="isHydrated ? `/${currentServer}/public` : '/public'" icon="i-ri:earth-line" :command="command" />
<NavSideItem :text="$t('nav.lists')" :to="isHydrated ? `/${currentServer}/lists` : '/lists'" icon="i-ri:list-check" user-only :command="command" /> <NavSideItem :text="$t('nav.lists')" :to="isHydrated ? `/${currentServer}/lists` : '/lists'" icon="i-ri:list-check" user-only :command="command" />

View file

@ -1,4 +1,4 @@
<script setup> <script setup lang="ts">
const { busy, oauth, singleInstanceServer } = useSignIn() const { busy, oauth, singleInstanceServer } = useSignIn()
</script> </script>

View file

@ -10,7 +10,7 @@ defineModel<boolean>()
<button <button
flex items-center place-content-center h-full flex-1 class="select-none" flex items-center place-content-center h-full flex-1 class="select-none"
:class="show ? '!text-primary' : ''" :class="show ? '!text-primary' : ''"
aria-label="More menu" :aria-label="$t('nav.more_menu')"
@click="toggleVisible" @click="toggleVisible"
> >
<span :class="show ? 'i-ri:close-fill' : 'i-ri:more-fill'" /> <span :class="show ? 'i-ri:close-fill' : 'i-ri:more-fill'" />

View file

@ -27,16 +27,16 @@ const likes = computed(() => group.likes.filter(i => i.favourite && !i.reblog))
{{ $t('notification.reblogged_post') }} {{ $t('notification.reblogged_post') }}
</div> </div>
</div> </div>
<div v-if="likes.length" flex="~ gap-1"> <div v-if="likes.length" flex="~ gap-1 wrap">
<div :class="useStarFavoriteIcon ? 'i-ri:star-line color-yellow' : 'i-ri:heart-line color-red'" text-xl me-2 /> <div :class="useStarFavoriteIcon ? 'i-ri:star-line color-yellow' : 'i-ri:heart-line color-red'" text-xl me-2 />
<template v-for="i, idx of likes" :key="idx"> <template v-for="i, idx of likes" :key="idx">
<AccountHoverWrapper :account="i.account"> <AccountHoverWrapper :account="i.account" relative me--4 border="2 bg-base" rounded-full hover:z-1 focus-within:z-1>
<NuxtLink :to="getAccountRoute(i.account)"> <NuxtLink :to="getAccountRoute(i.account)">
<AccountAvatar text-primary font-bold :account="i.account" class="h-1.5em w-1.5em" /> <AccountAvatar text-primary font-bold :account="i.account" class="h-1.5em w-1.5em" />
</NuxtLink> </NuxtLink>
</AccountHoverWrapper> </AccountHoverWrapper>
</template> </template>
<div ms1> <div ms-4>
{{ $t('notification.favourited_post') }} {{ $t('notification.favourited_post') }}
</div> </div>
</div> </div>

View file

@ -17,7 +17,7 @@ const modelValue = defineModel<boolean>({ required: true })
text-red-600 dark:text-red-400 text-red-600 dark:text-red-400
border="~ base rounded red-600 dark:red-400" border="~ base rounded red-600 dark:red-400"
> >
<head id="notification-failed" flex justify-between> <header id="notification-failed" flex justify-between>
<div flex items-center gap-x-2 font-bold> <div flex items-center gap-x-2 font-bold>
<div aria-hidden="true" i-ri:error-warning-fill /> <div aria-hidden="true" i-ri:error-warning-fill />
<p>{{ title ?? $t('settings.notifications.push_notifications.subscription_error.title') }}</p> <p>{{ title ?? $t('settings.notifications.push_notifications.subscription_error.title') }}</p>
@ -32,7 +32,7 @@ const modelValue = defineModel<boolean>({ required: true })
<span aria-hidden="true" w="1.75em" h="1.75em" i-ri:close-line /> <span aria-hidden="true" w="1.75em" h="1.75em" i-ri:close-line />
</button> </button>
</CommonTooltip> </CommonTooltip>
</head> </header>
<p>{{ message }}</p> <p>{{ message }}</p>
<p py-2> <p py-2>
<i18n-t keypath="settings.notifications.push_notifications.subscription_error.error_hint"> <i18n-t keypath="settings.notifications.push_notifications.subscription_error.error_hint">

View file

@ -32,9 +32,10 @@ async function openEmojiPicker() {
picker.value = new Picker({ picker.value = new Picker({
data: () => dataPromise, data: () => dataPromise,
onEmojiSelect({ native, src, alt, name }: any) { onEmojiSelect({ native, src, alt, name }: any) {
native if (native)
? emit('select', native) emit('select', native)
: emit('selectCustom', { src, alt, 'data-emoji-id': name }) else
emit('selectCustom', { src, alt, 'data-emoji-id': name })
}, },
set: 'twitter', set: 'twitter',
theme: colorMode, theme: colorMode,

View file

@ -5,6 +5,7 @@ import type { mastodon } from 'masto'
import type { DraftItem } from '~/types' import type { DraftItem } from '~/types'
const { const {
threadComposer,
draftKey, draftKey,
draftItemIndex, draftItemIndex,
expanded = false, expanded = false,
@ -15,6 +16,7 @@ const {
draftKey: string draftKey: string
draftItemIndex: number draftItemIndex: number
initial?: () => DraftItem initial?: () => DraftItem
threadComposer?: ReturnType<typeof useThreadComposer>
placeholder?: string placeholder?: string
inReplyToId?: string inReplyToId?: string
inReplyToVisibility?: mastodon.v1.StatusVisibility inReplyToVisibility?: mastodon.v1.StatusVisibility
@ -28,7 +30,7 @@ const emit = defineEmits<{
const { t } = useI18n() const { t } = useI18n()
const { threadItems, threadIsActive, publishThread } = useThreadComposer(draftKey) const { threadItems, threadIsActive, publishThread } = threadComposer ?? useThreadComposer(draftKey)
const draft = computed({ const draft = computed({
get: () => threadItems.value[draftItemIndex], get: () => threadItems.value[draftItemIndex],
@ -85,11 +87,13 @@ function trimPollOptions() {
const trimmedOptions = draft.value.params.poll!.options.slice(0, indexLastNonEmpty + 1) const trimmedOptions = draft.value.params.poll!.options.slice(0, indexLastNonEmpty + 1)
if (currentInstance.value?.configuration if (currentInstance.value?.configuration
&& trimmedOptions.length >= currentInstance.value?.configuration?.polls.maxOptions) && trimmedOptions.length >= currentInstance.value?.configuration?.polls.maxOptions) {
draft.value.params.poll!.options = trimmedOptions draft.value.params.poll!.options = trimmedOptions
else }
else {
draft.value.params.poll!.options = [...trimmedOptions, ''] draft.value.params.poll!.options = [...trimmedOptions, '']
} }
}
function editPollOptionDraft(event: Event, index: number) { function editPollOptionDraft(event: Event, index: number) {
draft.value.params.poll!.options = Object.assign(draft.value.params.poll!.options.slice(), { [index]: (event.target as HTMLInputElement).value }) draft.value.params.poll!.options = Object.assign(draft.value.params.poll!.options.slice(), { [index]: (event.target as HTMLInputElement).value })
@ -135,10 +139,10 @@ const characterCount = computed(() => {
let length = stringLength(text) let length = stringLength(text)
// taken from https://github.com/mastodon/mastodon/blob/07f8b4d1b19f734d04e69daeb4c3421ef9767aac/app/lib/text_formatter.rb // taken from https://github.com/mastodon/mastodon/blob/07f8b4d1b19f734d04e69daeb4c3421ef9767aac/app/lib/text_formatter.rb
const linkRegex = /(https?:\/\/(www\.)?|xmpp:)\S+/g const linkRegex = /(https?:\/\/|xmpp:)\S+/g
// taken from https://github.com/mastodon/mastodon/blob/af578e/app/javascript/mastodon/features/compose/util/counter.js // taken from https://github.com/mastodon/mastodon/blob/af578e/app/javascript/mastodon/features/compose/util/counter.js
const countableMentionRegex = /(^|[^/\w])@(([a-z0-9_]+)@[a-z0-9.-]+[a-z0-9]+)/ig const countableMentionRegex = /(^|[^/\w])@((\w+)@[a-z0-9.-]+[a-z0-9])/gi
// maximum of 23 chars per link // maximum of 23 chars per link
// https://github.com/elk-zone/elk/issues/1651 // https://github.com/elk-zone/elk/issues/1651

View file

@ -20,9 +20,8 @@ const {
dialogLabelledBy?: string dialogLabelledBy?: string
}>() }>()
const threadItems = computed(() => const threadComposer = useThreadComposer(draftKey, initial)
useThreadComposer(draftKey, initial).threadItems.value, const threadItems = computed(() => threadComposer.threadItems.value)
)
onDeactivated(() => { onDeactivated(() => {
clearEmptyDrafts() clearEmptyDrafts()
@ -37,6 +36,8 @@ function isFirstItem(index: number) {
<template v-if="isHydrated && currentUser"> <template v-if="isHydrated && currentUser">
<PublishWidget <PublishWidget
v-for="(_, index) in threadItems" :key="`${draftKey}-${index}`" v-for="(_, index) in threadItems" :key="`${draftKey}-${index}`"
v-bind="$attrs"
:thread-composer="threadComposer"
:draft-key="draftKey" :draft-key="draftKey"
:draft-item-index="index" :draft-item-index="index"
:expanded="isFirstItem(index) ? expanded : true" :expanded="isFirstItem(index) ? expanded : true"

View file

@ -97,7 +97,7 @@ function resetModal() {
<b text-primary>@{{ account.acct }}</b> <b text-primary>@{{ account.acct }}</b>
</i18n-t> </i18n-t>
</h2> </h2>
<button ref="dismissButton" btn-action-icon absolute top--8 right-0 m1 aria-label="Close" @click="emit('close')"> <button ref="dismissButton" btn-action-icon absolute top--8 right-0 m1 :aria-label="$t('action.close')" @click="emit('close')">
<div i-ri:close-line /> <div i-ri:close-line />
</button> </button>

View file

@ -90,7 +90,7 @@ function activate() {
</button> </button>
</div> </div>
<!-- Results --> <!-- Results -->
<div left-0 top-11 absolute w-full z10 group-focus-within="pointer-events-auto visible" invisible pointer-events-none> <div left-0 top-11 absolute w-full z-10 group-focus-within="pointer-events-auto visible" invisible pointer-events-none>
<div w-full bg-base border="~ base" rounded-3 max-h-100 overflow-auto py2> <div w-full bg-base border="~ base" rounded-3 max-h-100 overflow-auto py2>
<span v-if="query.trim().length === 0" block text-center text-sm text-secondary> <span v-if="query.trim().length === 0" block text-center text-sm text-secondary>
{{ t('search.search_desc') }} {{ t('search.search_desc') }}

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import { DEFAULT_FONT_SIZE } from '~/constants' import { DEFAULT_FONT_SIZE } from '~/constants'
import type { FontSize } from '~/composables/settings' import type { FontSize } from '~/composables/settings'

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
const props = defineProps<{ const props = defineProps<{
text?: string text?: string
content?: string content?: string

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import type { ComputedRef } from 'vue' import type { ComputedRef } from 'vue'
import type { LocaleObject } from '@nuxtjs/i18n' import type { LocaleObject } from '@nuxtjs/i18n'

View file

@ -15,34 +15,34 @@ const { disabled = false } = defineProps<{
:disabled="disabled" :disabled="disabled"
:class="disabled ? 'opacity-50 cursor-not-allowed' : ''" :class="disabled ? 'opacity-50 cursor-not-allowed' : ''"
> >
<div <span
w-full flex px5 py3 md:gap2 gap4 items-center w-full flex px5 py3 md:gap2 gap4 items-center
transition-250 transition-250
:class="disabled ? '' : 'group-hover:bg-active'" :class="disabled ? '' : 'group-hover:bg-active'"
group-focus-visible:ring="2 current" group-focus-visible:ring="2 current"
> >
<div flex-1 flex items-center md:gap2 gap4> <span flex-1 flex items-center md:gap2 gap4>
<div <span
v-if="icon" flex items-center justify-center v-if="icon" flex items-center justify-center
flex-shrink-0 flex-shrink-0
:class="$slots.description ? 'w-12 h-12' : ''" :class="$slots.description ? 'w-12 h-12' : ''"
> >
<slot name="icon"> <slot name="icon">
<div v-if="icon" :class="icon" md:text-size-inherit text-xl /> <span v-if="icon" :class="icon" md:text-size-inherit text-xl />
</slot> </slot>
</div> </span>
<div space-y-1> <span space-y-1>
<p :class="checked ? 'text-base' : 'text-secondary'"> <span :class="checked ? 'text-base' : 'text-secondary'">
<slot> <slot>
<span>{{ text }}</span> <span>{{ text }}</span>
</slot> </slot>
</p> </span>
<p v-if="$slots.description" text-sm text-secondary> <span v-if="$slots.description" block text-sm text-secondary>
<slot name="description" /> <slot name="description" />
</p> </span>
</div> </span>
</div> </span>
<div text-lg :class="checked ? 'i-ri-checkbox-line text-primary' : 'i-ri-checkbox-blank-line text-secondary'" /> <span text-lg :class="checked ? 'i-ri-checkbox-line text-primary' : 'i-ri-checkbox-blank-line text-secondary'" />
</div> </span>
</button> </button>
</template> </template>

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import ISO6391 from 'iso-639-1' import ISO6391 from 'iso-639-1'
const supportedTranslationLanguages = ISO6391.getLanguages([...supportedTranslationCodes]) const supportedTranslationLanguages = ISO6391.getLanguages([...supportedTranslationCodes])

View file

@ -83,7 +83,8 @@ useIntersectionObserver(video, (entries) => {
entries.forEach((entry) => { entries.forEach((entry) => {
if (entry.intersectionRatio <= 0.75) { if (entry.intersectionRatio <= 0.75) {
ready && !video.value?.paused && video.value?.pause() if (ready && !video.value?.paused)
video.value?.pause()
} }
else { else {
video.value?.play().then(() => { video.value?.play().then(() => {
@ -211,7 +212,7 @@ watch(shouldLoadAttachment, () => {
rounded-lg rounded-lg
h-full h-full
w-full w-full
aria-label="Open image preview dialog" :aria-label="$t('action.open_image_preview_dialog')"
relative relative
@click="!shouldLoadAttachment ? loadAttachment() : openMediaPreview(attachments ? attachments : [attachment], attachments?.indexOf(attachment) || 0)" @click="!shouldLoadAttachment ? loadAttachment() : openMediaPreview(attachments ? attachments : [attachment], attachments?.indexOf(attachment) || 0)"
> >

View file

@ -72,7 +72,7 @@ const forceShow = ref(false)
<template> <template>
<StatusLink :status="status" :hover="hover"> <StatusLink :status="status" :hover="hover">
<!-- Upper border --> <!-- Upper border -->
<div :h="showUpperBorder ? '1px' : '0'" w-auto bg-border mb-1 /> <div :h="showUpperBorder ? '1px' : '0'" w-auto bg-border mb-1 z--1 />
<slot name="meta"> <slot name="meta">
<!-- Line connecting to previous status --> <!-- Line connecting to previous status -->

View file

@ -44,7 +44,9 @@ const allowEmbeddedMedia = computed(() => status.card?.html && embeddedMediaPref
<StatusBody v-if="(!isFiltered && isSensitiveNonSpoiler) || hideAllMedia" :status="status" :newer="newer" :with-action="!isDetails" :class="isDetails ? 'text-xl' : ''" /> <StatusBody v-if="(!isFiltered && isSensitiveNonSpoiler) || hideAllMedia" :status="status" :newer="newer" :with-action="!isDetails" :class="isDetails ? 'text-xl' : ''" />
<StatusSpoiler :enabled="hasSpoilerOrSensitiveMedia || isFiltered" :filter="isFiltered" :sensitive-non-spoiler="isSensitiveNonSpoiler || hideAllMedia" :is-d-m="isDM"> <StatusSpoiler :enabled="hasSpoilerOrSensitiveMedia || isFiltered" :filter="isFiltered" :sensitive-non-spoiler="isSensitiveNonSpoiler || hideAllMedia" :is-d-m="isDM">
<template v-if="spoilerTextPresent" #spoiler> <template v-if="spoilerTextPresent" #spoiler>
<p>{{ status.spoilerText }}</p> <p>
<ContentRich :content="status.spoilerText" :emojis="status.emojis" :markdown="false" />
</p>
</template> </template>
<template v-else-if="filterPhrase" #spoiler> <template v-else-if="filterPhrase" #spoiler>
<p>{{ `${$t('status.filter_hidden_phrase')}: ${filterPhrase}` }}</p> <p>{{ `${$t('status.filter_hidden_phrase')}: ${filterPhrase}` }}</p>

View file

@ -28,7 +28,7 @@ const card = ref(status.card)
absolute absolute
w-full w-full
h-full h-full
z-100 z-10
rounded-lg rounded-lg
style="background: linear-gradient(black, rgba(0,0,0,0.5), transparent, transparent, rgba(0,0,0,0.20))" style="background: linear-gradient(black, rgba(0,0,0,0.5), transparent, transparent, rgba(0,0,0,0.20))"
> >

View file

@ -26,7 +26,7 @@ async function toggleFollowTag() {
emit('change') emit('change')
} }
catch (error) { catch {
// eslint-disable-next-line vue/no-mutating-props // eslint-disable-next-line vue/no-mutating-props
tag.following = previousFollowingState tag.following = previousFollowingState
} }

View file

@ -1,7 +1,11 @@
<script setup lang="ts"> <script setup lang="ts">
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
const paginator = useMastoClient().v1.timelines.home.list({ limit: 30 }) const { isSupported, effectiveType } = useNetwork()
const isSlow = computed(() => isSupported.value && effectiveType.value && ['slow-2g', '2g', '3g'].includes(effectiveType.value))
const limit = computed(() => isSlow.value ? 10 : 30)
const paginator = useMastoClient().v1.timelines.home.list({ limit: limit.value })
const stream = useStreaming(client => client.user.subscribe()) const stream = useStreaming(client => client.user.subscribe())
function reorderAndFilter(items: mastodon.v1.Status[]) { function reorderAndFilter(items: mastodon.v1.Status[]) {
return reorderedTimeline(items, 'home') return reorderedTimeline(items, 'home')

View file

@ -1,6 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { getEmojiMatchesInText } from '@iconify/utils/lib/emoji/replace/find' import { getEmojiMatchesInText } from '@iconify/utils/lib/emoji/replace/find'
import CommonScrollIntoView from '../common/CommonScrollIntoView.vue'
import type { CustomEmoji, Emoji } from '~/composables/tiptap/suggestion' import type { CustomEmoji, Emoji } from '~/composables/tiptap/suggestion'
import { isCustomEmoji } from '~/composables/tiptap/suggestion' import { isCustomEmoji } from '~/composables/tiptap/suggestion'
import { emojiFilename, emojiPrefix, emojiRegEx } from '~~/config/emojis' import { emojiFilename, emojiPrefix, emojiRegEx } from '~~/config/emojis'

View file

@ -1,6 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
import CommonScrollIntoView from '../common/CommonScrollIntoView.vue'
import type { CommandHandler } from '~/composables/command' import type { CommandHandler } from '~/composables/command'
const { items, command } = defineProps<{ const { items, command } = defineProps<{

View file

@ -1,6 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
import CommonScrollIntoView from '../common/CommonScrollIntoView.vue'
import type { CommandHandler } from '~/composables/command' import type { CommandHandler } from '~/composables/command'
const { items, command } = defineProps<{ const { items, command } = defineProps<{

View file

@ -20,7 +20,7 @@ function clickUser(user: UserLogin) {
<button <button
flex rounded flex rounded
cursor-pointer cursor-pointer
aria-label="Switch user" :aria-label="$t('action.switch_account')"
:class="user.account.acct === currentUser?.account.acct ? '' : 'op25 grayscale'" :class="user.account.acct === currentUser?.account.acct ? '' : 'op25 grayscale'"
hover="filter-none op100" hover="filter-none op100"
@click="clickUser(user)" @click="clickUser(user)"

View file

@ -27,7 +27,7 @@ function isValidUrl(str: string) {
new URL(str) new URL(str)
return true return true
} }
catch (err) { catch {
return false return false
} }
} }
@ -42,14 +42,17 @@ async function handleInput() {
if ( if (
isValidUrl(`https://${input}`) isValidUrl(`https://${input}`)
&& input.match(/^[a-z0-9-]+(\.[a-z0-9-]+)+(:[0-9]+)?$/i) && input.match(/^[a-z0-9-]+(\.[a-z0-9-]+)+(:\d+)?$/i)
// Do not hide the autocomplete if a result has an exact substring match on the input // Do not hide the autocomplete if a result has an exact substring match on the input
&& !filteredServers.value.some(s => s.includes(input)) && !filteredServers.value.some(s => s.includes(input))
) ) {
autocompleteShow.value = false autocompleteShow.value = false
else }
else {
autocompleteShow.value = true autocompleteShow.value = true
} }
}
function toSelector(server: string) { function toSelector(server: string) {
return server.replace(/[^\w-]/g, '-') return server.replace(/[^\w-]/g, '-')

View file

@ -36,7 +36,7 @@ function processSignIn() {
<button <button
flex rounded px4 py3 text-left flex rounded px4 py3 text-left
hover:bg-active cursor-pointer transition-100 hover:bg-active cursor-pointer transition-100
aria-label="Switch user" :aria-label="$t('action.switch_account')"
@click="clickUser(user)" @click="clickUser(user)"
> >
<AccountInfo :account="user.account" :hover-card="false" square /> <AccountInfo :account="user.account" :hover-card="false" square />

View file

@ -19,7 +19,7 @@ export interface ContentParseOptions {
inReplyToStatus?: mastodon.v1.Status inReplyToStatus?: mastodon.v1.Status
} }
const sanitizerBasicClasses = filterClasses(/^(h-\S*|p-\S*|u-\S*|dt-\S*|e-\S*|mention|hashtag|ellipsis|invisible)$/u) const sanitizerBasicClasses = filterClasses(/^h-\S*|p-\S*|u-\S*|dt-\S*|e-\S*|mention|hashtag|ellipsis|invisible$/u)
const sanitizer = sanitize({ const sanitizer = sanitize({
// Allow basic elements as seen in https://github.com/mastodon/mastodon/blob/17f79082b098e05b68d6f0d38fabb3ac121879a9/lib/sanitize_ext/sanitize_config.rb // Allow basic elements as seen in https://github.com/mastodon/mastodon/blob/17f79082b098e05b68d6f0d38fabb3ac121879a9/lib/sanitize_ext/sanitize_config.rb
br: {}, br: {},
@ -93,6 +93,7 @@ export function parseMastodonHTML(
if (markdown) { if (markdown) {
// Handle code blocks // Handle code blocks
html = html html = html
/* eslint-disable regexp/no-super-linear-backtracking, regexp/no-misleading-capturing-group */
.replace(/>(```|~~~)(\w*)([\s\S]+?)\1/g, (_1, _2, lang: string, raw: string) => { .replace(/>(```|~~~)(\w*)([\s\S]+?)\1/g, (_1, _2, lang: string, raw: string) => {
const code = htmlToText(raw) const code = htmlToText(raw)
.replace(/</g, '&lt;') .replace(/</g, '&lt;')
@ -191,7 +192,7 @@ export function recursiveTreeToText(input: Node): string {
return treeToText(input) return treeToText(input)
} }
const emojiIdNeedsWrappingRE = /^(\d|\w|-|_)+$/ const emojiIdNeedsWrappingRE = /^([\w\-])+$/
export function treeToText(input: Node): string { export function treeToText(input: Node): string {
let pre = '' let pre = ''
@ -417,7 +418,7 @@ function removeCustomEmoji(customEmojis: Record<string, mastodon.v1.CustomEmoji>
if (node.type !== TEXT_NODE) if (node.type !== TEXT_NODE)
return node return node
const split = node.value.split(/\s?:([\w-]+?):/g) const split = node.value.split(/\s?:([\w-]+):/g)
if (split.length === 1) if (split.length === 1)
return node return node
@ -439,7 +440,7 @@ function replaceCustomEmoji(customEmojis: Record<string, mastodon.v1.CustomEmoji
if (node.type !== TEXT_NODE) if (node.type !== TEXT_NODE)
return node return node
const split = node.value.split(/:([\w-]+?):/g) const split = node.value.split(/:([\w-]+):/g)
if (split.length === 1) if (split.length === 1)
return node return node
@ -484,9 +485,9 @@ const _markdownReplacements: [RegExp, (c: (string | Node)[]) => Node][] = [
[/\*\*(.*?)\*\*/g, c => h('b', null, c)], [/\*\*(.*?)\*\*/g, c => h('b', null, c)],
[/\*(.*?)\*/g, c => h('em', null, c)], [/\*(.*?)\*/g, c => h('em', null, c)],
[/~~(.*?)~~/g, c => h('del', null, c)], [/~~(.*?)~~/g, c => h('del', null, c)],
[/`([^`]+?)`/g, c => h('code', null, c)], [/`([^`]+)`/g, c => h('code', null, c)],
// transform @username@twitter.com as links // transform @username@twitter.com as links
[/\B@([a-zA-Z0-9_]+)@twitter\.com\b/gi, c => h('a', { href: `https://twitter.com/${c}`, target: '_blank', rel: 'nofollow noopener noreferrer', class: 'mention external' }, `@${c}@twitter.com`)], [/\B@(\w+)@twitter\.com\b/gi, c => h('a', { href: `https://twitter.com/${c}`, target: '_blank', rel: 'nofollow noopener noreferrer', class: 'mention external' }, `@${c}@twitter.com`)],
] ]
function _markdownProcess(value: string) { function _markdownProcess(value: string) {

View file

@ -1,63 +1,53 @@
import type { MaybeRefOrGetter, RemovableRef } from '@vueuse/core' import type { MaybeRefOrGetter, RemovableRef } from '@vueuse/core'
import type { Ref } from 'vue'
import type { UseIDBOptions } from '@vueuse/integrations/useIDBKeyval' import type { UseIDBOptions } from '@vueuse/integrations/useIDBKeyval'
import { del, get, set, update } from '~/utils/elk-idb' import { del, get, set, update } from '~/utils/elk-idb'
const isIDBSupported = !process.test && typeof indexedDB !== 'undefined' export interface UseAsyncIDBKeyvalReturn<T> {
set: (value: T) => Promise<void>
readIDB: () => Promise<T | undefined>
}
export async function useAsyncIDBKeyval<T>( export async function useAsyncIDBKeyval<T>(
key: IDBValidKey, key: IDBValidKey,
initialValue: MaybeRefOrGetter<T>, initialValue: MaybeRefOrGetter<T>,
options: UseIDBOptions = {}, source: RemovableRef<T>,
): Promise<RemovableRef<T>> { options: Omit<UseIDBOptions, 'shallow'> = {},
): Promise<UseAsyncIDBKeyvalReturn<T>> {
const { const {
flush = 'pre', flush = 'pre',
deep = true, deep = true,
shallow, writeDefaults = true,
onError = (e: unknown) => { onError = (e: unknown) => {
console.error(e) console.error(e)
}, },
} = options } = options
const data = (shallow ? shallowRef : ref)(initialValue) as Ref<T> const rawInit: T = toValue<T>(initialValue)
const rawInit: T = toValue(initialValue)
async function read() {
if (!isIDBSupported)
return
try { try {
const rawValue = await get<T>(key) const rawValue = await get<T>(key)
if (rawValue === undefined) { if (rawValue === undefined) {
if (rawInit !== undefined && rawInit !== null) if (rawInit !== undefined && rawInit !== null && writeDefaults) {
await set(key, rawInit) await set(key, rawInit)
source.value = rawInit
}
} }
else { else {
data.value = rawValue source.value = rawValue
} }
} }
catch (e) { catch (e) {
onError(e) onError(e)
} }
}
await read() async function write(data: T) {
async function write() {
if (!isIDBSupported)
return
try { try {
if (data.value == null) { if (data == null) {
await del(key) await del(key)
} }
else { else {
// IndexedDB does not support saving proxies, convert from proxy before saving // IndexedDB does not support saving proxies, convert from proxy before saving
if (Array.isArray(data.value)) await update(key, () => toRaw(data))
await update(key, () => (JSON.parse(JSON.stringify(data.value))))
else if (typeof data.value === 'object')
await update(key, () => ({ ...data.value }))
else
await update(key, () => (data.value))
} }
} }
catch (e) { catch (e) {
@ -65,7 +55,21 @@ export async function useAsyncIDBKeyval<T>(
} }
} }
watch(data, () => write(), { flush, deep }) const {
pause: pauseWatch,
resume: resumeWatch,
} = watchPausable(source, data => write(data), { flush, deep })
return data as RemovableRef<T> async function setData(value: T): Promise<void> {
pauseWatch()
try {
await write(value)
source.value = value
}
finally {
resumeWatch()
}
}
return { set: setData, readIDB: () => get<T>(key) }
} }

View file

@ -4,7 +4,7 @@ export function getDisplayName(account: mastodon.v1.Account, options?: { rich?:
const displayName = account.displayName || account.username || account.acct || '' const displayName = account.displayName || account.username || account.acct || ''
if (options?.rich) if (options?.rich)
return displayName return displayName
return displayName.replace(/:([\w-]+?):/g, '') return displayName.replace(/:([\w-]+):/g, '')
} }
export function accountToShortHandle(acct: string) { export function accountToShortHandle(acct: string) {

View file

@ -80,8 +80,9 @@ export function usePublish(options: {
options.length < currentInstance.value.configuration.polls.maxOptions options.length < currentInstance.value.configuration.polls.maxOptions
|| options[options.length - 1].trim().length === 0 || options[options.length - 1].trim().length === 0
) )
) ) {
options = options.slice(0, options.length - 1) options = options.slice(0, options.length - 1)
}
poll = { ...draftItem.value.params.poll, options } poll = { ...draftItem.value.params.poll, options }
} }

View file

@ -123,8 +123,9 @@ export function usePaginator<T, P, U = T>(
&& state.value === 'idle' && state.value === 'idle'
// No new content is loaded when the keepAlive page enters the background // No new content is loaded when the keepAlive page enters the background
&& deactivated.value === false && deactivated.value === false
) ) {
loadNext() loadNext()
}
}, },
) )
} }

View file

@ -102,7 +102,8 @@ async function unsubscribeFromBackend(fromSWPushManager: boolean, removePushNoti
const cu = currentUser.value const cu = currentUser.value
if (cu) { if (cu) {
await removePushNotifications(cu) await removePushNotifications(cu)
removePushNotification && await removePushNotificationData(cu, fromSWPushManager) if (removePushNotification)
await removePushNotificationData(cu, fromSWPushManager)
} }
} }

View file

@ -178,7 +178,8 @@ export function usePushManager() {
else else
currentUser.value.pushSubscription = await client.value.v1.push.subscription.update({ data }) currentUser.value.pushSubscription = await client.value.v1.push.subscription.update({ data })
policyChanged && await nextTick() if (policyChanged)
await nextTick()
// force change policy when changed: watch is resetting it on push subscription update // force change policy when changed: watch is resetting it on push subscription update
await saveSettings(policyChanged ? policy : undefined) await saveSettings(policyChanged ? policy : undefined)

View file

@ -29,7 +29,7 @@ declare module '@tiptap/core' {
} }
} }
const inputRegex = /(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/ const inputRegex = /(?:^|\s)(!\[(.+|:?)\]\((\S+)(?:\s+["'](\S+)["'])?\))$/
export const TiptapPluginCustomEmoji = Node.create<EmojiOptions>({ export const TiptapPluginCustomEmoji = Node.create<EmojiOptions>({
name: 'custom-emoji', name: 'custom-emoji',

View file

@ -14,7 +14,7 @@ function wrapHandler<T extends (...args: any[]) => any>(handler: T): T {
try { try {
return handler(...args) return handler(...args)
} }
catch (e) { catch {
return null return null
} }
}) })

View file

@ -119,7 +119,8 @@ function createSuggestionRenderer(component: Component): SuggestionOptions['rend
// Use arrow function here because Nuxt will transform it incorrectly as Vue hook causing the build to fail // Use arrow function here because Nuxt will transform it incorrectly as Vue hook causing the build to fail
onBeforeUpdate: (props) => { onBeforeUpdate: (props) => {
props.editor.isFocused && renderer.updateProps({ ...props, isPending: true }) if (props.editor.isFocused)
renderer.updateProps({ ...props, isPending: true })
}, },
onUpdate(props) { onUpdate(props) {

View file

@ -12,39 +12,14 @@ import {
STORAGE_KEY_NOTIFICATION, STORAGE_KEY_NOTIFICATION,
STORAGE_KEY_NOTIFICATION_POLICY, STORAGE_KEY_NOTIFICATION_POLICY,
STORAGE_KEY_SERVERS, STORAGE_KEY_SERVERS,
STORAGE_KEY_USERS,
} from '~/constants' } from '~/constants'
import type { PushNotificationPolicy, PushNotificationRequest } from '~/composables/push-notifications/types' import type { PushNotificationPolicy, PushNotificationRequest } from '~/composables/push-notifications/types'
import { useAsyncIDBKeyval } from '~/composables/idb'
const mock = process.mock const mock = process.mock
function initializeUsers(): Promise<Ref<UserLogin[]> | RemovableRef<UserLogin[]>> | Ref<UserLogin[]> | RemovableRef<UserLogin[]> { const users: Ref<UserLogin[]> | RemovableRef<UserLogin[]> = import.meta.server ? ref<UserLogin[]>([]) : ref<UserLogin[]>([]) as RemovableRef<UserLogin[]>
let defaultUsers = mock ? [mock.user] : []
// Backward compatibility with localStorage
let removeUsersOnLocalStorage = false
if (globalThis?.localStorage) {
const usersOnLocalStorageString = globalThis.localStorage.getItem(STORAGE_KEY_USERS)
if (usersOnLocalStorageString) {
defaultUsers = JSON.parse(usersOnLocalStorageString)
removeUsersOnLocalStorage = true
}
}
const users = import.meta.server
? ref<UserLogin[]>(defaultUsers)
: useAsyncIDBKeyval<UserLogin[]>(STORAGE_KEY_USERS, defaultUsers, { deep: true })
if (removeUsersOnLocalStorage)
globalThis.localStorage.removeItem(STORAGE_KEY_USERS)
return users
}
const users = import.meta.server ? initializeUsers() as Ref<UserLogin[]> | RemovableRef<UserLogin[]> : await initializeUsers()
const nodes = useLocalStorage<Record<string, any>>(STORAGE_KEY_NODES, {}, { deep: true }) const nodes = useLocalStorage<Record<string, any>>(STORAGE_KEY_NODES, {}, { deep: true })
const currentUserHandle = useLocalStorage<string>(STORAGE_KEY_CURRENT_USER_HANDLE, mock ? mock.user.account.id : '') export const currentUserHandle = useLocalStorage<string>(STORAGE_KEY_CURRENT_USER_HANDLE, mock ? mock.user.account.id : '')
export const instanceStorage = useLocalStorage<Record<string, mastodon.v1.Instance>>(STORAGE_KEY_SERVERS, mock ? mock.server : {}, { deep: true }) export const instanceStorage = useLocalStorage<Record<string, mastodon.v1.Instance>>(STORAGE_KEY_SERVERS, mock ? mock.server : {}, { deep: true })
export type ElkInstance = Partial<mastodon.v1.Instance> & { export type ElkInstance = Partial<mastodon.v1.Instance> & {
@ -57,17 +32,24 @@ export function getInstanceCache(server: string): mastodon.v1.Instance | undefin
} }
export const currentUser = computed<UserLogin | undefined>(() => { export const currentUser = computed<UserLogin | undefined>(() => {
if (currentUserHandle.value) { const handle = currentUserHandle.value
const user = users.value.find(user => user.account?.acct === currentUserHandle.value) const currentUsers = users.value
if (handle) {
const user = currentUsers.find(user => user.account?.acct === handle)
if (user) if (user)
return user return user
} }
// Fallback to the first account // Fallback to the first account
return users.value[0] return currentUsers.length ? currentUsers[0] : undefined
}) })
const publicInstance = ref<ElkInstance | null>(null) const publicInstance = ref<ElkInstance | null>(null)
export const currentInstance = computed<null | ElkInstance>(() => currentUser.value ? instanceStorage.value[currentUser.value.server] ?? null : publicInstance.value) export const currentInstance = computed<null | ElkInstance>(() => {
const user = currentUser.value
const storage = instanceStorage.value
const instance = publicInstance.value
return user ? storage[user.server] ?? null : instance
})
export function getInstanceDomain(instance: ElkInstance) { export function getInstanceDomain(instance: ElkInstance) {
return instance.accountDomain || withoutProtocol(instance.uri) return instance.accountDomain || withoutProtocol(instance.uri)
@ -80,37 +62,6 @@ export const currentNodeInfo = computed<null | Record<string, any>>(() => nodes.
export const isGotoSocial = computed(() => currentNodeInfo.value?.software?.name === 'gotosocial') export const isGotoSocial = computed(() => currentNodeInfo.value?.software?.name === 'gotosocial')
export const isGlitchEdition = computed(() => currentInstance.value?.version?.includes('+glitch')) export const isGlitchEdition = computed(() => currentInstance.value?.version?.includes('+glitch'))
// when multiple tabs: we need to reload window when sign in, switch account or sign out
if (import.meta.client) {
const windowReload = () => {
document.visibilityState === 'visible' && window.location.reload()
}
watch(currentUserHandle, async (handle, oldHandle) => {
// when sign in or switch account
if (handle) {
if (handle === currentUser.value?.account?.acct) {
// when sign in, the other tab will not have the user, idb is not reactive
const newUser = users.value.find(user => user.account?.acct === handle)
// if the user is there, then we are switching account
if (newUser) {
// check if the change is on current tab: if so, don't reload
if (document.hasFocus() || document.visibilityState === 'visible')
return
}
}
window.addEventListener('visibilitychange', windowReload, { capture: true })
}
// when sign out
else if (oldHandle) {
const oldUser = users.value.find(user => user.account?.acct === oldHandle)
// when sign out, the other tab will not have the user, idb is not reactive
if (oldUser)
window.addEventListener('visibilitychange', windowReload, { capture: true })
}
}, { immediate: true, flush: 'post' })
}
export function useUsers() { export function useUsers() {
return users return users
} }
@ -120,7 +71,10 @@ export function useSelfAccount(user: MaybeRefOrGetter<mastodon.v1.Account | unde
export const characterLimit = computed(() => currentInstance.value?.configuration?.statuses.maxCharacters ?? DEFAULT_POST_CHARS_LIMIT) export const characterLimit = computed(() => currentInstance.value?.configuration?.statuses.maxCharacters ?? DEFAULT_POST_CHARS_LIMIT)
export async function loginTo(masto: ElkMasto, user: Overwrite<UserLogin, { account?: mastodon.v1.AccountCredentials }>) { export async function loginTo(
masto: ElkMasto,
user: Overwrite<UserLogin, { account?: mastodon.v1.AccountCredentials }>,
) {
const { client } = masto const { client } = masto
const instance = mastoLogin(masto, user) const instance = mastoLogin(masto, user)
@ -321,7 +275,7 @@ export async function signOut() {
if (!currentUserHandle.value) if (!currentUserHandle.value)
await useRouter().push('/') await useRouter().push('/')
loginTo(masto, currentUser.value || { server: publicServer.value }) await loginTo(masto, currentUser.value || { server: publicServer.value })
} }
export function checkLogin() { export function checkLogin() {

View file

@ -114,6 +114,11 @@ const locales: LocaleObjectData[] = [
file: 'ca.json', file: 'ca.json',
name: 'Català', name: 'Català',
}, },
{
code: 'el-GR',
file: 'el-GR.json',
name: 'Ελληνικά',
},
{ {
code: 'de-DE', code: 'de-DE',
file: 'de-DE.json', file: 'de-DE.json',
@ -213,8 +218,8 @@ const locales: LocaleObjectData[] = [
name: 'Indonesia', name: 'Indonesia',
}, },
{ {
code: 'fi-FI', code: 'fi',
file: 'fi-FI.json', file: 'fi.json',
name: 'Suomi', name: 'Suomi',
}, },
{ {

View file

@ -7,7 +7,7 @@ export const pwa: VitePWANuxtOptions = {
disable: /* temporarily test in CI isPreview || */ (isDevelopment && process.env.VITE_DEV_PWA !== 'true'), disable: /* temporarily test in CI isPreview || */ (isDevelopment && process.env.VITE_DEV_PWA !== 'true'),
scope: '/', scope: '/',
srcDir: './service-worker', srcDir: './service-worker',
filename: 'sw.ts', filename: 'elk-sw.ts',
strategies: 'injectManifest', strategies: 'injectManifest',
injectRegister: false, injectRegister: false,
includeManifestIcons: false, includeManifestIcons: false,

View file

@ -26,7 +26,7 @@ export const STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE = 'elk-last-accessed-n
export const STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE = 'elk-last-accessed-explore-route' export const STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE = 'elk-last-accessed-explore-route'
export const STORAGE_KEY_BOTTOM_NAV_BUTTONS = 'elk-bottom-nav-buttons' export const STORAGE_KEY_BOTTOM_NAV_BUTTONS = 'elk-bottom-nav-buttons'
export const HANDLED_MASTO_URLS = /^(https?:\/\/)?([\w\d-]+\.)+\w+\/(@[@\w\d-\.]+)(\/objects)?(\/\d+)?$/ export const HANDLED_MASTO_URLS = /^(https?:\/\/)?([\w\-]+\.)+\w+\/(@[@\w\-.]+)(\/objects)?(\/\d+)?$/
export const NOTIFICATION_FILTER_TYPES: mastodon.v1.NotificationType[] = ['status', 'reblog', 'follow', 'follow_request', 'favourite', 'poll', 'update', 'admin.sign_up', 'admin.report'] export const NOTIFICATION_FILTER_TYPES: mastodon.v1.NotificationType[] = ['status', 'reblog', 'follow', 'follow_request', 'favourite', 'poll', 'update', 'admin.sign_up', 'admin.report']

View file

@ -1,8 +1,7 @@
<script> <script setup lang="ts">
export default { const { copy } = defineProps<{
name: 'ClipboardIcon', copy?: boolean
props: { copy: Boolean }, }>()
}
</script> </script>
<template> <template>

View file

@ -1,8 +1,4 @@
<script> <script setup lang="ts"></script>
export default {
name: 'IconMastodon',
}
</script>
<template> <template>
<svg width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M21.258 13.99c-.274 1.41-2.456 2.955-4.962 3.254c-1.306.156-2.593.3-3.965.236c-2.243-.103-4.014-.535-4.014-.535c0 .218.014.426.04.62c.292 2.215 2.196 2.347 4 2.41c1.82.062 3.44-.45 3.44-.45l.076 1.646s-1.274.684-3.542.81c-1.25.068-2.803-.032-4.612-.51c-3.923-1.039-4.598-5.22-4.701-9.464c-.031-1.26-.012-2.447-.012-3.44c0-4.34 2.843-5.611 2.843-5.611c1.433-.658 3.892-.935 6.45-.956h.062c2.557.02 5.018.298 6.451.956c0 0 2.843 1.272 2.843 5.61c0 0 .036 3.201-.397 5.424zm-2.956-5.087c0-1.074-.273-1.927-.822-2.558c-.567-.631-1.308-.955-2.229-.955c-1.065 0-1.871.41-2.405 1.228l-.518.87l-.519-.87C11.276 5.8 10.47 5.39 9.405 5.39c-.921 0-1.663.324-2.229.955c-.549.631-.822 1.484-.822 2.558v5.253h2.081V9.057c0-1.075.452-1.62 1.357-1.62c1 0 1.501.647 1.501 1.927v2.79h2.07v-2.79c0-1.28.5-1.927 1.5-1.927c.905 0 1.358.545 1.358 1.62v5.1h2.08V8.902z" /></svg> <svg width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M21.258 13.99c-.274 1.41-2.456 2.955-4.962 3.254c-1.306.156-2.593.3-3.965.236c-2.243-.103-4.014-.535-4.014-.535c0 .218.014.426.04.62c.292 2.215 2.196 2.347 4 2.41c1.82.062 3.44-.45 3.44-.45l.076 1.646s-1.274.684-3.542.81c-1.25.068-2.803-.032-4.612-.51c-3.923-1.039-4.598-5.22-4.701-9.464c-.031-1.26-.012-2.447-.012-3.44c0-4.34 2.843-5.611 2.843-5.611c1.433-.658 3.892-.935 6.45-.956h.062c2.557.02 5.018.298 6.451.956c0 0 2.843 1.272 2.843 5.61c0 0 .036 3.201-.397 5.424zm-2.956-5.087c0-1.074-.273-1.927-.822-2.558c-.567-.631-1.308-.955-2.229-.955c-1.065 0-1.871.41-2.405 1.228l-.518.87l-.519-.87C11.276 5.8 10.47 5.39 9.405 5.39c-.921 0-1.663.324-2.229.955c-.549.631-.822 1.484-.822 2.558v5.253h2.081V9.057c0-1.075.452-1.62 1.357-1.62c1 0 1.501.647 1.501 1.927v2.79h2.07v-2.79c0-1.28.5-1.927 1.5-1.927c.905 0 1.358.545 1.358 1.62v5.1h2.08V8.902z" /></svg>

View file

@ -1,8 +1,7 @@
<script> <script setup lang="ts">
export default { const { up } = defineProps<{
name: 'ToggleIcon', up?: boolean
props: { up: Boolean }, }>()
}
</script> </script>
<template> <template>

View file

@ -13,6 +13,6 @@
}, },
"devDependencies": { "devDependencies": {
"@nuxt-themes/docus": "^1.15.0", "@nuxt-themes/docus": "^1.15.0",
"nuxt": "^3.11.2" "nuxt": "^3.13.2"
} }
} }

View file

@ -1,4 +1,4 @@
<script lang="ts" setup> <script setup lang="ts">
import { usePreferences } from '~/composables/settings' import { usePreferences } from '~/composables/settings'
const route = useRoute() const route = useRoute()

View file

@ -7,6 +7,8 @@
"route_loaded": "Seite {0} geladen" "route_loaded": "Seite {0} geladen"
}, },
"account": { "account": {
"authorize": "Erlauben zu folgen",
"authorized": "Du hast die Folgeanfrage erlaubt",
"avatar_description": "{0}'s Avatar", "avatar_description": "{0}'s Avatar",
"blocked_by": "Du wurdest von diesem Account geblockt", "blocked_by": "Du wurdest von diesem Account geblockt",
"blocked_domains": "Geblockte Mastodon-Instanzen", "blocked_domains": "Geblockte Mastodon-Instanzen",
@ -25,6 +27,7 @@
"follows_you": "Folgt dir", "follows_you": "Folgt dir",
"go_to_profile": "Gehe zum Profil", "go_to_profile": "Gehe zum Profil",
"joined": "Beigetreten", "joined": "Beigetreten",
"lock": "Sperren",
"moved_title": "hat angegeben, dass dies der neue Account ist:", "moved_title": "hat angegeben, dass dies der neue Account ist:",
"muted_users": "Stummgeschaltete Accounts", "muted_users": "Stummgeschaltete Accounts",
"muting": "Stummgeschaltet", "muting": "Stummgeschaltet",
@ -37,12 +40,16 @@
"profile_description": "{0}'s Profil", "profile_description": "{0}'s Profil",
"profile_personal_note": "Persönliche Notiz", "profile_personal_note": "Persönliche Notiz",
"profile_unavailable": "Profil nicht verfügbar", "profile_unavailable": "Profil nicht verfügbar",
"reject": "Folgeanfrage ablehnen",
"rejected": "Du hast den Antrag abgelehnt",
"request_follow": "Folgeanfrage senden", "request_follow": "Folgeanfrage senden",
"requested": "{0} hat beantragt, dir zu folgen",
"unblock": "Entblocken", "unblock": "Entblocken",
"unfollow": "Entfolgen", "unfollow": "Entfolgen",
"unmute": "Stummschaltung aufheben", "unmute": "Stummschaltung aufheben",
"view_other_followers": "Follower aus anderen Instanzen werden möglicherweise nicht angezeigt.", "view_other_followers": "Follower aus anderen Instanzen werden möglicherweise nicht angezeigt.",
"view_other_following": "Das Folgen von anderen Instanzen wird möglicherweise nicht angezeigt." "view_other_following": "Das Folgen von anderen Instanzen wird möglicherweise nicht angezeigt.",
"withdraw_follow_request": "Folgeanfrage zurückziehen"
}, },
"action": { "action": {
"apply": "Anwenden", "apply": "Anwenden",
@ -52,7 +59,8 @@
"boost_count": "{0}", "boost_count": "{0}",
"boosted": "Geteilt", "boosted": "Geteilt",
"clear_publish_failed": "Veröffentlichungsfehler löschen", "clear_publish_failed": "Veröffentlichungsfehler löschen",
"clear_upload_failed": "Fehler beim Hochladen von Dateien entfernen", "clear_save_failed": "Speicherfehler löschen",
"clear_upload_failed": "Uploadfehler entfernen",
"close": "Schließen", "close": "Schließen",
"compose": "Verfassen", "compose": "Verfassen",
"confirm": "Bestätigen", "confirm": "Bestätigen",
@ -64,6 +72,7 @@
"favourited": "Favorisiert", "favourited": "Favorisiert",
"more": "Mehr", "more": "Mehr",
"next": "Nächster", "next": "Nächster",
"open_image_preview_dialog": "Bildvorschau öffnen",
"prev": "Vorheriger", "prev": "Vorheriger",
"publish": "Veröffentlichen", "publish": "Veröffentlichen",
"publish_thread": "Thread veröffentlichen", "publish_thread": "Thread veröffentlichen",
@ -114,12 +123,14 @@
"block_account": { "block_account": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Blockieren", "confirm": "Blockieren",
"description": "Bist du sicher, dass du {0} blockieren möchtest?" "description": "Bist du sicher, dass du {0} blockieren möchtest?",
"title": "Konto blockieren"
}, },
"block_domain": { "block_domain": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Blockieren", "confirm": "Blockieren",
"description": "Bist du sicher, dass du {0} blockieren möchtest?" "description": "Bist du sicher, dass du {0} blockieren möchtest?",
"title": "Domain blockieren"
}, },
"common": { "common": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
@ -128,27 +139,37 @@
"delete_list": { "delete_list": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Löschen", "confirm": "Löschen",
"description": "Bist du sicher, dass du die Liste \"{0}\" löschen möchtest?" "description": "Bist du sicher, dass du die Liste \"{0}\" löschen möchtest?",
"title": "Liste löschen"
}, },
"delete_posts": { "delete_posts": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Löschen", "confirm": "Löschen",
"description": "Möchtest du diesen Beitrag wirklich löschen?" "description": "Möchtest du diesen Beitrag wirklich löschen?",
"title": "Beitrag löschen"
}, },
"mute_account": { "mute_account": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Stummschalten", "confirm": "Stummschalten",
"description": "Bist du sicher, dass du {0} stummschalten möchtest?" "days": "Tage|Tag|Tage",
"description": "Bist du sicher, dass du {0} stummschalten möchtest?",
"hours": "Stunden|Stunde|Stunden",
"minute": "Minuten|Minute|Minuten",
"notifications": "Benachrichtigungen stummschalten",
"specify_duration": "Dauer der Stummschaltung festlegen",
"title": "Konto stummschalten"
}, },
"show_reblogs": { "show_reblogs": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Anzeigen", "confirm": "Anzeigen",
"description": "Bist du sicher, dass du Weiterleitungen von {0} anzeigen möchtest?" "description": "Bist du sicher, dass du Weiterleitungen von {0} anzeigen möchtest?",
"title": "Weiterleitungen anzeigen"
}, },
"unfollow": { "unfollow": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Entfolgen", "confirm": "Entfolgen",
"description": "Bist du sicher, dass du entfolgen möchtest?" "description": "Bist du sicher, dass du entfolgen möchtest?",
"title": "Entfolgen"
} }
}, },
"conversation": { "conversation": {
@ -213,6 +234,8 @@
"command_mode": "Befehlsmodus", "command_mode": "Befehlsmodus",
"compose": "Verfassen", "compose": "Verfassen",
"favourite": "Favorisieren", "favourite": "Favorisieren",
"search": "Suchen",
"show_new_items": "Neue Einträge anzeigen",
"title": "Aktionen" "title": "Aktionen"
}, },
"media": { "media": {
@ -257,6 +280,7 @@
"pin_on_profile": "An Profil anpinnen", "pin_on_profile": "An Profil anpinnen",
"remove_personal_note": "Persönliche Notiz von {0} entfernen", "remove_personal_note": "Persönliche Notiz von {0} entfernen",
"report_account": "{0} melden", "report_account": "{0} melden",
"share_account": "Konto von {0} teilen",
"share_post": "Teile diesen Beitrag", "share_post": "Teile diesen Beitrag",
"show_favourited_and_boosted_by": "Zeige mir, wer favorisiert und geboostet hat", "show_favourited_and_boosted_by": "Zeige mir, wer favorisiert und geboostet hat",
"show_reblogs": "Boosts von {0} anzeigen", "show_reblogs": "Boosts von {0} anzeigen",
@ -284,13 +308,16 @@
"built_at": "Letzter Build: {0}", "built_at": "Letzter Build: {0}",
"compose": "Verfassen", "compose": "Verfassen",
"conversations": "Direktnachrichten", "conversations": "Direktnachrichten",
"docs": "Dokumentation",
"explore": "Entdecken", "explore": "Entdecken",
"favourites": "Favoriten", "favourites": "Favoriten",
"federated": "Föderiert", "federated": "Föderiert",
"hashtags": "Hashtags",
"home": "Startseite", "home": "Startseite",
"list": "Liste", "list": "Liste",
"lists": "Listen", "lists": "Listen",
"local": "Lokal", "local": "Lokal",
"more_menu": "Mehr Menü",
"muted_users": "Stummgeschaltete Benutzer", "muted_users": "Stummgeschaltete Benutzer",
"notifications": "Mitteilungen", "notifications": "Mitteilungen",
"privacy": "Datenschutz", "privacy": "Datenschutz",
@ -436,6 +463,7 @@
}, },
"language": { "language": {
"display_language": "Anzeigesprache", "display_language": "Anzeigesprache",
"how_to_contribute": "Wie kann ich mithelfen?",
"label": "Sprache", "label": "Sprache",
"post_language": "Beitragssprache", "post_language": "Beitragssprache",
"status": "Übersetzungsstatus: {0}/{1} ({2}%)", "status": "Übersetzungsstatus: {0}/{1} ({2}%)",
@ -503,6 +531,8 @@
}, },
"notifications_settings": "Benachrichtigungen", "notifications_settings": "Benachrichtigungen",
"preferences": { "preferences": {
"embedded_media": "Eingebetteter Mediaplayer",
"embedded_media_description": "Zeige einen eingebetteten Player anstelle der normalen Vorschaukarte an, wenn gemeinsam genutzte Medien-Streaming-Links erweitert werden.",
"enable_autoplay": "Autoplay aktivieren", "enable_autoplay": "Autoplay aktivieren",
"enable_data_saving": "Daten sparen aktivieren", "enable_data_saving": "Daten sparen aktivieren",
"enable_data_saving_description": "Spare Daten, indem du das automatische Laden von Anhängen verhinderst.", "enable_data_saving_description": "Spare Daten, indem du das automatische Laden von Anhängen verhinderst.",
@ -511,16 +541,19 @@
"github_cards_description": "Wenn ein GitHub-Link gepostet wird, wird anstelle des sozialen Bildes eine zugängliche HTML-Karte mit der Social-Graph-Meta angezeigt.", "github_cards_description": "Wenn ein GitHub-Link gepostet wird, wird anstelle des sozialen Bildes eine zugängliche HTML-Karte mit der Social-Graph-Meta angezeigt.",
"grayscale_mode": "Graustufenmodus", "grayscale_mode": "Graustufenmodus",
"hide_account_hover_card": "Benutzer-Hover-Karte verbergen", "hide_account_hover_card": "Benutzer-Hover-Karte verbergen",
"hide_alt_indi_on_posts": "Alternativtext-Hinweis in Beiträgen ausblenden", "hide_alt_indi_on_posts": "Alternativtext-Hinweis in Beiträgen verbergen",
"hide_boost_count": "Boost-Zähler ausblenden", "hide_boost_count": "Boost-Zähler verbergen",
"hide_favorite_count": "Favoritenzahl ausblenden", "hide_favorite_count": "Favoritenzahl verbergen",
"hide_follower_count": "Anzahl der Follower ausblenden", "hide_follower_count": "Anzahl der Follower verbergen",
"hide_news": "Nachrichten ausblenden", "hide_gif_indi_on_posts": "GIF-Indikator auf Beiträgen verbergen",
"hide_reply_count": "Antwortanzahl ausblenden", "hide_news": "Nachrichten verbergen",
"hide_translation": "Übersetzungen komplett ausblenden", "hide_reply_count": "Antwortanzahl verbergen",
"hide_username_emojis": "Emojis in Namen ausblenden", "hide_tag_hover_card": "Tag-Hover-Karte verbergen",
"hide_username_emojis_description": "Blendet in der Timeline Emojis in den Namen von Kommentator:innen aus. In deren Profilen sind die Emojis weiterhin zu sehen.", "hide_translation": "Übersetzungen komplett verbergen",
"hide_username_emojis": "Emojis in Namen verbergen",
"hide_username_emojis_description": "Verbirgt in der Timeline Emojis in den Namen von Kommentator:innen. In deren Profilen sind die Emojis weiterhin zu sehen.",
"label": "Einstellungen", "label": "Einstellungen",
"optimize_for_low_performance_device": "Für Geräte mit geringer Leistung optimieren.",
"title": "Experimentelle Funktionen", "title": "Experimentelle Funktionen",
"use_star_favorite_icon": "Stern als Favoriten-Symbol verwenden", "use_star_favorite_icon": "Stern als Favoriten-Symbol verwenden",
"user_picker": "Benutzerauswahl", "user_picker": "Benutzerauswahl",
@ -564,12 +597,17 @@
}, },
"state": { "state": {
"attachments_exceed_server_limit": "Die Anzahl der Anhänge hat das Limit pro Beitrag überschritten.", "attachments_exceed_server_limit": "Die Anzahl der Anhänge hat das Limit pro Beitrag überschritten.",
"attachments_limit_audio_error": "Maximale Audio-Größe überschritten: {0}",
"attachments_limit_error": "Limit pro Beitrag überschritten", "attachments_limit_error": "Limit pro Beitrag überschritten",
"attachments_limit_image_error": "Maximale Bildgröße überschritten: {0}",
"attachments_limit_unknown_error": "Maximale Dateigröße überschritten: {0}",
"attachments_limit_video_error": "Maximale Video-Größe überschritten: {0}",
"edited": "(bearbeitet)", "edited": "(bearbeitet)",
"editing": "Bearbeiten", "editing": "Bearbeiten",
"loading": "Laden...", "loading": "Laden...",
"publish_failed": "Veröffentlichung fehlgeschlagen", "publish_failed": "Veröffentlichung fehlgeschlagen",
"publishing": "Veröffentlichung", "publishing": "Veröffentlichung",
"save_failed": "Speichern fehlgeschlagen",
"upload_failed": "Upload fehlgeschlagen", "upload_failed": "Upload fehlgeschlagen",
"uploading": "Hochladen..." "uploading": "Hochladen..."
}, },
@ -580,9 +618,11 @@
}, },
"boosted_by": "Boosted von", "boosted_by": "Boosted von",
"edited": "Zuletzt bearbeitet: {0}", "edited": "Zuletzt bearbeitet: {0}",
"embedded_warning": "Das Abspielen kann deine IP-Adresse anderen offenlegen.",
"favourited_by": "Favorisiert von", "favourited_by": "Favorisiert von",
"filter_hidden_phrase": "Versteckt durch", "filter_hidden_phrase": "Versteckt durch",
"filter_show_anyway": "Trotzdem zeigen", "filter_show_anyway": "Trotzdem zeigen",
"gif": "GIF",
"img_alt": { "img_alt": {
"ALT": "ALT", "ALT": "ALT",
"desc": "Beschreibung", "desc": "Beschreibung",
@ -615,9 +655,17 @@
"media": "Medien", "media": "Medien",
"news": "Nachrichten", "news": "Nachrichten",
"notifications_all": "Alle", "notifications_all": "Alle",
"notifications_favourite": "Favorit",
"notifications_follow": "Folgen",
"notifications_follow_request": "Folgeanfrage",
"notifications_mention": "Erwähnungen", "notifications_mention": "Erwähnungen",
"notifications_more_tooltip": "Benachrichtigungen nach Typ filtern",
"notifications_poll": "Umfrage",
"notifications_reblog": "Boost",
"notifications_status": "Status",
"notifications_update": "Aktualisierung",
"posts": "Beiträge", "posts": "Beiträge",
"posts_with_replies": "Beiträge und Antworten" "posts_with_replies": "Beiträge & Antworten"
}, },
"tag": { "tag": {
"follow": "Folgen", "follow": "Folgen",

746
locales/el-GR.json Normal file
View file

@ -0,0 +1,746 @@
{
"a11y": {
"loading_page": "Η σελίδα φορτώνει, παρακαλώ περίμενε",
"loading_titled_page": "Η σελίδα {0} φορτώνει, παρακαλώ περίμενε",
"locale_changed": " Η γλώσσα άλλαξε σε {0}",
"locale_changing": "Η γλώσσα αλλάζει, παρακαλώ περίμενε",
"route_loaded": "Η σελίδα {0} φορτώθηκε"
},
"account": {
"authorize": "Εξουσιοδότησε για να ακολουθήσεις",
"authorized": "You have Authorized the request",
"avatar_description": "το άβαταρ του χρήστη {0}",
"blocked_by": "Είσαι αποκλεισμένος από αυτόν τον χρήστη.",
"blocked_domains": "Αποκλεισμένοι τομείς",
"blocked_users": "Αποκλεισμένοι χρήστες",
"blocking": "Αποκλεισμένοι",
"bot": "BOT",
"copy_account_name": "Αντιγραφή ονόματος λογαριασμού",
"favourites": "Αγαπημένα",
"follow": "Ακολούθησε",
"follow_back": "Ακολούθησε και συ",
"follow_requested": "Αιτήθηκε",
"followers": "Ακόλουθοι",
"followers_count": "{0} Ακόλουθοι|{0} Ακόλουθος|{0} Ακόλουθοι",
"following": "Ακολουθεί",
"following_count": "Ακολουθεί {0}",
"follows_you": "Σε ακολουθεί",
"go_to_profile": "Πήγαινε στο προφίλ",
"joined": "έγινε μέλος",
"lock": "Κλείδωμα",
"moved_title": "έχει δηλώσει ότι ο νέος του λογαριασμός είναι:",
"muted_users": "Χρήστες σε σίγαση",
"muting": "Σε σίγαση",
"mutuals": "Κοινοί",
"notifications_on_post_disable": "Σταμάτα να με ειδοποιείς όταν ο χρήστης {username} κάνει ανάρτηση",
"notifications_on_post_enable": "Ειδοποίησέ με όταν ο χρήστης {username} κάνει ανάρτηση",
"pinned": "Καρφιτσώθηκε",
"posts": "Αναρτήσεις",
"posts_count": "{0} Αναρτήσεις|{0} Ανάρτηση|{0} Αναρτήσεις",
"profile_description": "Κεφαλίδα προφίλ του χρήστη {0}",
"profile_personal_note": "Προσωπική Σημείωση",
"profile_unavailable": "Μη διαθέσιμο προφίλ",
"reject": "Άρνηση ακολούθησης",
"rejected": "Αρνήθηκες το αίτημα",
"request_follow": "Αίτημα ακολούθησης",
"requested": "Ο χρήστης {0} ζήτησε να σε ακολουθήσει",
"unblock": "Άρση αποκλεισμού",
"unfollow": "Άρση ακολούθησης",
"unmute": "Άρση σίγασης",
"view_other_followers": "Οι ακόλουθοι από άλλες οντότητες μπορεί να μην εμφανίζονται.",
"view_other_following": "Αυτοί που ακολουθείς από άλλες οντότητες μπορεί να μην εμφανίζονται.",
"withdraw_follow_request": "Ανάκληση αιτήματος ακολούθησης"
},
"action": {
"apply": "Εφαρμογή",
"bookmark": "Σελιδοδείκτης",
"bookmarked": "Με Σελιδοδείκτη",
"boost": "Ενίσχυση",
"boost_count": "{0}",
"boosted": "Ενισχύθηκε",
"clear_publish_failed": "Καθαρισμός σφαλμάτων ανάρτησης",
"clear_save_failed": "Καθαρισμός σφαλμάτων αποθήκευσης",
"clear_upload_failed": "Εκκαθάριση σφαλμάτων μεταμόρφωσης αρχείων",
"close": "Κλείσιμο",
"compose": "Σύνταξη",
"confirm": "Επιβεβαίωση",
"done": "Έγινε",
"edit": "Επεξεργασία",
"enter_app": "Είσοδος στην εφαρμογή",
"favourite": "Αγαπημένο",
"favourite_count": "{0}",
"favourited": "Είναι αγαπημένο",
"more": "Περισσότερα",
"next": "Επόμενο",
"prev": "Προηγ.",
"publish": "Δημοσίευση",
"reply": "Απάντηση",
"reply_count": "{0}",
"reset": "Επαναφορά",
"save": "Αποθήκευση",
"save_changes": "Αποθήκευση αλλαγών",
"sign_in": "Σύνδεση",
"sign_in_to": "Σύνδεση σε {0}",
"switch_account": "Εναλλαγή λογαριασμού",
"vote": "Ψήφος"
},
"app_desc_short": "Ένας ελαφρώς προσαρμοσμένος πελάτης για το Mastodon",
"app_logo": "Λογότυπο Elk",
"app_name": "Elk",
"attachment": {
"edit_title": "Περιγραφή",
"remove_label": "Αφαίρεση επισύναψης"
},
"command": {
"activate": "Ενεργοποίηση",
"complete": "Ολοκλήρωση",
"compose_desc": "Γράψε νέα ανάρτηση",
"n_people_in_the_past_n_days": "{0} άτομα τις τελευταίες {1} μέρες",
"select_lang": "Επιλογή γλώσσας",
"sign_in_desc": "Προσθήκη υπάρχοντος λογαριασμού",
"switch_account": "Εναλλαγή σε {0}",
"switch_account_desc": "Εναλλαγή σε άλλο λογαριασμό",
"toggle_dark_mode": "Εναλλαγή σκοτεινής λειτουργίας",
"toggle_zen_mode": "Εναλλαγή λειτουργίας Zen"
},
"common": {
"end_of_list": "Τέλος της λίστας",
"error": "ΣΦΑΛΜΑ",
"fetching": "Ανάκτηση...",
"in": "σε",
"no_bookmarks": "Δεν υπάρχουν αναρτήσεις με σελιδοδείκτη ακόμα",
"no_favourites": "Δεν υπάρχουν αγαπημένες αναρτήσεις ακόμα",
"not_found": "404 Δε βρέθηκε",
"offline_desc": "Φαίνεται να είσαι αποσυνδεδεμένος. Παρακαλώ έλεγξε τη σύνδεση σου στο διαδίκτυο."
},
"compose": {
"draft_title": "Πρόχειρο {0}",
"drafts": "Πρόχειρο ({v})"
},
"confirm": {
"block_account": {
"cancel": "Ακύρωση",
"confirm": "Αποκλεισμός",
"description": "Σίγουρα θες να αποκλείσεις τον {0};",
"title": "Αποκλεισμός λογαριασμού"
},
"block_domain": {
"cancel": "Ακύρωση",
"confirm": "Αποκλεισμός",
"description": "Σίγουρα θες να αποκλείσεις τον {0}?;",
"title": "Αποκλεισμός τομέα"
},
"common": {
"cancel": "Όχι",
"confirm": "Ναι"
},
"delete_list": {
"cancel": "Ακύρωση",
"confirm": "Διαγραφή",
"description": "Θες σίγουρα να διαγράψεις την λίστα \"{0}\";",
"title": "Διαγραφή λίστας"
},
"delete_posts": {
"cancel": "Ακύρωση",
"confirm": "Διαγραφή",
"description": "Θες σίγουρα να διαγράψεις αυτή την ανάρτηση;",
"title": "Διαγραφή ανάρτησης"
},
"mute_account": {
"cancel": "Ακύρωση",
"confirm": "Σίγαση",
"days": "μέρες|μέρα|μέρες",
"description": "Θες σίγουρα να κάνεις σίγαση στον {0};",
"hours": "ώρες|ώρα|ώρες",
"minute": "λεπτά|λεπτό|λεπτά",
"notifications": "Σίγαση ειδοποιήσεων",
"specify_duration": "Προσδιόρισε διάρκεια σίγασης",
"title": "Σίγαση λογαριασμού"
},
"show_reblogs": {
"cancel": "Ακύρωση",
"confirm": "Εμφάνιση",
"description": "Θες σίγουρα να εμφανίζεις τις ενισχύσεις του {0}?",
"title": "Εμφάνιση ενισχύσεων"
},
"unfollow": {
"cancel": "Ακύρωση",
"confirm": "Άρση ακολούθησης",
"description": "Θες σίγουρα να κάνεις άρση ακολούθησης στον {0};",
"title": "Άρση ακολούθησης"
}
},
"conversation": {
"with": "με"
},
"custom_cards": {
"stackblitz": {
"lines": "Γραμμές {0}",
"open": "Άνοιγμα",
"snippet_from": "Απόκομμα από {0}"
}
},
"error": {
"account_not_found": "Ο λογαριασμός {0} δεν βρέθηκε",
"explore_list_empty": "Δεν υπάρχει τίποτα δημοφιλές αυτήν τη στιγμή. Έλεγξε ξανά αργότερα!",
"file_size_cannot_exceed_n_mb": "Το μέγεθος του αρχείου δεν μπορεί να υπερβαίνει τα {0}MB",
"sign_in_error": "Σφάλμα σύνδεσης με τον διακομιστή",
"status_not_found": "Η ανάρτηση δεν βρέθηκε",
"unsupported_file_format": "Μη υποστηριζόμενη μορφή αρχείου"
},
"help": {
"build_preview": {
"desc1": "Βλέπεις, για την ώρα, μια δοκιμαστική έκδοση του Elk από την κοινότητα - {0}.",
"desc2": "Μπορεί να περιέχει μη αξιολογημένες ή ακόμα και κακόβουλες αλλαγές.",
"desc3": "Μην συνδεθείς με τον πραγματικό σου λογαριασμό",
"title": "Εκκίνηση προεπισκόπησης"
},
"desc_highlight": "Αναμένονται μερικά σφάλματα και ελλείψεις δυνατοτήτων πού και πού.",
"desc_para1": "Ευχαριστούμε για το ενδιαφέρον σου να δοκιμάσεις το Elk, τον εν εξελίξει πελάτη Mastodon για τον ιστό!",
"desc_para2": "Δουλεύουμε σκληρά στην ανάπτυξη και βελτίωσή του με τον καιρό.",
"desc_para3": "Για την ενίσχυση της ανάπτυξης, μπορείς να χρηματοδοτήσεις την Ομάδα μέσω του GitHub Sponsors. Ελπίζουμε να απολαμβάνεις τον Elk!",
"desc_para4": "Ο Elk είναι Ανοιχτού Κώδικα. Αν θες να βοηθήσεις με την αποσφαλμάτωση, να προσφέρεις σχόλια ή να συνεισφέρεις,",
"desc_para5": " βρες μας στο GitHub",
"desc_para6": " και αναμείξου.",
"footer_team": "Η ομάδα του Elk",
"title": "Ο Elk είναι σε προεπισκόπηση!"
},
"language": {
"search": "Αναζήτηση"
},
"list": {
"add_account": "Προσθήκη λογαριασμού στη λίστα",
"cancel_edit": "Ακύρωση επεξεργασίας",
"clear_error": "Εκκαθάριση σφάλματος",
"create": "Δημιουργία",
"delete": "Διαγραφή λίστας",
"delete_error": "Υπήρξε ένα σφάλμα κατά τη διαγραφή της λίστας",
"edit": "Επεξεργασία αυτής της λίστας",
"edit_error": "Παρουσιάστηκε σφάλμα κατά την ενημέρωση της λίστας",
"error": "Παρουσιάστηκε ένα σφάλμα κατά τη δημιουργία της λίστας",
"error_prefix": "Σφάλμα: ",
"list_title_placeholder": "Τίτλος λίστας",
"modify_account": "Τροποποίηση λιστών με λογαριασμό",
"remove_account": "Αφαίρεση λογαριασμού από τη λίστα",
"save": "Αποθήκευση αλλαγών"
},
"magic_keys": {
"dialog_header": "Συντομεύσεις πληκτρολογίου",
"groups": {
"actions": {
"boost": "Ενίσχυση",
"command_mode": "Λειτουργία εντολών",
"compose": "Σύνταξη",
"favourite": "Αγαπημένο",
"search": "Αναζήτηση",
"show_new_items": "Εμφάνιση νέων αντικειμένων",
"title": "Ενέργειες"
},
"media": {
"title": "Πολυμέσα"
},
"navigation": {
"go_to_bookmarks": "Σελιδοδείκτες",
"go_to_conversations": "Συζητήσεις",
"go_to_explore": "Εξερεύνηση",
"go_to_favourites": "Αγαπημένα",
"go_to_federated": "Σε ομοσπονδία",
"go_to_home": "Αρχική",
"go_to_lists": "Λίστες",
"go_to_local": "Τοπικό",
"go_to_notifications": "Ειδοποιήσεις",
"go_to_profile": "Προφίλ",
"go_to_search": "Αναζήτηση",
"go_to_settings": "Ρυθμίσεις",
"next_status": "Επόμενη ανάρτηση",
"previous_status": "Προηγούμενη ανάρτηση",
"shortcut_help": "Συντόμευση βοήθεια",
"title": "Πλοήγηση"
}
},
"sequence_then": "τότε"
},
"menu": {
"add_personal_note": "Προσθήκη προσωπικής σημείωσης σε {0}",
"block_account": "Αποκλεισμός {0}",
"block_domain": "Αποκλεισμός τομέα {0}",
"copy_link_to_post": "Αντιγραφή συνδέσμου σε αυτήν την ανάρτηση",
"copy_original_link_to_post": "Αντιγραφή αρχικού συνδέσμου σε αυτή την ανάρτηση",
"delete": "Διαγραφή",
"delete_and_redraft": "Διαγραφή & επαναδημιουργία",
"direct_message_account": "Άμεσο μήνυμα {0}",
"edit": "Επεξεργασία",
"hide_reblogs": "Απόκρυψη ενισχύσεων από {0}",
"mention_account": "Επισήμανση {0}",
"mute_account": "Σίγαση {0}",
"mute_conversation": "Σίγαση αυτής της ανάρτησης",
"open_in_original_site": "Άνοιγμα σε αρχικό ιστότοπο",
"pin_on_profile": "Καρφίτσωμα στο προφίλ",
"remove_personal_note": "Αφαίρεση προσωπικής σημείωσης {0}",
"report_account": "Αναφορά {0}",
"share_account": "Κοινοποίηση {0}",
"share_post": "Κοινοποίηση αυτής της ανάρτησης",
"show_favourited_and_boosted_by": "Εμφάνιση αυτών που το ενίσχυσαν ή το επισήμαναν ως αγαπημένο ",
"show_reblogs": "Εμφάνιση ενισχύσεων από {0}",
"show_untranslated": "Εμφάνιση μη μεταφρασμένου",
"toggle_theme": {
"dark": "Εναλλαγή σε σκοτεινή λειτουργία",
"light": "Εναλλαγή σε φωτεινή λειτουργία"
},
"translate_post": "Μετάφραση ανάρτησης",
"unblock_account": "Άρση αποκλεισμού {0}",
"unblock_domain": "Άρση αποκλεισμού τομέα {0}",
"unfollow_account": "Άρση ακολούθησης {0}",
"unmute_account": "Άρση σίγασης {0}",
"unmute_conversation": "Άρση σίγασης αυτής της ανάρτησης",
"unpin_on_profile": "Ξεκαρφίτσωμα από το προφίλ"
},
"modals": {
"aria_label_close": "Κλείσιμο"
},
"nav": {
"back": "Πίσω",
"blocked_domains": "Αποκλεισμένοι τομείς",
"blocked_users": "Αποκλεισμένοι χρήστες",
"bookmarks": "Σελιδοδείκτες",
"built_at": "Δημιουργήθηκε {0}",
"compose": "Σύνταξη",
"conversations": "Συζητήσεις",
"explore": "Εξερεύνηση",
"favourites": "Αγαπημένα",
"federated": "Σε ομοσπονδία",
"hashtags": "Ετικέτες",
"home": "Αρχική",
"list": "Λίστα",
"lists": "Λίστες",
"local": "Τοπικό",
"muted_users": "Χρήστες σε σίγαση",
"notifications": "Ειδοποιήσεις",
"privacy": "Ιδιωτικότητα",
"profile": "Προφίλ",
"search": "Αναζήτηση",
"select_feature_flags": "Εναλλαγή σημαιών δυνατοτήτων",
"select_font_size": "Μέγεθος γραμματοσειράς",
"select_language": "Επιλογή γλώσσας εμφάνισης",
"settings": "Ρυθμίσεις",
"show_intro": "Εμφάνιση εισαγωγής",
"toggle_theme": "Εναλλαγή θέματος",
"zen_mode": "Λειτουργία Ζεν"
},
"notification": {
"favourited_post": "Επισήμανε την ανάρτηση σου ως αγαπημένη",
"followed_you": "σε ακολούθησε",
"followed_you_count": "{0} άτομα σε ακολούθησαν|{0} άτομο σε ακολούθησε|{0} άτομα σε ακολούθησαν",
"missing_type": "ΛΕΙΠΕΙ ειδοποίηση.τύπος:",
"reblogged_post": "ενίσχυσε την ανάρτησή σου",
"reported": "Ο χρήστης {0} ανέφερε {1}",
"request_to_follow": "αιτήθηκε να σε ακολουθήσει",
"signed_up": "έκανε εγγραφή",
"update_status": "ενημέρωσε την ανάρτησή του"
},
"placeholder": {
"content_warning": "Γράψε την προειδοποίησή σου εδώ",
"default_1": "Τί σκέφτεσαι;",
"reply_to_account": "Απάντηση σε {0}",
"replying": "Απαντάται"
},
"polls": {
"allow_multiple": "Επιτρέπεται πολλαπλή επιλογή",
"cancel": "Ακύρωση",
"create": "Δημιουργία δημοσκόπησης",
"disallow_multiple": "Να μην επιτρέπεται πολλαπλή επιλογή",
"expiration": "Λήξη δημοσκόπησης",
"hide_votes": "Απόκρυψη συνολικών ψήφων μέχρι το τέλος",
"option_placeholder": "Επιλογή δημοσκόπησης {current}/{max}",
"remove_option": "Αφαίρεση επιλογής",
"settings": "Επιλογές δημοσκόπησης",
"show_votes": "Εμφάνιση συνολικών ψήφων πάντα"
},
"pwa": {
"dismiss": "Απόρριψη",
"install": "Εγκατάσταση",
"install_title": "Εγκατάσταση Elk",
"screenshots": {
"dark": "Στιγμιότυπο του Elk σε σκοτεινή λειτουργία",
"light": "Στιγμιότυπο του Elk σε φωτεινή λειτουργία"
},
"title": "Νέα διαθέσιμη ενημέρωση του Elk!",
"update": "Ενημέρωση",
"update_available_short": "Ενημέρωση του Elk",
"webmanifest": {
"canary": {
"description": "Ένας ελαφρώς προσαρμοσμένος πελάτης για το Mastodon (canary)",
"name": "Elk (canary)",
"short_name": "Elk (canary)"
},
"dev": {
"description": "Ένας ελαφρώς προσαρμοσμένος πελάτης για το Mastodon (dev)",
"name": "Elk (dev)",
"short_name": "Elk (dev)"
},
"preview": {
"description": "Ένας ελαφρώς προσαρμοσμένος πελάτης για το Mastodon (preview)",
"name": "Elk (preview)",
"short_name": "Elk (preview)"
},
"release": {
"description": "Ένας ελαφρώς προσαρμοσμένος πελάτης για το Mastodon",
"name": "Elk",
"short_name": "Elk"
}
}
},
"report": {
"additional_comments": "Επιπρόσθετα σχόλια",
"another_server": "Ο χρήστης που αναφέρεις είναι από άλλο διακομιστή",
"anything_else": "Υπάρχει κάτι άλλο που πιστεύεις ότι πρέπει να γνωρίζουμε;",
"block_desc": "Δεν θα βλέπεις πλέον καμία ανάρτηση από αυτόν τον χρήστη. Δεν θα μπορεί να δει τις αναρτήσεις σου ή να σε ακολουθήσει. Θα μπορεί να διαπιστώσει ότι έχει αποκλειστεί.",
"dontlike": "Δεν μου αρέσει",
"dontlike_desc": "Δεν είναι κάτι που θες να βλέπεις",
"forward": "Ναι, προώθηση αυτής της αναφοράς σε {0}",
"forward_question": "Θες να στείλεις ένα ανώνυμο αντίγραφο αυτής της αναφοράς και σε εκείνον τον διακομιστή;",
"further_actions": {
"limit": {
"description": "Ορίστε οι επιλογές σου για τον έλεγχο του τί βλέπεις:",
"title": "Δε θες να το βλέπεις αυτό;"
},
"report": {
"description": "Όσο το εξετάζουμε, ορίστε μερικές ενέργειες που μπορείς να κάνεις:",
"title": "Ευχαριστούμε για την αναφορά, θα το κοιτάξουμε"
}
},
"limiting": "Περιορίζεται ο χρήστης {0}",
"mute_desc": "Δεν θα βλέπεις πλέον αναρτήσεις από αυτόν τον χρήστη. Μπορεί ακόμα να σε ακολουθήσει και να βλέπει τις αναρτήσεις σου. Δεν θα ξέρει ότι είναι σε σίγαση.",
"other": "Είναι κάτι άλλο",
"other_desc": "Το ζήτημα δεν ταιριάζει στις άλλες κατηγορίες",
"reporting": "Γίνεται αναφορά του χρήστη {0}",
"select_many": "Επίλεξε όλα όσα ισχύουν:",
"select_one": "Διάλεξε τη καλύτερη αντιστοίχιση:",
"select_posts": "Υπάρχει κάποια ανάρτηση που υποστηρίζει αυτή την αναφορά;",
"select_posts_other": "Υπάρχουν άλλες αναρτήσεις που υποστηρίζουν αυτή την αναφορά;",
"spam": "Είναι σπαμ",
"spam_desc": "Επιβλαβείς σύνδεσμοι, ψεύτικη αλληλεπίδραση ή επαναλαμβανόμενες απαντήσεις",
"submit": "Καταχώριση Αναφοράς",
"unfollow_desc": "Δεν θα βλέπεις πλέον αναρτήσεις από αυτόν τον χρήστη στην αρχική ροή σου. Μπορεί να βλέπεις τις αναρτήσεις του αλλού.",
"violation": "Παραβιάζει τουλάχιστον ένα κανόνα του διακομιστή",
"whats_wrong_account": "Πες μας τί πάει στραβά με αυτόν τον λογαριασμό",
"whats_wrong_post": "Πες μας τί πάει στραβά με αυτή την ανάρτηση"
},
"search": {
"search_desc": "Αναζήτησε για άτομα & ετικέτες",
"search_empty": "Δεν βρέθηκε τίποτα με αυτούς τους όρους αναζήτησης"
},
"settings": {
"about": {
"built_at": "Δομήθηκε",
"label": "Σχετικά",
"meet_the_team": "Γνώρισε την ομάδα",
"sponsor_action": "Χορήγησέ μας",
"sponsor_action_desc": "Για να υποστηρίξεις την ομάδα που αναπτύσσει το Elk",
"sponsors": "Χορηγοί",
"sponsors_body_1": "Ο Elk έγινε πραγματικότητα χάρη στις γενναιόδωρες χορηγίες και βοήθεια των:",
"sponsors_body_2": "Και όλες τις εταιρείες και άτομα που χορήγησαν στην ομάδα του Elk και των μελών της.",
"sponsors_body_3": "Αν απολαμβάνεις την εφαρμογή, σκέψου να μας χορηγήσεις:",
"version": "Έκδοση"
},
"account_settings": {
"description": "Επεξεργάσου τις ρυθμίσεις του λογαριασμού σου στο UI του Mastodon",
"label": "Ρυθμίσεις λογαριασμού"
},
"interface": {
"color_mode": "Λειτουργία Χρώματος",
"dark_mode": "Σκοτεινό",
"default": " (προεπιλογή)",
"font_size": "Μέγεθος Γραμματοσειράς",
"label": "Διεπαφή",
"light_mode": "Φωτεινό",
"system_mode": "Σύστημα",
"theme_color": "Χρώμα Θέματος"
},
"language": {
"display_language": "Γλώσσα Εμφάνισης",
"label": "Γλώσσα",
"post_language": "Γλώσσα ανάρτησης",
"status": "Κατάσταση μετάφρασης: {0}/{1} ({2}%)",
"translations": {
"add": "Προσθήκη",
"choose_language": "Επίλεξε γλώσσα",
"heading": "Μεταφράσεις",
"hide_specific": "Απόκρυψη συγκεκριμένων μεταφράσεων",
"remove": "Remove"
}
},
"notifications": {
"label": "Ειδοποιήσεις",
"notifications": {
"label": "Ρυθμίσεις ειδοποιήσεων"
},
"push_notifications": {
"alerts": {
"favourite": "Αγαπημένα",
"follow": "Νέοι ακόλουθοι",
"mention": "Αναφορές",
"poll": "Δημοσκοπήσεις",
"reblog": "Ενισχύσεις",
"title": "Τί ειδοποιήσεις να λαμβάνω;"
},
"description": "Λήψη ειδοποιήσεων ακόμα και όταν δεν χρησιμοποιείς τον Elk.",
"instructions": "Μη ξεχάσεις να αποθηκεύσεις τις αλλαγές σου χρησιμοποιώντας το κουμπί @:settings.notifications.push_notifications.save_settings !",
"label": "Ρυθμίσεις ειδοποιήσεων Push",
"policy": {
"all": "Από όλους",
"followed": "Από άτομα που ακολουθώ",
"follower": "Από άτομα που με ακολουθούν",
"none": "Από κανένα",
"title": "Από ποιον μπορώ να λαμβάνω ειδοποιήσεις;"
},
"save_settings": "Αποθήκευση ρυθμίσεων",
"subscription_error": {
"clear_error": "Εκκαθάριση σφάλματος",
"error_hint": "Μπορείς να συμβουλευτείς τη λίστα των συχνών ερωτήσεων για να προσπαθήσεις να λύσεις το πρόβλημα: {0}.",
"invalid_vapid_key": "Το δημόσιο κλειδί VAPID φαίνεται να είναι άκυρο.",
"permission_denied": "Απορρίφθηκε άδεια: ενεργοποίησε τις ειδοποιήσεις στον περιηγητή σου.",
"repo_link": "Το αποθετήριο του Elk στο GitHub",
"request_error": "Προέκυψε σφάλμα κατά την αίτηση της εγγραφής, προσπάθησε ξανά και αν το σφάλμα παραμένει, παρακαλώ ανέφερε το ζήτημα στο αποθετήριο του Elk.",
"title": "Δε μπορούσες να κάνεις εγγραφή για ειδοποιήσεις push",
"too_many_registrations": "Λόγω περιορισμών του περιηγητή, ο Elk δε μπορεί να χρησιμοποιήσει την υπηρεσία ειδοποιήσεων push για πολλαπλούς λογαριασμούς σε διαφορετικούς διακομιστές. Πρέπει να καταργήσεις την εγγραφή από τις ειδοποιήσεις push σε έναν άλλο λογαριασμό και να προσπαθήσεις ξανά.",
"vapid_not_supported": "Ο περιηγητής σου υποστηρίζει Ειδοποιήσεις Ιστοτόπου Push αλλά, δε φαίνεται να υλοποιεί το πρωτόκολλο VAPID."
},
"title": "Ρυθμίσεις ειδοποιήσεων Push",
"undo_settings": "Αναίρεση αλλαγών",
"unsubscribe": "Απενεργοποίηση ειδοποιήσεων push",
"unsupported": "Ο περιηγητής σου δεν υποστηρίζει ειδοποιήσεις push.",
"warning": {
"enable_close": "Κλείσιμο",
"enable_description": "Για να λαμβάνεις ειδοποιήσεις όταν ο Elk δεν είναι ανοιχτός, ενεργοποίησε τις ειδοποιήσεις push. Μπορείς να ελέγξεις ακριβώς τί τύπου αλληλεπίδραση δημιουργεί ειδοποιήσεις push μέσω του κουμπιού \"@:settings.notifications.show_btn{'\"'} παραπάνω, μόλις ενεργοποιηθεί.",
"enable_description_desktop": "Για να λαμβάνεις ειδοποιήσεις όταν ο Elk δεν είναι ανοιχτός, ενεργοποίησε τις ειδοποιήσεις push. Μπορείς να χειρίζεσαι με ακρίβεια τί είδους αλληλεπιδράσεις δημιουργούν ειδοποιήσεις push στο \"Ρυθμίσεις > Ειδοποιήσεις > Ρυθμίσεις ειδοποιήσεων push\" μόλις ενεργοποιηθούν.",
"enable_description_mobile": "Μπορείς να έχεις πρόσβαση στις ειδοποιήσεις χρησιμοποιώντας το μενού πλοήγησης \"Ρυθμίσεις > Ειδοποιήσεις > Ρυθμίσεις ειδοποιήσεων\".",
"enable_description_settings": "Για να λαμβάνεις ειδοποιήσεις όταν ο Elk δεν είναι ανοιχτός, ενεργοποίησε τις ειδοποιήσεις push. Μπορείς να ελέγξεις ακριβώς τί τύπου αλληλεπίδραση δημιουργεί ειδοποιήσεις push σε αυτή την οθόνη, μόλις τις ενεργοποιήσεις.",
"enable_desktop": "ενεργοποίησε τις ειδοποιήσεις push",
"enable_title": "Μη χάσεις τίποτα",
"re_auth": "Από ό,τι φαίνεται, ο διακομιστής σου δεν υποστηρίζει ειδοποιήσεις push. Δοκίμασε να αποσυνδεθείς και να συνδεθείς ξανά και αν το μήνυμα παραμένει, επικοινώνησε με τον διαχειριστή του διακομιστή σου."
}
},
"show_btn": "Πήγαινε στις ρυθμίσεις ειδοποιήσεων",
"under_construction": "Υπό κατασκευή"
},
"notifications_settings": "Ειδοποιήσεις",
"preferences": {
"embedded_media": "Ενσωματωμένος Αναπαραγωγέας Πολυμέσων",
"embedded_media_description": "Προβάλλει έναν Ενσωματωμένο αναπαραγωγέα αντί για την κανονική κάρτα προεπισκόπησης όταν γίνεται επέκταση κοινοποιημένων συνδέσμων ροής.",
"enable_autoplay": "Ενεργοποίηση Αυτόματης αναπαραγωγής",
"enable_data_saving": "Ενεργοποίηση εξοικονόμησης δεδομένων",
"enable_data_saving_description": "Εξοικονόμησε δεδομένα αποτρέποντας τα συνημμένα από το να φορτώνουν αυτόματα.",
"enable_pinch_to_zoom": "Ενεργοποίηση του τσίμπημα για ζουμ",
"github_cards": "Κάρτες GitHub",
"github_cards_description": "Όταν ένας σύνδεσμος GitHub αναρτάται, εμφανίζεται μια προσβάσιμη κάρτα HTML που χρησιμοποιεί μεταδεδομένα κοινωνικών γράφων αντί για την κοινωνική εικόνα.",
"grayscale_mode": "Λειτουργία κλίμακα του γκρι",
"hide_account_hover_card": "Απόκρυψη αιωρούμενης κάρτας λογαριασμού",
"hide_alt_indi_on_posts": "Απόκρυψη ένδειξης ενλ στις αναρτήσεις",
"hide_boost_count": "Απόκρυψη αριθμού ενισχύσεων",
"hide_favorite_count": "Απόκρυψη αριθμού αγαπημένων",
"hide_follower_count": "Απόκρυψη αριθμού ακολούθων/ακολουθούμενων",
"hide_news": "Απόκρυψη ειδήσεων",
"hide_reply_count": "Απόκρυψη αριθμού απαντήσεων",
"hide_tag_hover_card": "Απόκρυψη αιωρούμενης κάρτας ετικέτας",
"hide_translation": "Απόκρυψη μετάφρασης",
"hide_username_emojis": "Απόκρυψη εμότζι στο όνομα χρήστη",
"hide_username_emojis_description": "Κρύβει τα εμότζι στις από τα ονόματα χρήστη στις ροές. Τα εμότζι θα είναι ορατά στα προφίλ τους.",
"label": "Προτιμήσεις",
"optimize_for_low_performance_device": "Βελτιστοποίηση γισ συσκευές χαμηλών επιδόσεων",
"title": "Πειραματικές Λειτουργίες",
"use_star_favorite_icon": "Χρήση εικονιδίου αστεριού για αγαπημένα",
"user_picker": "Επιλογέας Χρήστη",
"user_picker_description": "Εμφανίζει όλα τα άβαταρ των συνδεδεμένων λογαριασμών κάτω αριστερά για να μπορείς να εναλλάξεις μεταξύ τους εύκολα.",
"virtual_scroll": "Εικονική Κύλιση",
"virtual_scroll_description": "Χρήστη εικονικής λίστας στις ροές, ώστε να εμφανίζεται μεγαλύτερος αριθμός αντικειμένων αποδοτικότερα.",
"wellbeing": "Ψηφιακή Ευεξία",
"zen_mode": "Λειτουργία Ζεν",
"zen_mode_description": "Κρύβει τα πλαϊνά πεδία εκτός αν τοποθετηθεί το ποντίκι επάνω τους. Επίσης, κρύβει μερικά στοιχεία από τη ροή."
},
"profile": {
"appearance": {
"bio": "Βιογραφικό",
"description": "Επεξεργασία άβαταρ, ονόματος χρήστη, προφίλ κτλ.",
"display_name": "Εμφανιζόμενο όνομα",
"label": "Εμφάνιση",
"profile_metadata": "Μεταδεδομένα προφίλ",
"profile_metadata_desc": "Μπορείς να έχεις μέχρι {0} αντικείμενα εμφανιζόμενα σε πίνακα στο προφίλ σου",
"profile_metadata_label": "Ετικέτα",
"profile_metadata_value": "Περιεχόμενο",
"title": "Επεξεργασία προφίλ"
},
"featured_tags": {
"description": "Άτομα μπορούν να περιηγηθούν στις δημόσιες αναρτήσεις μέσω αυτών των ετικετών.",
"label": "Παρεχόμενες ετικέτες",
"under_construction": "Υπό κατασκευή"
},
"label": "Προφίλ"
},
"select_a_settings": "Επίλεξε μία ρύθμιση",
"users": {
"export": "Εξαγωγή Αναγνωριστικών Χρήστη",
"import": "Εισαγωγή Αναγνωριστικών Χρήστη",
"label": "Συνδεδεμένοι χρήστες"
}
},
"share_target": {
"description": "Ο Elk μπορεί να ρυθμιστεί έτσι ώστε να μπορείς να κοινοποιήσεις περιεχόμενο από άλλες εφαρμογές, απλά εγκατέστησε τον Elk στη συσκευή σου και συνδέσου.",
"hint": "Για να κοινοποιήσεις περιεχόμενο με τον Elk, πρέπει να είναι εγκατεστημένος και να έχεις συνδεθεί.",
"title": "Κοινοποίησε με τον Elk"
},
"state": {
"attachments_exceed_server_limit": "Ο αριθμός των συνημμένων ξεπερνάει το όριο ανά ανάρτηση.",
"attachments_limit_error": "Το όριο ανά ανάρτηση ξεπεράστηκε",
"edited": "(Επεξεργάστηκε)",
"editing": "Επεξεργάζεται",
"loading": "Φόρτωση...",
"publish_failed": "Η δημοσίευση απέτυχε",
"publishing": "Δημοσιεύεται",
"save_failed": "Η αποθήκευση απέτυχε",
"upload_failed": "Η μεταφόρτωση απέτυχε",
"uploading": "Μεταμόρφωση..."
},
"status": {
"account": {
"suspended_message": "Ο λογαριασμός αυτής της ανάρτησης έχει ανασταλεί.",
"suspended_show": "Εμφάνιση περιεχομένου ούτως ή άλλως;"
},
"boosted_by": "Ενισχύθηκε από",
"edited": "Επεξεργάστηκε {0}",
"embedded_warning": "Η αναπαραγωγή αυτού ίσως αποκαλύψει την διεύθυνση IP σου σε άλλους.",
"favourited_by": "Αγαπημένο από",
"filter_hidden_phrase": "Φιλτραρισμένο από",
"filter_show_anyway": "Εμφάνιση ούτως ή άλλως",
"img_alt": {
"ALT": "ΕΝΛ",
"desc": "Περιγραφή",
"dismiss": "Απόρριψη",
"read": "Ανάγνωση {0} περιγραφής"
},
"poll": {
"count": "{0} ψήφοι|{0} ψήφος|{0} ψήφοι",
"ends": "μέχρι {0}",
"finished": "ολοκληρώθηκε στις {0}"
},
"replying_to": "Απάντηση σε {0}",
"show_full_thread": "Εμφάνιση Πλήρους Νήματος",
"someone": "κάποιος",
"spoiler_media_hidden": "Κρυμμένα πολυμέσα",
"spoiler_show_less": "Εμφάνιση λιγότερων",
"spoiler_show_more": "Εμφάνιση περισσότερων",
"thread": "Νήμα",
"try_original_site": "Δοκίμασε την αρχική ιστοσελίδα"
},
"status_history": {
"created": "Δημιουργήθηκε στις {0}",
"edited": "επεξεργάστηκε στις {0}"
},
"tab": {
"accounts": "Λογαριασμοί",
"for_you": "Για σένα",
"hashtags": "Ετικέτες",
"list": "Λίστα",
"media": "Πολυμέσα",
"news": "Ειδήσεις",
"notifications_admin": {
"report": "Αναφορά",
"sign_up": "Εγγραφή"
},
"notifications_all": "Όλα",
"notifications_favourite": "Αγαπημένα",
"notifications_follow": "Ακολουθείς",
"notifications_follow_request": "Αιτήματα ακολούθησης",
"notifications_mention": "Αναφορές",
"notifications_more_tooltip": "Φιλτράρισμα ειδοποιήσεων βάσει τύπου",
"notifications_poll": "Δημοσκόπηση",
"notifications_reblog": "Ενίσχυση",
"notifications_status": "Κατάσταση",
"notifications_update": "Ενημέρωση",
"posts": "Αναρτήσεις",
"posts_with_replies": "Αναρτήσεις & Απαντήσεις"
},
"tag": {
"follow": "Ακολούθησε",
"follow_label": "Ακολούθησε την ετικέτα {0}",
"unfollow": "Άρση ακολούθησης",
"unfollow_label": "Άρση ακολούθησης ετικέτας {0}"
},
"time_ago_options": {
"day_future": "σε 0 ημέρες|αύριο|σε {n} ημέρες",
"day_past": "0 ημέρες πριν|χθες|{n} ημέρες πριν",
"hour_future": "σε 0 ώρες|σε 1 ώρα|σε {n} ώρες",
"hour_past": "0 ώρες πριν|1 ώρα πριν|{n} ώρες πριν",
"just_now": "μόλις τώρα",
"minute_future": "σε 0 λεπτά|σε 1 λεπτό|σε {n} λεπτά",
"minute_past": "0 λεπτά πριν|1 λεπτό πριν|{n} λεπτά πριν",
"month_future": "σε 0 μήνες|τον επόμενο μήνα|σε {n} μήνες",
"month_past": "0 μήνες πριν|τον προηγούμενο μήνα|{n} μήνες πριν",
"second_future": "μόλις τώρα|σε {n} δευτερόλεπτο|σε {n} δευτερόλεπτα",
"second_past": "μόλις τώρα|{n} δευτερόλεπτο πριν|{n} δευτερόλεπτα πριν",
"short_day_future": "σε {n}η",
"short_day_past": "{n}η",
"short_hour_future": "σε {n}ώ",
"short_hour_past": "{n}ώ",
"short_minute_future": "σε {n}λ",
"short_minute_past": "{n}λ",
"short_month_future": "σε {n}μήν",
"short_month_past": "{n}μήν",
"short_second_future": "σε {n}δ",
"short_second_past": "{n}δ",
"short_week_future": "σε {n}εβδ",
"short_week_past": "{n}εβδ",
"short_year_future": "σε {n}χ",
"short_year_past": "{n}χ",
"week_future": "σε 0 εβδομάδες|την επόμενη εβδομάδα|σε {n} εβδομάδες",
"week_past": "0 εβδομάδες πριν|την προηγούμενη εβδομάδα|{n} εβδομάδες πριν",
"year_future": "σε 0 χρόνια|τον επόμενο χρόνο|σε {n} χρόνια",
"year_past": "0 χρόνια πριν|πέρυσι|{n} χρόνια πριν"
},
"timeline": {
"show_new_items": "Εμφάνιση {v} νέων αντικειμένων|Εμφάνιση {v} νέου αντικειμένου|Εμφάνιση {v} νέων αντικειμένων",
"view_older_posts": "Παλιότερες αναρτήσεις από άλλες οντότητες ίσως δεν εμφανίζονται."
},
"title": {
"federated_timeline": "Ροή Ομοσπονδίας",
"local_timeline": "Τοπική Ροή"
},
"tooltip": {
"add_content_warning": "Προσθήκη προειδοποίησης περιεχομένου",
"add_emojis": "Προσθήκη εμότζι",
"add_media": "Προσθήκη εικόνων, βίντεο ή αρχείου ήχου",
"add_publishable_content": "Προσθήκη περιεχομένου προς δημοσίευση",
"change_content_visibility": "Αλλαγή ορατότητας περιεχομένου",
"change_language": "Αλλαγή γλώσσας",
"emoji": "Εμότζι",
"explore_links_intro": "Αυτές οι νέες ιστορίες συζητιούνται, αυτή τη στιγμή, από άτομα σε αυτόν και σε άλλους διακομιστές στο αποκεντρωμένο δίκτυο.",
"explore_posts_intro": "Αυτές οι αναρτήσεις λαμβάνουν προσοχή, αυτή τη στιγμή, από αυτόν και από άλλους διακομιστές σε αυτόν τον διακομιστή.",
"explore_tags_intro": "Αυτές οι ετικέτες λαμβάνουν προσοχή, αυτή τη στιγμή, από άτομα σε αυτόν και από άλλους διακομιστές του αποκεντρωμένου δικτύου.",
"open_editor_tools": "Εργαλεία συντάκτη",
"pick_an_icon": "Επιλογή ενός εικονιδίου",
"publish_failed": "Κλείσιμο αποτυχημένων μηνυμάτων στο πάνω μέρος του συντάκτη για επαναδημοσίευση αναρτήσεων",
"toggle_bold": "Εναλλαγή έντονης γραφής",
"toggle_code_block": "Εναλλαγή μπλοκ κώδικα",
"toggle_italic": "Εναλλαγή πλάγιας γραφής"
},
"user": {
"add_existing": "Προσθήκη υπάρχοντος λογαριασμού",
"server_address_label": "Διεύθυνση Διακομιστή Mastodon",
"sign_in_desc": "Συνδέσου για να ακολουθείς προφίλ ή ετικέτες, αγάπησε, μοιράσου και απάντησε σε αναρτήσεις ή αλληλεπίδρασε από τον λογαριασμό σου σε διαφορετικό διακομιστή.",
"sign_in_notice_title": "Προβολή δημοσίων δεδομένων {0}",
"sign_out_account": "Αποσύνδεση {0}",
"single_instance_sign_in_desc": "Συνδέσου για να ακολουθείς προφίλ ή ετικέτες, αγάπησε, μοιράσου και απάντησε σε αναρτήσεις.",
"tip_no_account": "Αν δεν έχεις ακόμα λογαριασμό στο Mastodon, {0}.",
"tip_register_account": "Επίλεξε τον διακομιστή σου και εγγράψου"
},
"visibility": {
"direct": "Άμεση",
"direct_desc": "Ορατή μόνο σε αναφερόμενους χρήστες",
"private": "Μόνο ακόλουθους",
"private_desc": "Ορατή μόνο σε ακόλουθους",
"public": "Δημόσια",
"public_desc": "Ορατή για όλους",
"unlisted": "Μη καταχωρημένη",
"unlisted_desc": "Ορατή για όλους, αλλά δεν εμφανίζεται σε ροές ανακάλυψης"
}
}

View file

@ -73,6 +73,7 @@
"favourited": "Favorited", "favourited": "Favorited",
"more": "More", "more": "More",
"next": "Next", "next": "Next",
"open_image_preview_dialog": "Open image preview dialog",
"prev": "Prev", "prev": "Prev",
"publish": "Publish", "publish": "Publish",
"publish_thread": "Publish thread", "publish_thread": "Publish thread",

View file

@ -73,6 +73,7 @@
"favourited": "Marcado como favorita", "favourited": "Marcado como favorita",
"more": "Más", "more": "Más",
"next": "Siguiente", "next": "Siguiente",
"open_image_preview_dialog": "Abrir diálogo de vista previa de la imagen",
"prev": "Anterior", "prev": "Anterior",
"publish": "Publicar", "publish": "Publicar",
"publish_thread": "Publicar hilo", "publish_thread": "Publicar hilo",
@ -217,11 +218,12 @@
"create": "Crear", "create": "Crear",
"delete": "Eliminar esta lista", "delete": "Eliminar esta lista",
"delete_error": "Se produjo un error eliminando la lista", "delete_error": "Se produjo un error eliminando la lista",
"edit": "Ediar esta lista", "edit": "Editar esta lista",
"edit_error": "Se produjo un error modificando la lista", "edit_error": "Se produjo un error modificando la lista",
"error": "Se produjo un error creando la lista", "error": "Se produjo un error creando la lista",
"error_prefix": "Error: ", "error_prefix": "Error: ",
"list_title_placeholder": "Título de la lista", "list_title_placeholder": "Título de la lista",
"manage": "Administrar listas",
"modify_account": "Modificar listas con cuenta", "modify_account": "Modificar listas con cuenta",
"remove_account": "Eliminar cuenta de la lista", "remove_account": "Eliminar cuenta de la lista",
"save": "Guardar" "save": "Guardar"

View file

@ -73,6 +73,7 @@
"favourited": "Gogoko eginda", "favourited": "Gogoko eginda",
"more": "Gehiago", "more": "Gehiago",
"next": "Hurrengoa", "next": "Hurrengoa",
"open_image_preview_dialog": "Ireki irudiaren aurrebista-koadroa",
"prev": "Aurrekoa", "prev": "Aurrekoa",
"publish": "Argitaratu", "publish": "Argitaratu",
"publish_thread": "Argitaratu haria", "publish_thread": "Argitaratu haria",
@ -469,7 +470,7 @@
"how_to_contribute": "Nola lagun dezaket?", "how_to_contribute": "Nola lagun dezaket?",
"label": "Hizkuntza", "label": "Hizkuntza",
"post_language": "Bidalketen hizkuntza", "post_language": "Bidalketen hizkuntza",
"status": "Itzulpenaren egoera: {1} kateetatik {0} itzulita (%{2}a)", "status": "Itzulpenaren egoera: {1} kateetatik {0} itzulita ({'%'}{2}a)",
"translations": { "translations": {
"add": "Gehitu", "add": "Gehitu",
"choose_language": "Hautatu hizkuntza", "choose_language": "Hautatu hizkuntza",
@ -537,7 +538,7 @@
"embedded_media": "Kapsulatutako multimedia erreproduzigailua", "embedded_media": "Kapsulatutako multimedia erreproduzigailua",
"embedded_media_description": "Kapsulatutako erreproduzigailu bat erakusten du partekatutako multimedia jarioen estekak zabaltzean, ez aurrebista txartel arrunta.", "embedded_media_description": "Kapsulatutako erreproduzigailu bat erakusten du partekatutako multimedia jarioen estekak zabaltzean, ez aurrebista txartel arrunta.",
"enable_autoplay": "Gaitu erreproduzitze automatikoa", "enable_autoplay": "Gaitu erreproduzitze automatikoa",
"enable_data_saving": "Gaitu datu aurrezlea", "enable_data_saving": "Gaitu datu-aurrezlea",
"enable_data_saving_description": "Aurreztu datuak eranskinen kargatze-automatikoa galarazten.", "enable_data_saving_description": "Aurreztu datuak eranskinen kargatze-automatikoa galarazten.",
"enable_pinch_to_zoom": "Gaitu atximur keinua zoom egiteko", "enable_pinch_to_zoom": "Gaitu atximur keinua zoom egiteko",
"github_cards": "GitHub txartelak", "github_cards": "GitHub txartelak",
@ -547,30 +548,30 @@
"hide_alt_indi_on_posts": "Ezkutatu ALT adierazlea bidalketetan", "hide_alt_indi_on_posts": "Ezkutatu ALT adierazlea bidalketetan",
"hide_boost_count": "Ezkutatu bultzaden kopurua", "hide_boost_count": "Ezkutatu bultzaden kopurua",
"hide_favorite_count": "Ezkutatu gogokoen kopurua", "hide_favorite_count": "Ezkutatu gogokoen kopurua",
"hide_follower_count": "Ezkutatu jarraitzaile kopurua", "hide_follower_count": "Ezkutatu jarraitzaileen kopurua",
"hide_gif_indi_on_posts": "Ezkutatu GIF adierazlea bidalketetan", "hide_gif_indi_on_posts": "Ezkutatu GIF adierazlea bidalketetan",
"hide_news": "Ezkutatu berriak", "hide_news": "Ezkutatu berriak",
"hide_reply_count": "Ezkutatu erantzunen kopurua", "hide_reply_count": "Ezkutatu erantzunen kopurua",
"hide_tag_hover_card": "Ezkutatu traolen aurrebista-txartelak sagua gainetik pasatzean", "hide_tag_hover_card": "Ezkutatu traolen aurrebista-txartelak sagua gainetik pasatzean",
"hide_translation": "Ezkutatu itzulpenak", "hide_translation": "Ezkutatu itzulpenak",
"hide_username_emojis": "Ezkutatu emojiak erabiltzaile izenetan", "hide_username_emojis": "Ezkutatu emojiak erabiltzaile-izenetan",
"hide_username_emojis_description": "Denbora-lerroetan erabiltzaile izenetako emojiak ezkutatzen ditu. Emojiak ikusgai egoten jarraituko dute euren profiletan.", "hide_username_emojis_description": "Denbora-lerroetan erabiltzaile-izenetako emojiak ezkutatzen ditu. Emojiak ikusgai egoten jarraituko dute euren profiletan.",
"label": "Hobespenak", "label": "Hobespenak",
"optimize_for_low_performance_device": "Optimizatu errendimendu baxuko gailuetarako", "optimize_for_low_performance_device": "Optimizatu errendimendu baxuko gailuetarako",
"title": "Ezaugarri esperimentalak", "title": "Ezaugarri esperimentalak",
"use_star_favorite_icon": "Erabili izarraren ikonoa gogokoetarako", "use_star_favorite_icon": "Erabili izarraren ikonoa gogokoetarako",
"user_picker": "Erabiltzaile hautatzailea", "user_picker": "Erabiltzaile-hautatzailea",
"user_picker_description": "Beheko ezkerreko aldean saioa hasia duten kontuen abatar guztiak erakusten ditu, haien artean azkar aldatu ahal dezazun.", "user_picker_description": "Beheko ezkerreko aldean saioa hasia duten kontuen abatar guztiak erakusten ditu, haien artean azkar aldatu ahal dezazun.",
"virtual_scroll": "Korritze birtuala", "virtual_scroll": "Korritze birtuala",
"virtual_scroll_description": "Zerrenda birtual bat erabiltzen du denbora-lerroetan, item kopuru handiagoa modu eraginkorrean erakutsi ahal izateko.", "virtual_scroll_description": "Zerrenda birtual bat erabiltzen du denbora-lerroetan, item kopuru handiagoa modu eraginkorrean erakutsi ahal izateko.",
"wellbeing": "Ongizatea", "wellbeing": "Ongizatea",
"zen_mode": "ZEN modua", "zen_mode": "ZEN modua",
"zen_mode_description": "Aldamenetako elementuak ezkutatzen ditu xagua gainean jarri arte. Denbora-lerroko elementu batzuk ere ezkutatzen ditu." "zen_mode_description": "Aldamenetako elementuak ezkutatzen ditu sagua gainean jarri arte. Denbora-lerroko elementu batzuk ere ezkutatzen ditu."
}, },
"profile": { "profile": {
"appearance": { "appearance": {
"bio": "Bio", "bio": "Bio",
"description": "Editatu abatarra, erabiltzaile izena, profila, etab.", "description": "Editatu abatarra, erabiltzaile-izena, profila, etab.",
"display_name": "Pantaila izena", "display_name": "Pantaila izena",
"label": "Itxura", "label": "Itxura",
"profile_metadata": "Profileko metadatuak", "profile_metadata": "Profileko metadatuak",

View file

@ -7,7 +7,9 @@
"route_loaded": "Sivu {0} ladattu" "route_loaded": "Sivu {0} ladattu"
}, },
"account": { "account": {
"avatar_description": "Käyttäjän {0} avatar", "authorize": "Valtuuta seurataksesi",
"authorized": "Olet valtuuttanut pyynnön",
"avatar_description": "Käyttäjän {0} profiilikuva",
"blocked_by": "Tämä käyttäjä on estänyt sinut.", "blocked_by": "Tämä käyttäjä on estänyt sinut.",
"blocked_domains": "Estetyt verkkotunnukset", "blocked_domains": "Estetyt verkkotunnukset",
"blocked_users": "Estetyt käyttäjät", "blocked_users": "Estetyt käyttäjät",
@ -25,6 +27,7 @@
"follows_you": "Seuraa sinua", "follows_you": "Seuraa sinua",
"go_to_profile": "Siirry profiiliin", "go_to_profile": "Siirry profiiliin",
"joined": "Liittynyt", "joined": "Liittynyt",
"lock": "Lukittu",
"moved_title": "on siirtynyt uudelle tilille:", "moved_title": "on siirtynyt uudelle tilille:",
"muted_users": "Hiljennetyt käyttäjät", "muted_users": "Hiljennetyt käyttäjät",
"muting": "Hiljennetty", "muting": "Hiljennetty",
@ -35,14 +38,18 @@
"posts": "Julkaisut", "posts": "Julkaisut",
"posts_count": "{0} julkaisua|{0} julkaisu|{0} julkaisua", "posts_count": "{0} julkaisua|{0} julkaisu|{0} julkaisua",
"profile_description": "Käyttäjän {0} profiilin ylätunniste", "profile_description": "Käyttäjän {0} profiilin ylätunniste",
"profile_personal_note": "Henkilökohtainen muistiinpano", "profile_personal_note": "Henkilökohtainen merkintä",
"profile_unavailable": "Profiili ei saatavilla", "profile_unavailable": "Profiili ei saatavilla",
"reject": "Hylkää seuraamispyyntö",
"rejected": "Olet hylännyt pyynnön",
"request_follow": "Pyydä lupaa seurata", "request_follow": "Pyydä lupaa seurata",
"requested": "{0} on pyytänyt lupaa saada seurata sinua",
"unblock": "Poista esto", "unblock": "Poista esto",
"unfollow": "Älä seuraa", "unfollow": "Älä seuraa",
"unmute": "Poista hiljennys", "unmute": "Poista hiljennys",
"view_other_followers": "Seuraajat muilta palvelimilta eivät välttämättä näy.", "view_other_followers": "Seuraajat muilta palvelimilta eivät välttämättä näy.",
"view_other_following": "Seuratut muilta palvelimilta eivät välttämättä näy." "view_other_following": "Seuratut muilta palvelimilta eivät välttämättä näy.",
"withdraw_follow_request": "Peruuta seuraamispyyntö"
}, },
"action": { "action": {
"apply": "Käytä", "apply": "Käytä",
@ -51,6 +58,7 @@
"boost": "Tehosta", "boost": "Tehosta",
"boost_count": "{0}", "boost_count": "{0}",
"boosted": "Tehostettu", "boosted": "Tehostettu",
"clear": "Tyhjennä",
"clear_publish_failed": "Pyyhi julkaisuvirheet", "clear_publish_failed": "Pyyhi julkaisuvirheet",
"clear_save_failed": "Pyyhi tallennusvirheet", "clear_save_failed": "Pyyhi tallennusvirheet",
"clear_upload_failed": "Pyyhi tiedostojen lähetysvirheet", "clear_upload_failed": "Pyyhi tiedostojen lähetysvirheet",
@ -65,8 +73,10 @@
"favourited": "Lisätty suosikkeihin", "favourited": "Lisätty suosikkeihin",
"more": "Lisää", "more": "Lisää",
"next": "Seuraava", "next": "Seuraava",
"open_image_preview_dialog": "Avaa kuvan esikatseluikkuna",
"prev": "Edellinen", "prev": "Edellinen",
"publish": "Julkaise", "publish": "Julkaise",
"publish_thread": "Julkaise ketju",
"reply": "Vastaa", "reply": "Vastaa",
"reply_count": "{0}", "reply_count": "{0}",
"reset": "Palauta", "reset": "Palauta",
@ -88,7 +98,7 @@
"activate": "Valitse", "activate": "Valitse",
"complete": "Täydennä", "complete": "Täydennä",
"compose_desc": "Kirjoita uusi julkaisu", "compose_desc": "Kirjoita uusi julkaisu",
"n_people_in_the_past_n_days": "{0} ihmistä viime {1} päivän aikana", "n_people_in_the_past_n_days": "{0} ihmistä viimeisinä {1} päivänä",
"select_lang": "Valitse kieli", "select_lang": "Valitse kieli",
"sign_in_desc": "Lisää olemassa oleva tili", "sign_in_desc": "Lisää olemassa oleva tili",
"switch_account": "Vaihda tiliin {0}", "switch_account": "Vaihda tiliin {0}",
@ -114,12 +124,14 @@
"block_account": { "block_account": {
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Estä", "confirm": "Estä",
"description": "Haluatko varmasti estää käyttäjän {0}?" "description": "Haluatko varmasti estää tilin {0}?",
"title": "Estä tili"
}, },
"block_domain": { "block_domain": {
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Estä", "confirm": "Estä",
"description": "Haluatko varmasti estää verkkotunnuksen {0}?" "description": "Haluatko varmasti estää verkkotunnuksen {0}?",
"title": "Estä verkkotunnus"
}, },
"common": { "common": {
"cancel": "Kyllä", "cancel": "Kyllä",
@ -128,27 +140,37 @@
"delete_list": { "delete_list": {
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Poista", "confirm": "Poista",
"description": "Haluatko varmasti poistaa listan \"{0}\"?" "description": "Haluatko varmasti poistaa listan \"{0}\"?",
"title": "Poista lista"
}, },
"delete_posts": { "delete_posts": {
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Poista", "confirm": "Poista",
"description": "Haluatko varmasti poistaa tämän julkaisun?" "description": "Haluatko varmasti poistaa tämän julkaisun?",
"title": "Poista julkaisu"
}, },
"mute_account": { "mute_account": {
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Hiljennä", "confirm": "Hiljennä",
"description": "Haluatko varmasti hiljentää käyttäjän {0}?" "days": "päivää|päivä|päivää",
"description": "Haluatko varmasti hiljentää tilin {0}?",
"hours": "tuntia|tunti|tuntia",
"minute": "minuuttia|minuutti|minuuttia",
"notifications": "Hiljennä ilmoitukset",
"specify_duration": "Määrittele hiljennyksen kesto",
"title": "Hiljennä tili"
}, },
"show_reblogs": { "show_reblogs": {
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Näytä", "confirm": "Näytä",
"description": "Haluatko varmasti näyttää tehostukset käyttäjältä {0}?" "description": "Haluatko varmasti näyttää tehostukset tililtä {0}?",
"title": "Näytä tehostukset"
}, },
"unfollow": { "unfollow": {
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Lopeta seuraaminen", "confirm": "Lopeta seuraaminen",
"description": "Haluatko varmasti lopettaa seuraamisen?" "description": "Haluatko varmasti lopettaa tilin {0} seuraamisen?",
"title": "Lopeta seuraaminen"
} }
}, },
"conversation": { "conversation": {
@ -177,14 +199,14 @@
"title": "Esijulkaisu" "title": "Esijulkaisu"
}, },
"desc_highlight": "Saatat löytää bugeja ja puuttuvia ominaisuuksia sieltä täältä.", "desc_highlight": "Saatat löytää bugeja ja puuttuvia ominaisuuksia sieltä täältä.",
"desc_para1": "Kiitos, että kokeilet Elkiä, keskeneräistä Mastodon-verkkosovellustamme!", "desc_para1": "Elk on ketterä verkkosovellus Mastodonille. Voit kirjautua sisään Mastodon-tilillesi ja olla sen avulla vuorovaikutuksessa fediversumin kanssa.",
"desc_para2": "Teemme kovasti töitä sen kehittämiseksi ja parantamiseksi.", "desc_para2": "Elk on avointa lähdekoodia, ja me parantelemme sitä vilkkaasti yhteisöprojektina. Liity joukkoomme, niin rakennamme sitä yhdessä!",
"desc_para3": "Voit auttaa kehityksessä tukemalla tiimiä GitHub-sponsorina. Toivomme, että nautit Elkin käytöstä!", "desc_para3": "Voit auttaa kehityksessä tukemalla tiimiä GitHub-sponsorina. Toivomme, että nautit Elkin käytöstä!",
"desc_para4": "Elk on avointa lähdekoodia. Jos haluat auttaa testaamalla, antamalla palautetta tai lahjoittamalla koodia,", "desc_para4": "Jos haluat ilmoittaa ohjelmontivirheestä, auttaa testauksessa, antaa palautetta tai osallistua,",
"desc_para5": "ota meihin yhteyttä GitHubissa", "desc_para5": "ota meihin yhteyttä GitHubissa",
"desc_para6": "ja liity joukkoomme.", "desc_para6": "ja tule mukaan.",
"footer_team": "Elk-tiimi", "footer_team": "Elk-tiimi",
"title": "Elk on koekäytössä!" "title": "Tervetuloa Elkiin!"
}, },
"language": { "language": {
"search": "Haku" "search": "Haku"
@ -201,6 +223,7 @@
"error": "Listan luonnissa tapahtui virhe", "error": "Listan luonnissa tapahtui virhe",
"error_prefix": "Virhe: ", "error_prefix": "Virhe: ",
"list_title_placeholder": "Listan nimi", "list_title_placeholder": "Listan nimi",
"manage": "Hallitse listoja",
"modify_account": "Muokkaa listoja, joilla tämä tili on", "modify_account": "Muokkaa listoja, joilla tämä tili on",
"remove_account": "Poista tili listalta", "remove_account": "Poista tili listalta",
"save": "Tallenna muutokset" "save": "Tallenna muutokset"
@ -213,24 +236,36 @@
"command_mode": "Komentotila", "command_mode": "Komentotila",
"compose": "Kirjoita", "compose": "Kirjoita",
"favourite": "Lisää suosikkeihin", "favourite": "Lisää suosikkeihin",
"title": "Toimet" "search": "Hae",
"show_new_items": "Näytä uudet kohteet",
"title": "Toiminnot"
}, },
"media": { "media": {
"title": "Media" "title": "Media"
}, },
"navigation": { "navigation": {
"go_to_bookmarks": "Kirjanmerkit",
"go_to_conversations": "Keskustelut",
"go_to_explore": "Tutustu",
"go_to_favourites": "Suosikit",
"go_to_federated": "Federoitu",
"go_to_home": "Koti", "go_to_home": "Koti",
"go_to_lists": "Listat",
"go_to_local": "Paikallinen",
"go_to_notifications": "Ilmoitukset", "go_to_notifications": "Ilmoitukset",
"go_to_profile": "Profiili",
"go_to_search": "Haku",
"go_to_settings": "Asetukset",
"next_status": "Seuraava julkaisu", "next_status": "Seuraava julkaisu",
"previous_status": "Edellinen julkaisu", "previous_status": "Edellinen julkaisu",
"shortcut_help": "Oikoteiden ohje", "shortcut_help": "Oikoteiden ohje",
"title": "Navigointi" "title": "Siirtyminen"
} }
}, },
"sequence_then": "sitten" "sequence_then": "ja sitten"
}, },
"menu": { "menu": {
"add_personal_note": "Lisää oma muistiinpano käyttäjälle {0}", "add_personal_note": "Lisää oma merkintä käyttäjälle {0}",
"block_account": "Estä {0}", "block_account": "Estä {0}",
"block_domain": "Estä verkkotunnus {0}", "block_domain": "Estä verkkotunnus {0}",
"copy_link_to_post": "Kopioi linkki tähän julkaisuun", "copy_link_to_post": "Kopioi linkki tähän julkaisuun",
@ -245,8 +280,9 @@
"mute_conversation": "Hiljennä tämä julkaisu", "mute_conversation": "Hiljennä tämä julkaisu",
"open_in_original_site": "Avaa alkuperäisellä sivustolla", "open_in_original_site": "Avaa alkuperäisellä sivustolla",
"pin_on_profile": "Kiinnitä profiiliin", "pin_on_profile": "Kiinnitä profiiliin",
"remove_personal_note": "Poista oma muistiinpano käyttäjältä {0}", "remove_personal_note": "Poista oma merkintä käyttäjältä {0}",
"report_account": "Ilmianna {0}", "report_account": "Ilmianna {0}",
"share_account": "Jaa {0}",
"share_post": "Jaa tämä julkaisu", "share_post": "Jaa tämä julkaisu",
"show_favourited_and_boosted_by": "Näytä suosikkeihinsa lisänneet ja tehostaneet", "show_favourited_and_boosted_by": "Näytä suosikkeihinsa lisänneet ja tehostaneet",
"show_reblogs": "Näytä tehostukset käyttäjältä {0}", "show_reblogs": "Näytä tehostukset käyttäjältä {0}",
@ -274,13 +310,16 @@
"built_at": "Koottu {0}", "built_at": "Koottu {0}",
"compose": "Kirjoita", "compose": "Kirjoita",
"conversations": "Keskustelut", "conversations": "Keskustelut",
"docs": "Dokumentaatio",
"explore": "Tutustu", "explore": "Tutustu",
"favourites": "Suosikit", "favourites": "Suosikit",
"federated": "Federoitu", "federated": "Federoitu",
"hashtags": "Aihetunnisteet",
"home": "Koti", "home": "Koti",
"list": "Lista", "list": "Lista",
"lists": "Listat", "lists": "Listat",
"local": "Paikallinen", "local": "Paikallinen",
"more_menu": "Lisää-valikko",
"muted_users": "Hiljennetyt käyttäjät", "muted_users": "Hiljennetyt käyttäjät",
"notifications": "Ilmoitukset", "notifications": "Ilmoitukset",
"privacy": "Yksityisyys", "privacy": "Yksityisyys",
@ -314,13 +353,13 @@
"polls": { "polls": {
"allow_multiple": "Salli monen valinta", "allow_multiple": "Salli monen valinta",
"cancel": "Peruuta", "cancel": "Peruuta",
"create": "Luo kysely", "create": "Luo äänestys",
"disallow_multiple": "Estä monen valinta", "disallow_multiple": "Estä monen valinta",
"expiration": "Kyselyn päättyminen", "expiration": "Äänestyksen päättyminen",
"hide_votes": "Piilota äänestystulokset vastausaikana", "hide_votes": "Piilota äänestystulokset vastausaikana",
"option_placeholder": "Vastausvaihtoehto {current}/{max}", "option_placeholder": "Vastausvaihtoehto {current}/{max}",
"remove_option": "Poista vaihtoehto", "remove_option": "Poista vaihtoehto",
"settings": "Kyselyn asetukset", "settings": "Äänestyksen asetukset",
"show_votes": "Näytä äänestystulokset koko ajan" "show_votes": "Näytä äänestystulokset koko ajan"
}, },
"pwa": { "pwa": {
@ -415,6 +454,8 @@
"label": "Tiliasetukset" "label": "Tiliasetukset"
}, },
"interface": { "interface": {
"bottom_nav": "Alanavigaatio",
"bottom_nav_instructions": "Valitse enintään viisi suosikkipainikettasi alanavigaatioon. Niiden joukossa pitää olla Lisää-valikon painike.",
"color_mode": "Pohjaväri", "color_mode": "Pohjaväri",
"dark_mode": "Tumma", "dark_mode": "Tumma",
"default": " (oletus)", "default": " (oletus)",
@ -426,6 +467,7 @@
}, },
"language": { "language": {
"display_language": "Sovelluksen kieli", "display_language": "Sovelluksen kieli",
"how_to_contribute": "Miten osallistua?",
"label": "Kieli", "label": "Kieli",
"post_language": "Julkaisukieli", "post_language": "Julkaisukieli",
"status": "Käännöksen tila: {0}/{1} ({2}\u00A0%)", "status": "Käännöksen tila: {0}/{1} ({2}\u00A0%)",
@ -447,7 +489,7 @@
"favourite": "Suosikit", "favourite": "Suosikit",
"follow": "Uudet seuraajat", "follow": "Uudet seuraajat",
"mention": "Maininnat", "mention": "Maininnat",
"poll": "Kyselyt", "poll": "Äänestykset",
"reblog": "Tehostukset", "reblog": "Tehostukset",
"title": "Mitä ilmoituksia haluat saada?" "title": "Mitä ilmoituksia haluat saada?"
}, },
@ -493,6 +535,8 @@
}, },
"notifications_settings": "Ilmoitukset", "notifications_settings": "Ilmoitukset",
"preferences": { "preferences": {
"embedded_media": "Upotettu mediasoitin",
"embedded_media_description": "Näytä upotettu mediasoitin tavallisen esikatselukortin sijaan, kun jaettu linkki johtaa median suoratoistoon.",
"enable_autoplay": "Toista automaattisesti", "enable_autoplay": "Toista automaattisesti",
"enable_data_saving": "Säästä tiedonsiirrossa", "enable_data_saving": "Säästä tiedonsiirrossa",
"enable_data_saving_description": "Estä liitteitä latautumasta automaattisesti.", "enable_data_saving_description": "Estä liitteitä latautumasta automaattisesti.",
@ -504,13 +548,16 @@
"hide_alt_indi_on_posts": "Piilota julkaisujen ALT-ilmaisin", "hide_alt_indi_on_posts": "Piilota julkaisujen ALT-ilmaisin",
"hide_boost_count": "Piilota tehostusten lukumäärä", "hide_boost_count": "Piilota tehostusten lukumäärä",
"hide_favorite_count": "Piilota suosikkien lukumäärä", "hide_favorite_count": "Piilota suosikkien lukumäärä",
"hide_follower_count": "Piilota seurattujen/seuraajien lukumäärä", "hide_follower_count": "Piilota seurattujen ja seuraajien lukumäärä",
"hide_gif_indi_on_posts": "Piilota julkaisujen GIF-ilmaisin",
"hide_news": "Piilota uutiset", "hide_news": "Piilota uutiset",
"hide_reply_count": "Piilota vastausten lukumäärä", "hide_reply_count": "Piilota vastausten lukumäärä",
"hide_tag_hover_card": "Piilota tunnisteiden leijukortti",
"hide_translation": "Piilota käännös", "hide_translation": "Piilota käännös",
"hide_username_emojis": "Piilota käyttäjänimien emojit", "hide_username_emojis": "Piilota käyttäjänimien emojit",
"hide_username_emojis_description": "Piilottaa emojit käyttäjien nimistä aikajanoilla. Emojit näkyvät silti heidän profiileissaan.", "hide_username_emojis_description": "Piilottaa emojit käyttäjien nimistä aikajanoilla. Emojit näkyvät silti heidän profiileissaan.",
"label": "Mieltymykset", "label": "Mieltymykset",
"optimize_for_low_performance_device": "Optimoi heikon suorituskyvyn laitteelle",
"title": "Kokeelliset ominaisuudet", "title": "Kokeelliset ominaisuudet",
"use_star_favorite_icon": "Käytä tähteä suosikkikuvakkeena", "use_star_favorite_icon": "Käytä tähteä suosikkikuvakkeena",
"user_picker": "Käyttäjävalitsin", "user_picker": "Käyttäjävalitsin",
@ -549,12 +596,16 @@
}, },
"share_target": { "share_target": {
"description": "Elkin voi määrittää niin, että voit jakaa sisältöä muista sovelluksista: asenna Elk laitteellesi ja kirjaudu sisään.", "description": "Elkin voi määrittää niin, että voit jakaa sisältöä muista sovelluksista: asenna Elk laitteellesi ja kirjaudu sisään.",
"hint": "Jotta voit jakaa sisältöä Elkillä, sen täytyy olla asennettuna ja sisään kirjautuneena.", "hint": "Jotta voit jakaa sisältöä Elkillä, sen täytyy olla asennettuna ja sinun sisäänkirjautuneena.",
"title": "Jaa Elkillä" "title": "Jaa Elkillä"
}, },
"state": { "state": {
"attachments_exceed_server_limit": "Julkaisussa on liian monta liitettä.", "attachments_exceed_server_limit": "Julkaisussa on liian monta liitettä.",
"attachments_limit_error": "Liikaa liitteitä", "attachments_limit_audio_error": "Ylitetty audion enimmäiskoko: {0}",
"attachments_limit_error": "Julkaisussa liikaa liitteitä",
"attachments_limit_image_error": "Ylitetty kuvan enimmäiskoko: {0}",
"attachments_limit_unknown_error": "Ylitetty tiedoston enimmäiskoko: {0}",
"attachments_limit_video_error": "Ylitetty videon enimmäiskoko: {0}",
"edited": "(Muokattu)", "edited": "(Muokattu)",
"editing": "Muokkaa", "editing": "Muokkaa",
"loading": "Ladataan...", "loading": "Ladataan...",
@ -571,9 +622,11 @@
}, },
"boosted_by": "Tehostaneet", "boosted_by": "Tehostaneet",
"edited": "Muokattu {0}", "edited": "Muokattu {0}",
"embedded_warning": "Tämän toistaminen voi paljastaa IP-osoitteesi muille.",
"favourited_by": "Lisänneet suosikiksi", "favourited_by": "Lisänneet suosikiksi",
"filter_hidden_phrase": "Suodatettu", "filter_hidden_phrase": "Suodatettu",
"filter_show_anyway": "Näytä silti", "filter_show_anyway": "Näytä silti",
"gif": "GIF",
"img_alt": { "img_alt": {
"ALT": "ALT", "ALT": "ALT",
"desc": "Kuvaus", "desc": "Kuvaus",
@ -605,8 +658,20 @@
"list": "Lista", "list": "Lista",
"media": "Media", "media": "Media",
"news": "Uutiset", "news": "Uutiset",
"notifications_admin": {
"report": "Ilmianto",
"sign_up": "Rekisteröityminen"
},
"notifications_all": "Kaikki", "notifications_all": "Kaikki",
"notifications_favourite": "Suosikki",
"notifications_follow": "Seuraaminen",
"notifications_follow_request": "Seuraamispyyntö",
"notifications_mention": "Maininnat", "notifications_mention": "Maininnat",
"notifications_more_tooltip": "Suodata ilmoitustyypin perusteella",
"notifications_poll": "Äänestys",
"notifications_reblog": "Tehostus",
"notifications_status": "Tila",
"notifications_update": "Päivitys",
"posts": "Julkaisut", "posts": "Julkaisut",
"posts_with_replies": "Julkaisut ja vastaukset" "posts_with_replies": "Julkaisut ja vastaukset"
}, },
@ -660,6 +725,7 @@
"add_emojis": "Lisää emojeja", "add_emojis": "Lisää emojeja",
"add_media": "Lisää kuvia, video tai äänitiedosto", "add_media": "Lisää kuvia, video tai äänitiedosto",
"add_publishable_content": "Lisää julkaisuun sisältöä", "add_publishable_content": "Lisää julkaisuun sisältöä",
"add_thread_item": "Lisää kohde ketjuun",
"change_content_visibility": "Muuta sisällön näkyvyyttä", "change_content_visibility": "Muuta sisällön näkyvyyttä",
"change_language": "Vaihda kieli", "change_language": "Vaihda kieli",
"emoji": "Emoji", "emoji": "Emoji",
@ -669,6 +735,8 @@
"open_editor_tools": "Editorin työkalut", "open_editor_tools": "Editorin työkalut",
"pick_an_icon": "Valitse kuvake", "pick_an_icon": "Valitse kuvake",
"publish_failed": "Sulje epäonnistuneet viestit editorin yläosasta, niin voit julkaista uudelleen", "publish_failed": "Sulje epäonnistuneet viestit editorin yläosasta, niin voit julkaista uudelleen",
"remove_thread_item": "Poista kohde ketjusta",
"start_thread": "Aloita ketju",
"toggle_bold": "Lihavoi", "toggle_bold": "Lihavoi",
"toggle_code_block": "Koodilohko", "toggle_code_block": "Koodilohko",
"toggle_italic": "Kursivoi" "toggle_italic": "Kursivoi"

View file

@ -63,7 +63,7 @@
"enter_app": "Entrer dans l'application", "enter_app": "Entrer dans l'application",
"favourite": "J'aime", "favourite": "J'aime",
"favourite_count": "{0}", "favourite_count": "{0}",
"favourited": "Aimé", "favourited": "J'aime",
"more": "Plus", "more": "Plus",
"next": "Suivant", "next": "Suivant",
"prev": "Précédent", "prev": "Précédent",
@ -277,7 +277,7 @@
"compose": "Composer", "compose": "Composer",
"conversations": "Conversations", "conversations": "Conversations",
"explore": "Explorer", "explore": "Explorer",
"favourites": "Favoris", "favourites": "Aimés",
"federated": "Fédérés", "federated": "Fédérés",
"home": "Accueil", "home": "Accueil",
"list": "Liste", "list": "Liste",

View file

@ -1,9 +1,9 @@
{ {
"a11y": { "a11y": {
"loading_page": "Az oldal töltődik, kérjük várjon", "loading_page": "Az oldal töltődik, kérjük várj",
"loading_titled_page": "Töltődik a(z) {0} oldal, kérjük várjon", "loading_titled_page": "Töltődik a(z) {0} oldal, kérjük várj",
"locale_changed": "A nyelv megváltoztatva: {0}", "locale_changed": "A nyelv megváltoztatva: {0}",
"locale_changing": "Nyelv változtatás, kérjük várjon", "locale_changing": "Nyelv változtatás, kérjük várj",
"route_loaded": "Oldal {0} betöltődött" "route_loaded": "Oldal {0} betöltődött"
}, },
"account": { "account": {
@ -32,8 +32,8 @@
"muted_users": "Némított felhasználók", "muted_users": "Némított felhasználók",
"muting": "Némított", "muting": "Némított",
"mutuals": "Kölcsönös", "mutuals": "Kölcsönös",
"notifications_on_post_disable": "Ne értesítsen, mikor {username} felhasználó bejegyzést tesz közzé", "notifications_on_post_disable": "Ne értesíts, mikor {username} felhasználó bejegyzést tesz közzé",
"notifications_on_post_enable": "Értesítsen, mikor {username} felhasználó bejegyzést tesz közzé", "notifications_on_post_enable": "Értesíts, mikor {username} felhasználó bejegyzést tesz közzé",
"pinned": "Kitűzött", "pinned": "Kitűzött",
"posts": "Bejegyzések", "posts": "Bejegyzések",
"posts_count": "{0} Bejegyzések|{0} Bejegyzés|{0} Bejegyzések", "posts_count": "{0} Bejegyzések|{0} Bejegyzés|{0} Bejegyzések",
@ -41,15 +41,15 @@
"profile_personal_note": "Személyes jegyzetek", "profile_personal_note": "Személyes jegyzetek",
"profile_unavailable": "A profil nem elérhető", "profile_unavailable": "A profil nem elérhető",
"reject": "Követés elutasítása", "reject": "Követés elutasítása",
"rejected": "Elutasítottad a kérést", "rejected": "Elutasított kérés",
"request_follow": "Követés kérése", "request_follow": "Követés kérése",
"requested": "{0} kérte, hogy kövessen", "requested": "{0} kérte, hogy kövessen",
"unblock": "Ne legyen blokkolva", "unblock": "Ne legyen blokkolva",
"unfollow": "Nem követem", "unfollow": "Nem követem",
"unmute": "Némítás megszűntetve", "unmute": "Némítás megszűntetve",
"view_other_followers": "A másik instancekról származó követések nem feltétlenül lesznek megjelenítve.", "view_other_followers": "Másik instancekról származó követések nem feltétlenül lesznek megjelenítve.",
"view_other_following": "A másik instancekról származó követők nem feltétlenül lesznek megjelenítve.", "view_other_following": "Másik instancekról származó követők nem feltétlenül lesznek megjelenítve.",
"withdraw_follow_request": "A követési kérés visszavonása" "withdraw_follow_request": "Követési kérés visszavonása"
}, },
"action": { "action": {
"apply": "Alkalmaz", "apply": "Alkalmaz",
@ -73,6 +73,7 @@
"favourited": "Kedvencnek jelölt", "favourited": "Kedvencnek jelölt",
"more": "Tovább", "more": "Tovább",
"next": "Következő", "next": "Következő",
"open_image_preview_dialog": "Kép előnézeti megnyitása",
"prev": "Előző", "prev": "Előző",
"publish": "Közzététel", "publish": "Közzététel",
"publish_thread": "Szál közzététele", "publish_thread": "Szál közzététele",
@ -112,7 +113,7 @@
"in": "be", "in": "be",
"no_bookmarks": "Még nincs könyvjelzőzött bejegyzés", "no_bookmarks": "Még nincs könyvjelzőzött bejegyzés",
"no_favourites": "Még nincs kedvelt bejegyzés", "no_favourites": "Még nincs kedvelt bejegyzés",
"not_found": "404 Nem található", "not_found": "404 - Nem található",
"offline_desc": "Offline állapot. Kérljük ellenőrízze a hálózati csatlatkozását." "offline_desc": "Offline állapot. Kérljük ellenőrízze a hálózati csatlatkozását."
}, },
"compose": { "compose": {
@ -123,13 +124,13 @@
"block_account": { "block_account": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Blokkol", "confirm": "Blokkol",
"description": "Biztosan blokkolod? {0}", "description": "Biztosan blokkolod {0}?",
"title": "Hozzáférés blokkolása" "title": "Hozzáférés blokkolása"
}, },
"block_domain": { "block_domain": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Blokkol", "confirm": "Blokkol",
"description": "Biztosan blokkolod? {0}", "description": "Biztosan blokkolod {0}?",
"title": "Domain blokkolása" "title": "Domain blokkolása"
}, },
"common": { "common": {
@ -173,13 +174,13 @@
} }
}, },
"conversation": { "conversation": {
"with": "vele: " "with": "vele"
}, },
"custom_cards": { "custom_cards": {
"stackblitz": { "stackblitz": {
"lines": "Sorok: {0}", "lines": "Sorok {0}",
"open": "Megnyit", "open": "Megnyit",
"snippet_from": "Töredék ebből: {0}" "snippet_from": "Töredék ebből {0}"
} }
}, },
"error": { "error": {
@ -197,10 +198,10 @@
"desc3": "Ne lépj be valódi hozzáféréssel.", "desc3": "Ne lépj be valódi hozzáféréssel.",
"title": "Előzetes változatát telepítése" "title": "Előzetes változatát telepítése"
}, },
"desc_highlight": "Számíthat néhány hibára és hiányzó funkcióra itt és ott.", "desc_highlight": "Számíthatsz néhány hibára és hiányzó funkcióra itt és ott.",
"desc_para1": "Köszönjük az érdeklődésedet és hogy kipróbálod az Elk folyamazban lévő és fejlesztés alatt álló Mastodon klienst!", "desc_para1": "Köszönjük az érdeklődésedet és hogy kipróbálod az Elk folyamazban lévő és fejlesztés alatt álló Mastodon klienst!",
"desc_para2": "keményen dolgozunk a fejlesztésen és a javításokon időről időre.", "desc_para2": "keményen dolgozunk a fejlesztésen és a javításokon időről időre.",
"desc_para3": "A fejlesztés lendületéhez tudja támogatni csapatunkat a GitHub szponoráción keresztül. Reméljük elnyeri tetszésedét az Elk!", "desc_para3": "A fejlesztés lendületéhez tudod támogatni csapatunkat a GitHub szponoráción keresztül. Reméljük elnyeri tetszésedét az Elk!",
"desc_para4": "Az Elk nyílt forráskódú. Ha segíteni akar a tesztelésben, adhat visszajelzést vagy hozzájárulást,", "desc_para4": "Az Elk nyílt forráskódú. Ha segíteni akar a tesztelésben, adhat visszajelzést vagy hozzájárulást,",
"desc_para5": "elér minket a GitHub-on", "desc_para5": "elér minket a GitHub-on",
"desc_para6": "és legyen elkötelezett.", "desc_para6": "és legyen elkötelezett.",
@ -329,7 +330,7 @@
"select_language": "Megjelenítő nyelv", "select_language": "Megjelenítő nyelv",
"settings": "Beállítások", "settings": "Beállítások",
"show_intro": "Bemutatkozás", "show_intro": "Bemutatkozás",
"toggle_theme": "Téma váltás", "toggle_theme": "Téma váltása",
"zen_mode": "Zen mód" "zen_mode": "Zen mód"
}, },
"notification": { "notification": {
@ -344,13 +345,13 @@
"update_status": "frissítette a bejegyzését" "update_status": "frissítette a bejegyzését"
}, },
"placeholder": { "placeholder": {
"content_warning": "Írja ide figyelmeztetését", "content_warning": "Írj ide figyelmeztetést",
"default_1": "Mi jár a fejedben?", "default_1": "Mi jár a fejedben?",
"reply_to_account": "Válasz erre: {0}", "reply_to_account": "Válasz erre {0}",
"replying": "Válaszol" "replying": "Válaszol"
}, },
"polls": { "polls": {
"allow_multiple": "Több választás megenedése", "allow_multiple": "Több választás megengedése",
"cancel": "Mégsem", "cancel": "Mégsem",
"create": "Szavazás készítése", "create": "Szavazás készítése",
"disallow_multiple": "Több válasz tiltása", "disallow_multiple": "Több válasz tiltása",
@ -366,8 +367,8 @@
"install": "Telepítés", "install": "Telepítés",
"install_title": "Elk telepítése", "install_title": "Elk telepítése",
"screenshots": { "screenshots": {
"dark": "Az Elk képernyőképe sötét módban fut", "dark": "Az Elk képernyőkép sötét módban fut",
"light": "Az Elk képernyőképe világos módban fut" "light": "Az Elk képernyőkép világos módban fut"
}, },
"title": "Új Elk frissítés elérhető!", "title": "Új Elk frissítés elérhető!",
"update": "Frissítés", "update": "Frissítés",
@ -449,7 +450,7 @@
"version": "Verzió" "version": "Verzió"
}, },
"account_settings": { "account_settings": {
"description": "Szerkessze fiókbeállításait a Mastodonban.", "description": "Szerkeszd fiókbeállításaid a Mastodonban.",
"label": "Fiók beállítások" "label": "Fiók beállítások"
}, },
"interface": { "interface": {
@ -523,13 +524,13 @@
"enable_description": "Ha értesítéseket szeretne kapni amikor az Elk nincs nyitva, engedélyezze a push értesítéseket. A fenti \"@:settings.notifications.show_btn{'\"'} gomb segítségével pontosan szabályozhatja, hogy milyen típusú interakciók generáljanak push értesítéseket.", "enable_description": "Ha értesítéseket szeretne kapni amikor az Elk nincs nyitva, engedélyezze a push értesítéseket. A fenti \"@:settings.notifications.show_btn{'\"'} gomb segítségével pontosan szabályozhatja, hogy milyen típusú interakciók generáljanak push értesítéseket.",
"enable_description_desktop": "Ha értesítéseket szeretne kapni amikor az Elk nincs nyitva, engedélyezze a push értesítéseket. A \"Beállítások > Értesítések > Push értesítések beállításai\" menüpontban pontosan szabályozhatja, hogy az engedélyezést követően milyen típusú interakciók generáljanak push értesítéseket.", "enable_description_desktop": "Ha értesítéseket szeretne kapni amikor az Elk nincs nyitva, engedélyezze a push értesítéseket. A \"Beállítások > Értesítések > Push értesítések beállításai\" menüpontban pontosan szabályozhatja, hogy az engedélyezést követően milyen típusú interakciók generáljanak push értesítéseket.",
"enable_description_mobile": "A beállításokat a \"Beállítások > Értesítések > Push értesítési beállítások\" navigációs menü segítségével is elérheti.", "enable_description_mobile": "A beállításokat a \"Beállítások > Értesítések > Push értesítési beállítások\" navigációs menü segítségével is elérheti.",
"enable_description_settings": "Ha értesítéseket szeretne kapni amikor az Elk nincs nyitva, engedélyezze a push értesítéseket. Pontosan szabályozhatja, hogy milyen típusú interakciók generálnak push értesítéseket ugyanazon a képernyőn, miután engedélyezte őket.", "enable_description_settings": "Ha értesítéseket szeretnél kapni amikor az Elk nincs nyitva, engedélyezd a push értesítéseket. Pontosan szabályozhatod, hogy milyen típusú interakciók generálhatnak push értesítéseket ugyanazon a képernyőn, miután engedélyezted őket.",
"enable_desktop": "Push értesítések engedélyezése", "enable_desktop": "Push értesítések engedélyezése",
"enable_title": "Sose hagyj ki semmit", "enable_title": "Sose hagyj ki semmit",
"re_auth": "Úgy tűnik, hogy a szervere nem támogatja a push értesítéseket. Próbáljon kijelentkezni, majd újra bejelentkezni. Ha ez az üzenet továbbra is megjelenik, forduljon a szerver rendszergazdájához." "re_auth": "Úgy tűnik, hogy szervered nem támogatja a push értesítéseket. Próbáljon kijelentkezni, majd újra bejelentkezni. Ha ez az üzenet továbbra is megjelenik, forduljon a szerver rendszergazdájához."
} }
}, },
"show_btn": "Nyissa meg az értesítési beállításokat", "show_btn": "Nyisd meg az értesítési beállításokat",
"under_construction": "Felújítás alatt" "under_construction": "Felújítás alatt"
}, },
"notifications_settings": "Értesítések", "notifications_settings": "Értesítések",
@ -580,7 +581,7 @@
"title": "Profil szerkesztése" "title": "Profil szerkesztése"
}, },
"featured_tags": { "featured_tags": {
"description": "Az emberek ezen címkék alatt böngészhetik nyilvános bejegyzéseit.", "description": "Az emberek ezen címkék alatt böngészhetik a nyilvános bejegyzéseid.",
"label": "Kiemelt címkék", "label": "Kiemelt címkék",
"under_construction": "Felújítás alatt" "under_construction": "Felújítás alatt"
}, },
@ -594,8 +595,8 @@
} }
}, },
"share_target": { "share_target": {
"description": "Az Elk konfigurálható úgy, hogy más alkalmazásokból is megoszthasson tartalmat, egyszerűen telepítse az Elket eszközére vagy számítógépére, és jelentkezzen be.", "description": "Az Elk konfigurálható úgy, hogy más alkalmazásokból is megoszthass tartalmat, egyszerűen telepítse az Elket eszközödre vagy számítógépedre, és jelentkezz be.",
"hint": "A tartalom megosztásához telepíteni kell az Elket, és be kell jelentkeznie.", "hint": "A tartalom megosztásához telepíteni kell az Elket, és be kell jelentkezni.",
"title": "Oszd meg Elkkel" "title": "Oszd meg Elkkel"
}, },
"state": { "state": {
@ -616,7 +617,7 @@
}, },
"status": { "status": {
"account": { "account": {
"suspended_message": "A bejegyzéshez tartoz fiókot felfüggesztettük.", "suspended_message": "A bejegyzéshez tartoz fiók felfüggesztésre került.",
"suspended_show": "Ennek ellenére megjeleníti?" "suspended_show": "Ennek ellenére megjeleníti?"
}, },
"boosted_by": "Kiemelve: ", "boosted_by": "Kiemelve: ",

View file

@ -73,6 +73,7 @@
"favourited": "Apprezzato", "favourited": "Apprezzato",
"more": "Altro", "more": "Altro",
"next": "Successivo", "next": "Successivo",
"open_image_preview_dialog": "Apri finestra di anteprima",
"prev": "Precedente", "prev": "Precedente",
"publish": "Pubblica", "publish": "Pubblica",
"publish_thread": "Pubblica discussione", "publish_thread": "Pubblica discussione",
@ -466,7 +467,7 @@
}, },
"language": { "language": {
"display_language": "Lingua interfaccia", "display_language": "Lingua interfaccia",
"how_to_contribute": "Come posso contribuire?", "how_to_contribute": "Come contribuire?",
"label": "Lingua", "label": "Lingua",
"post_language": "Lingua di pubblicazione", "post_language": "Lingua di pubblicazione",
"status": "Stato traduzione: {0}/{1} ({2}%)", "status": "Stato traduzione: {0}/{1} ({2}%)",
@ -544,7 +545,7 @@
"github_cards_description": "Quando viene pubblicato un link GitHub, viene mostrato un riquadro HTML accessibile usando i metadati del grafico sociale invece dell'immmagine.", "github_cards_description": "Quando viene pubblicato un link GitHub, viene mostrato un riquadro HTML accessibile usando i metadati del grafico sociale invece dell'immmagine.",
"grayscale_mode": "Modalità scala di grigi", "grayscale_mode": "Modalità scala di grigi",
"hide_account_hover_card": "Nascondi anteprima profilo al passaggio del mouse", "hide_account_hover_card": "Nascondi anteprima profilo al passaggio del mouse",
"hide_alt_indi_on_posts": "Nascondi indicatori testo alternativo sui post", "hide_alt_indi_on_posts": "Nascondi indicatore testo alternativo sui post",
"hide_boost_count": "Nascondi contatore potenziamenti", "hide_boost_count": "Nascondi contatore potenziamenti",
"hide_favorite_count": "Nascondi contatore apprezzamenti", "hide_favorite_count": "Nascondi contatore apprezzamenti",
"hide_follower_count": "Nascondi contatore seguaci/seguiti", "hide_follower_count": "Nascondi contatore seguaci/seguiti",

View file

@ -61,7 +61,7 @@
"confirm": "確認", "confirm": "確認",
"done": "完了", "done": "完了",
"edit": "編集する", "edit": "編集する",
"enter_app": "使い始める", "enter_app": "始める",
"favourite": "お気に入り", "favourite": "お気に入り",
"favourite_count": "{0}", "favourite_count": "{0}",
"favourited": "お気に入り済み", "favourited": "お気に入り済み",
@ -116,12 +116,12 @@
"block_account": { "block_account": {
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "ブロック", "confirm": "ブロック",
"description": "{0}さんを本当にミュートしたいですか?" "description": "{0}さんを本当にミュートしすか?"
}, },
"block_domain": { "block_domain": {
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "ブロック", "confirm": "ブロック",
"description": "{0}さんを本当にブロックしたいですか?" "description": "{0}さんを本当にブロックしすか?"
}, },
"common": { "common": {
"cancel": "いいえ", "cancel": "いいえ",
@ -130,27 +130,27 @@
"delete_list": { "delete_list": {
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "削除", "confirm": "削除",
"description": "リスト \"{0}\" を本当に削除したいですか?" "description": "リスト \"{0}\" を本当に削除しすか?"
}, },
"delete_posts": { "delete_posts": {
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "削除", "confirm": "削除",
"description": "この投稿を本当に削除したいですか?" "description": "この投稿を本当に削除しすか?"
}, },
"mute_account": { "mute_account": {
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "ミュート", "confirm": "ミュート",
"description": "{0}さんを本当にミュートしたいですか?" "description": "{0}さんを本当にミュートしすか?"
}, },
"show_reblogs": { "show_reblogs": {
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "表示", "confirm": "表示",
"description": "{0}さんのブーストを本当に表示したいですか?" "description": "{0}さんのブーストを本当に表示しすか?"
}, },
"unfollow": { "unfollow": {
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "フォロー解除", "confirm": "フォロー解除",
"description": "本当にフォロー解除したいですか?" "description": "本当にフォローを解除しますか?"
} }
}, },
"conversation": { "conversation": {
@ -166,7 +166,7 @@
"error": { "error": {
"account_not_found": "アカウント {0} が見つかりません", "account_not_found": "アカウント {0} が見つかりません",
"explore_list_empty": "現在トレンドには何もありません。またあとで!", "explore_list_empty": "現在トレンドには何もありません。またあとで!",
"file_size_cannot_exceed_n_mb": "ファイルサイズは{0}MBを超えてはいけません", "file_size_cannot_exceed_n_mb": "{0}MBを超えるファイルはアップロードできません",
"sign_in_error": "サーバーに接続できません。", "sign_in_error": "サーバーに接続できません。",
"status_not_found": "投稿が見つかりません", "status_not_found": "投稿が見つかりません",
"unsupported_file_format": "対応していないファイル形式です" "unsupported_file_format": "対応していないファイル形式です"
@ -367,7 +367,7 @@
"anything_else": "他に私たちが知る必要があることはありますか?", "anything_else": "他に私たちが知る必要があることはありますか?",
"block_desc": "あなたは今後、このユーザーの投稿を見ることはありません。このユーザーもあなたの投稿を見たり、あなたをフォローしたりすることもできなくなります。ただし、相手はブロックされたことが分かります。", "block_desc": "あなたは今後、このユーザーの投稿を見ることはありません。このユーザーもあなたの投稿を見たり、あなたをフォローしたりすることもできなくなります。ただし、相手はブロックされたことが分かります。",
"dontlike": "気に入りません", "dontlike": "気に入りません",
"dontlike_desc": "これは見たくない投稿です。", "dontlike_desc": "これは閲覧したくない投稿です",
"forward": "はい、この報告を {0} に転送してください。", "forward": "はい、この報告を {0} に転送してください。",
"forward_question": "この報告の匿名化されたコピーをそのサーバーにも送信しますか?", "forward_question": "この報告の匿名化されたコピーをそのサーバーにも送信しますか?",
"further_actions": { "further_actions": {
@ -453,7 +453,7 @@
"mention": "メンション", "mention": "メンション",
"poll": "投票", "poll": "投票",
"reblog": "投稿のリブログ", "reblog": "投稿のリブログ",
"title": "どの通知を受け取りますか?" "title": "受け取りたい通知を選択してください"
}, },
"description": "Elkを使用していないときでも通知を受け取ります。", "description": "Elkを使用していないときでも通知を受け取ります。",
"instructions": "@:settings.notifications.push_notifications.save_settings ボタンで設定を保存するのを忘れないように!", "instructions": "@:settings.notifications.push_notifications.save_settings ボタンで設定を保存するのを忘れないように!",
@ -472,9 +472,9 @@
"invalid_vapid_key": "VAPID公開鍵が無効なようです。", "invalid_vapid_key": "VAPID公開鍵が無効なようです。",
"permission_denied": "パーミッション拒否: ブラウザで通知を有効にしてください。", "permission_denied": "パーミッション拒否: ブラウザで通知を有効にしてください。",
"repo_link": "ElkのGitHubリポジトリ", "repo_link": "ElkのGitHubリポジトリ",
"request_error": "購読のリクエスト中にエラーが発生しました。再試行してもエラーが解消しない場合、Elkリポジトリにissueを報告してください。", "request_error": "登録のリクエスト中にエラーが発生しました。再試行してもエラーが解消しない場合、Elkリポジトリにissueを報告してください。",
"title": "プッシュ通知を購読できませんでした", "title": "プッシュ通知を登録できませんでした",
"too_many_registrations": "ブラウザーの制限により、Elkは異なるサーバー上の複数アカウントに対してプッシュ通知サービスを使用できません。他のアカウントのプッシュ通知の購読を解除して、再購読する必要があります。", "too_many_registrations": "ブラウザーの制限により、Elkは異なるサーバー上の複数アカウントに対してプッシュ通知サービスを使用できません。他のアカウントのプッシュ通知の登録を解除して、再登録する必要があります。",
"vapid_not_supported": "このブラウザはWeb Push通知をサポートしていませんが、VAPIDプロトコルをサポートしているようです。" "vapid_not_supported": "このブラウザはWeb Push通知をサポートしていませんが、VAPIDプロトコルをサポートしているようです。"
}, },
"title": "プッシュ通知の設定", "title": "プッシュ通知の設定",
@ -572,7 +572,7 @@
"status": { "status": {
"account": { "account": {
"suspended_message": "この投稿のアカウントは凍結されました。", "suspended_message": "この投稿のアカウントは凍結されました。",
"suspended_show": "それでもコンテンツを表示しますか?" "suspended_show": "本当にコンテンツを表示しますか?"
}, },
"boosted_by": "ブーストしたユーザー", "boosted_by": "ブーストしたユーザー",
"edited": "編集済み {0}", "edited": "編集済み {0}",
@ -708,6 +708,6 @@
"public": "公開", "public": "公開",
"public_desc": "誰でも閲覧可能", "public_desc": "誰でも閲覧可能",
"unlisted": "非掲載", "unlisted": "非掲載",
"unlisted_desc": "誰でも閲覧可能、検索機能からはオプトアウトする" "unlisted_desc": "誰でも閲覧可能ですが、検索機能からは非表示にします"
} }
} }

View file

@ -73,6 +73,7 @@
"favourited": "Adicionado aos favoritos", "favourited": "Adicionado aos favoritos",
"more": "Mais", "more": "Mais",
"next": "Próximo", "next": "Próximo",
"open_image_preview_dialog": "Abrir caixa de diálogo de pré-visualização da imagem",
"prev": "Anterior", "prev": "Anterior",
"publish": "Publicar", "publish": "Publicar",
"publish_thread": "Publicar sequência", "publish_thread": "Publicar sequência",

View file

@ -343,10 +343,10 @@
}, },
"settings": { "settings": {
"about": { "about": {
"built_at": "Kurulmuş", "built_at": "Kurulum",
"label": "Hakkında", "label": "Hakkında",
"meet_the_team": "Takım ile buluş", "meet_the_team": "Takım ile buluş",
"sponsor_action": "Bize spponsor ol", "sponsor_action": "Bize sponsor ol",
"sponsor_action_desc": "Elk'i geliştiren takıma destek olmak için", "sponsor_action_desc": "Elk'i geliştiren takıma destek olmak için",
"sponsors": "Sponsorlar", "sponsors": "Sponsorlar",
"sponsors_body_1": "Elk cömert sponsorluk ve şunların yardımı sayesinde mümkün oldu:", "sponsors_body_1": "Elk cömert sponsorluk ve şunların yardımı sayesinde mümkün oldu:",

View file

@ -1,9 +1,9 @@
{ {
"a11y": { "a11y": {
"loading_page": "Завантаження сторінки, будь ласка, зачекайте", "loading_page": "Завантаження сторінки, просимо почекати",
"loading_titled_page": "Завантаження сторінки {0}, будь ласка, зачекайте", "loading_titled_page": "Завантаження сторінки {0}, просимо почекати",
"locale_changed": "Мову змінено на {0}", "locale_changed": "Мова змінена на {0}",
"locale_changing": "Зміна мови, будь ласка, зачекайте", "locale_changing": "Зміна мови, просимо почекати",
"route_loaded": "Сторінка {0} завантажена" "route_loaded": "Сторінка {0} завантажена"
}, },
"account": { "account": {
@ -13,78 +13,96 @@
"blocked_users": "Заблоковані користувачі", "blocked_users": "Заблоковані користувачі",
"blocking": "Заблоковані", "blocking": "Заблоковані",
"bot": "БОТ", "bot": "БОТ",
"copy_account_name": "Скопіюйте назву облікового запису", "copy_account_name": "Скопіювати назву облікового запису",
"favourites": "Улюблені", "favourites": "Уподобані",
"follow": "Підписатися", "follow": "Підписатися",
"follow_back": "Підписатися", "follow_back": "Підписатися взаємно",
"follow_requested": "Запити", "follow_requested": "Запитані",
"followers": "Підписники", "followers": "Підписники",
"followers_count": "{0} підписників|{0} підписник|{0} підписники|{0} підписників", "followers_count": "{0} підписників|{0} підписник|{0} підписники|{0} підписників",
"following": "Підписаний", "following": "Підписані",
"following_count": "{0} підписок", "following_count": "{0} підписок|{0} підписка|{0} підписки|{0} підписок",
"follows_you": "Підписаний на вас", "follows_you": "Підписані на вас",
"go_to_profile": "Перейти до профілю", "go_to_profile": "Перейти до профілю",
"joined": "Зареєстровано", "joined": "Долучені",
"moved_title": "вказав, що його новий обліковий запис тепер:", "lock": "Прихований",
"muted_users": "Приховані користувачі", "moved_title": "указали, що їхній новий обліковий запис тепер:",
"muting": "Приховано", "muted_users": "Іґноровані користувачі",
"mutuals": "Взаємно", "muting": "Іґноровані",
"mutuals": "Підписані взаємно",
"notifications_on_post_disable": "Не сповіщати про дописи від {username}",
"notifications_on_post_enable": "Сповіщати про дописи від {username}",
"pinned": "Закріплені дописи", "pinned": "Закріплені дописи",
"posts": "Дописи", "posts": "Дописи",
"posts_count": "{0} дописів|{0} допис|{0} дописи|{0} дописів", "posts_count": "{0} дописів|{0} допис|{0} дописи|{0} дописів",
"profile_description": "Заголовок профілю {0}", "profile_description": "Заголовок профілю {0}",
"profile_personal_note": "Нотатка",
"profile_unavailable": "Профіль недоступний", "profile_unavailable": "Профіль недоступний",
"unblock": "Розблокувати", "reject": "Відхилити підписку",
"rejected": "Ви відхилили запит",
"request_follow": "Запит підписки",
"requested": "{0} запитали підписку на вас",
"unblock": "Розблочити",
"unfollow": "Відписатися", "unfollow": "Відписатися",
"unmute": "Приховати" "unmute": "Розіґнорити",
"view_other_followers": "Підписники з інших серверів можуть не відображатися.",
"view_other_following": "Підписки з інших серверів можуть не відображатися.",
"withdraw_follow_request": "Відкликати запит підписки"
}, },
"action": { "action": {
"apply": "Застосувати", "apply": "Застосувати",
"bookmark": "Додати в закладки", "bookmark": "Додати в закладки",
"bookmarked": "Додано з закладки", "bookmarked": "Додано в закладки",
"boost": "Поширити", "boost": "Поширити",
"boost_count": "{0}", "boost_count": "{0}",
"boosted": "Поширено", "boosted": "Поширено",
"clear": "Очистити",
"clear_publish_failed": "Очистити помилки оприлюднення",
"clear_save_failed": "Очистити помилки збереження",
"clear_upload_failed": "Очистити помилки завантаження", "clear_upload_failed": "Очистити помилки завантаження",
"close": "Закрити", "close": "Закрити",
"compose": "Написати", "compose": "Написати",
"confirm": "Підтвердити", "confirm": "Підтвердити",
"edit": "Редагувати", "done": "Зроблено",
"enter_app": "Перейти до додатку", "edit": "Правити",
"favourite": "Вподобати", "enter_app": "Ввійти в застосунок",
"favourite": "Уподобати",
"favourite_count": "{0}", "favourite_count": "{0}",
"favourited": "Подобається", "favourited": "Уподобані",
"more": "Більше", "more": "Більше",
"next": "Наступний", "next": "Наступний",
"open_image_preview_dialog": "Відкрити діалоґ передпоказу зображення",
"prev": "Попередній", "prev": "Попередній",
"publish": "Опублікувати", "publish": "Оприлюднити",
"publish_thread": "Оприлюднити ряд дописів",
"reply": "Відповісти", "reply": "Відповісти",
"reply_count": "{0}", "reply_count": "{0}",
"reset": "Скинути", "reset": "Скинути",
"save": "Зберегти", "save": "Зберегти",
"save_changes": "Зберегти зміни", "save_changes": "Зберегти зміни",
"sign_in": "Увійти", "sign_in": "Ввійти",
"sign_in_to": "Ввійти до {0}",
"switch_account": "Змінити обліковий запис", "switch_account": "Змінити обліковий запис",
"vote": "Голосувати" "vote": "Голосувати"
}, },
"app_desc_short": "Спритний веб-клієнт для Mastodon", "app_desc_short": "Спритний вебклієнт для Mastodon",
"app_logo": "Elk лого", "app_logo": "Лоґо Elk",
"app_name": "Elk", "app_name": "Elk",
"attachment": { "attachment": {
"edit_title": "Опис", "edit_title": "Опис",
"remove_label": "Видалити вкладення" "remove_label": "Вилучити вкладення"
}, },
"command": { "command": {
"activate": "Активувати", "activate": "Активувати",
"complete": "Вибрати", "complete": "Вибрати",
"compose_desc": "Написати новий допис", "compose_desc": "Написати новий допис",
"n_people_in_the_past_n_days": "{0} користувачів за останні {1} днів", "n_people_in_the_past_n_days": "{0} користувачів за останні {1} днів",
"select_lang": "Змінити мову", "select_lang": "Вибрати мову",
"sign_in_desc": "Додати існуючий обліковий запис", "sign_in_desc": "Додати наявний обліковий запис",
"switch_account": "Змінити обліковий запис на {0}", "switch_account": "Змінити обліковий запис на {0}",
"switch_account_desc": "Змінити активний обліковий запис", "switch_account_desc": "Змінити активний обліковий запис",
"toggle_dark_mode": "Перемкнути темний режим", "toggle_dark_mode": "Перемикнути темний режим",
"toggle_zen_mode": "Перемкнути режим Zen" "toggle_zen_mode": "Перемикнути Zen режим"
}, },
"common": { "common": {
"end_of_list": "Кінець списку", "end_of_list": "Кінець списку",
@ -92,9 +110,9 @@
"fetching": "Завантаження...", "fetching": "Завантаження...",
"in": "в", "in": "в",
"no_bookmarks": "Немає збережених дописів", "no_bookmarks": "Немає збережених дописів",
"no_favourites": "Немає вподобаних дописів", "no_favourites": "Немає уподобаних дописів",
"not_found": "404 Не знайдено", "not_found": "404 Не знайдено",
"offline_desc": "Схоже, ви відключені від мережі. Будь ласка, перевірте ваше підключення до мережі." "offline_desc": "Схоже, ви відключені від мережі. Просимо перевірити підключення до мережі."
}, },
"compose": { "compose": {
"draft_title": "Чернетка {0}", "draft_title": "Чернетка {0}",
@ -103,15 +121,15 @@
"confirm": { "confirm": {
"block_account": { "block_account": {
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Блокувати", "confirm": "Блочити",
"description": "Ви впевнені, що бажаєте заблокувати {0}?", "description": "Упевнені, що хочете заблочити {0}?",
"title": "Заблокувати користувача" "title": "Заблочити користувача"
}, },
"block_domain": { "block_domain": {
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Блокувати", "confirm": "Блочити",
"description": "Ви впевнені, що бажаєте заблокувати {0}?", "description": "Упевнені, що хочете заблочити {0}?",
"title": "Заблокувати домен" "title": "Заблочити домен"
}, },
"common": { "common": {
"cancel": "Скасувати", "cancel": "Скасувати",
@ -120,73 +138,90 @@
"delete_list": { "delete_list": {
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Видалити", "confirm": "Видалити",
"description": "Ви впевнені, що бажаєте видалити список \"{0}\"?", "description": "Упевнені, що хочете видалити список «{0}»?",
"title": "Видалити список" "title": "Видалити список"
}, },
"delete_posts": { "delete_posts": {
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Видалити", "confirm": "Видалити",
"description": "Ви впевнені, що хочете видалити цей допис?", "description": "Упевнені, що хочете видалити допис?",
"title": "Видалити допис" "title": "Видалити допис"
}, },
"mute_account": { "mute_account": {
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Приховати", "confirm": "Іґнорити",
"description": "Ви впевнені, що бажаєте приховати {0}?", "days": "днів|день|дні|днів",
"title": "Приховати обліковий запис" "description": "Упевнені, що бажаєте іґнорити {0}?",
"hours": "годин|година|години|годин",
"minute": "хвилин|хвилина|хвилини|хвилин",
"title": "Іґнорити обліковий запис"
}, },
"show_reblogs": { "show_reblogs": {
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Показати", "confirm": "Показати",
"description": "Ви впевнені, що хочете показати поширення від {0}?", "description": "Упевнені, що хочете показати поширення від {0}?",
"title": "Показати поширення" "title": "Показати поширення"
}, },
"unfollow": { "unfollow": {
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Відписатися", "confirm": "Відписатися",
"description": "Ви впевнені, що бажаєте відписатися від {0}?", "description": "Упевнені, що бажаєте відписатися від {0}?",
"title": "Відписатися" "title": "Відписатися"
} }
}, },
"conversation": { "conversation": {
"with": "з" "with": "з"
}, },
"custom_cards": {
"stackblitz": {
"lines": "Рядків {0}",
"open": "Відкрити",
"snippet_from": "Сніпет від {0}"
}
},
"error": { "error": {
"account_not_found": "Обліковий запис {0} не знайдено", "account_not_found": "Обліковий запис {0} не знайдено",
"explore_list_empty": "Зараз нічого не в тренді. Перевірте пізніше!", "explore_list_empty": "Зараз нічого не в тренді. Можете перевірити пізніше!",
"file_size_cannot_exceed_n_mb": "Розмір файлу не може перевищувати {0} Мб", "file_size_cannot_exceed_n_mb": "Розмір файлу не може перевищувати {0} Мб",
"sign_in_error": "Не вдалося підключитися до сервера.", "sign_in_error": "Не вдалося підключитися до сервера.",
"status_not_found": "Допис не знайдено", "status_not_found": "Допис не знайдено",
"unsupported_file_format": "Непідтримуваний формат файлу" "unsupported_file_format": "Непідтримуваний формат файлу"
}, },
"help": { "help": {
"desc_highlight": "Очікуйте деякі помилки та відсутні функції тут і там.", "build_preview": {
"desc_para1": "Дякуємо за ваш інтерес до випробування Elk, нашого універсального клієнта Mastodon, який ще у розробці!", "desc1": "Зараз бачите попередню версію Elk від спільноти - {0}.",
"desc_para2": "Ми наполегливо працюємо над розробкою та вдосконалюємо його. Ми відкриємо вихідний код, коли він буде готовий для загального використання.", "desc2": "Може містити неоглянути або навіть зловмисні зміни.",
"desc_para3": "Щоб допомогти прискорити розробку, ви можете спонсорувати членів нашої команди за посиланнями нижче. Сподіваємося, вам сподобається Elk!", "desc3": "Не треба заходити з дійсним обліковим записом.",
"desc_para4": "До цього, якщо ви хочете допомогти з тестуванням, надіслати відгук або зробити внесок,", "title": "Попередній вигляд"
"desc_para5": "зв’яжіться з нами на GitHub", },
"desc_para6": "і долучіться.", "desc_highlight": "Можете очікувати деякі помилки і відсутні функції тут і там.",
"desc_para1": "Elk є спритним вебклієнтом для Mastodon. Можете ввійти в обліковий Mastodon запис, через котрого взаємодіяти з Fediverse.",
"desc_para2": "Elk є відкритим ПЗ, котрого жваво покращуємо, як проєкт спільноти. Можете долучитися до нас і розвивати його разом!",
"desc_para3": "Аби прискорити розробку, можете спонсорувати Команду через GitHub Sponsors. Сподіваємося, ви задоволені застосунком Elk!",
"desc_para4": "Якщо хочете повідомити про помилку, допомогти з тестуванням, надіслати відгук чи зробити внесок,",
"desc_para5": "то можете подати до нас в GitHub",
"desc_para6": "і взяти участь.",
"footer_team": "Команда Elk", "footer_team": "Команда Elk",
"title": "Elk у попередньому перегляді!" "title": "Ласкаво просимо до Elk!"
}, },
"language": { "language": {
"search": "Пошук" "search": "Пошук"
}, },
"list": { "list": {
"add_account": "Додати обліковий запис до списку", "add_account": "Додати обліковий запис до списку",
"cancel_edit": "Скасувати редагування", "cancel_edit": "Скасувати правку",
"clear_error": "Очистити помилку", "clear_error": "Очистити помилку",
"create": "Створити", "create": "Створити",
"delete": "Видалити список", "delete": "Видалити список",
"delete_error": "Під час видалення списку сталася помилка", "delete_error": "Під час видалення списку сталася помилка",
"edit": "Редагувати список", "edit": "Правити список",
"edit_error": "Під час редагування списку сталася помилка", "edit_error": "Під час оновлення списку сталася помилка",
"error": "Під час створення списку сталася помилка", "error": "Під час створення списку сталася помилка",
"error_prefix": "Помилка: ", "error_prefix": "Помилка: ",
"list_title_placeholder": "Назва списку", "list_title_placeholder": "Назва списку",
"modify_account": "Редагувати списки з цим обліковим записом", "manage": "Управляти списками",
"remove_account": "Видалити обліковий запис зі списку", "modify_account": "Змінити належність облікового запису до списків",
"remove_account": "Вилучити обліковий запис зі списку",
"save": "Зберегти зміни" "save": "Зберегти зміни"
}, },
"magic_keys": { "magic_keys": {
@ -196,8 +231,8 @@
"boost": "Поширити", "boost": "Поширити",
"command_mode": "Командний режим", "command_mode": "Командний режим",
"compose": "Написати", "compose": "Написати",
"favourite": "Вподобати", "favourite": "Уподобати",
"search": "Пошук", "search": "Шукати",
"show_new_items": "Показати нові елементи", "show_new_items": "Показати нові елементи",
"title": "Дії" "title": "Дії"
}, },
@ -208,8 +243,8 @@
"go_to_bookmarks": "Закладки", "go_to_bookmarks": "Закладки",
"go_to_conversations": "Розмови", "go_to_conversations": "Розмови",
"go_to_explore": "Огляд", "go_to_explore": "Огляд",
"go_to_favourites": "Вподобане", "go_to_favourites": "Уподобане",
"go_to_federated": "Глобальна", "go_to_federated": "Ґлобальна",
"go_to_home": "Головна", "go_to_home": "Головна",
"go_to_lists": "Списки", "go_to_lists": "Списки",
"go_to_local": "Локальна", "go_to_local": "Локальна",
@ -220,90 +255,108 @@
"next_status": "Наступний допис", "next_status": "Наступний допис",
"previous_status": "Попередній допис", "previous_status": "Попередній допис",
"shortcut_help": "Допомога з гарячими клавішами", "shortcut_help": "Допомога з гарячими клавішами",
"title": "Навігація" "title": "Навіґація"
} }
}, },
"sequence_then": "потім" "sequence_then": "потім"
}, },
"menu": { "menu": {
"add_personal_note": "Додати нотатку до {0}", "add_personal_note": "Додати нотатку до {0}",
"block_account": "Заблокувати {0}", "block_account": "Заблочити {0}",
"block_domain": "Заблокувати домен {0}", "block_domain": "Заблочити домен {0}",
"copy_link_to_post": "Скопіювати посилання на цей допис", "copy_link_to_post": "Скопіювати посилання на допис",
"copy_original_link_to_post": "Скопіювати оригінальне посилання на цей допис", "copy_original_link_to_post": "Скопіювати ориґінальне посилання на допис",
"delete": "Видалити", "delete": "Видалити",
"delete_and_redraft": "Видалити і переписати", "delete_and_redraft": "Видалити і переписати",
"direct_message_account": "Пряме повідомлення {0}", "direct_message_account": "Пряме повідомлення {0}",
"edit": "Редагувати", "edit": "Правити",
"hide_reblogs": "Приховати поширення від {0}", "hide_reblogs": "Сховати поширення від {0}",
"mention_account": "Згадати {0}", "mention_account": "Згадати {0}",
"mute_account": "Приховати {0}", "mute_account": "Іґнорити {0}",
"mute_conversation": "Ігнорувати цей допис", "mute_conversation": "Іґнорити допис",
"open_in_original_site": "Відкрити на оригінальному сайті", "open_in_original_site": "Відкрити на ориґінальному сайті",
"pin_on_profile": "Закріпити на профілі", "pin_on_profile": "Закріпити на профілі",
"remove_personal_note": "Вилучити нотатку з {0}", "remove_personal_note": "Вилучити нотатку з {0}",
"report_account": "Повідомити про зловживання {0}", "report_account": "Поскаржитися на {0}",
"share_account": "Поділитися {0}", "share_account": "Поділитися {0}",
"share_post": "Поділіться цим дописом", "share_post": "Поділитися дописом",
"show_favourited_and_boosted_by": "Показати, хто вподобав та поширив", "show_favourited_and_boosted_by": "Показати, хто уподобали і поширили",
"show_reblogs": "Показати поширення від {0}", "show_reblogs": "Показати поширення від {0}",
"show_untranslated": "Показати без перекладу", "show_untranslated": "Показати без перекладу",
"toggle_theme": { "toggle_theme": {
"dark": "Увімкнути темний режим", "dark": "Перемикнути темний режим",
"light": "Увімкнути світлий режим" "light": "Перемикнути світлий режим"
}, },
"translate_post": "Перекласти допис", "translate_post": "Перекласти допис",
"unblock_account": "Розблокувати {0}", "unblock_account": "Розблочити {0}",
"unblock_domain": "Розблокувати домен {0}", "unblock_domain": "Розблочити домен {0}",
"unfollow_account": "Скасувати підписку на {0}", "unfollow_account": "Відписатися від {0}",
"unmute_account": "Не приховувати {0}", "unmute_account": "Розіґнорити {0}",
"unmute_conversation": "Не ігнорувати цей допис", "unmute_conversation": "Розіґнорити допис",
"unpin_on_profile": "Відкріпити з профілю" "unpin_on_profile": "Відкріпити з профілю"
}, },
"modals": {
"aria_label_close": "Закрити"
},
"nav": { "nav": {
"back": "Назад", "back": "Перейти назад",
"blocked_domains": "Заблоковані домени", "blocked_domains": "Заблоковані домени",
"blocked_users": "Заблоковані користувачі", "blocked_users": "Заблоковані користувачі",
"bookmarks": "Закладки", "bookmarks": "Закладки",
"built_at": "Оновлено {0}", "built_at": "Оновлено {0}",
"compose": "Написати", "compose": "Написати",
"conversations": "Розмови", "conversations": "Розмови",
"docs": "Документація",
"explore": "Огляд", "explore": "Огляд",
"favourites": "Вподобане", "favourites": "Уподобане",
"federated": "Глобальна стрічка", "federated": "Ґлобальна",
"hashtags": "Хештеґи", "hashtags": "Гаштаґи",
"home": "Головна", "home": "Головна",
"list": "Список", "list": "Список",
"lists": "Списки", "lists": "Списки",
"local": "Локальна стрічка", "local": "Локальна",
"muted_users": "Приховані користувачі", "more_menu": "Додаткове меню",
"muted_users": "Іґноровані користувачі",
"notifications": "Сповіщення", "notifications": "Сповіщення",
"privacy": "Конфіденційність", "privacy": "Конфіденційність",
"profile": "Профіль", "profile": "Профіль",
"search": "Пошук", "search": "Пошук",
"select_feature_flags": "Налаштування функцій", "select_feature_flags": "Перемикнути параметри",
"select_font_size": "Вибрати розмір шрифту", "select_font_size": "Розмір шрифту",
"select_language": "Вибрати мову", "select_language": "Відображати мову",
"settings": "Налаштування", "settings": "Налаштування",
"show_intro": "Показати інтро", "show_intro": "Показати вступ",
"toggle_theme": "Змінити тему", "toggle_theme": "Перемикнути тему",
"zen_mode": "Zen-режим" "zen_mode": "Zen режим"
}, },
"notification": { "notification": {
"favourited_post": "вподобав ваший допис", "favourited_post": "уподобали допис",
"followed_you": "підписались на вас", "followed_you": "підписалися на вас",
"followed_you_count": "{0} людей підписалися на вас|{0} людина підписалися на вас|{0} людини підписалися на вас|{0} людей підписалися на вас", "followed_you_count": "{0} підписалися на вас",
"missing_type": "ВІДСУТНІЙ notification.type:", "missing_type": "ВІДСУТНІЙ notification.type:",
"reblogged_post": "поширили ваш допис", "reblogged_post": "поширили допис",
"request_to_follow": "попросили підписатися на вас", "reported": "{0} поскаржилися на {1}",
"signed_up": "зареєструвалися", "request_to_follow": "запитали підписку на вас",
"update_status": "оновили свій допис" "signed_up": "долучилися",
"update_status": "оновили допис"
}, },
"placeholder": { "placeholder": {
"content_warning": "Напишіть ваше попередження тут", "content_warning": "Напишіть попередження тут",
"default_1": "Що у вас на думці?", "default_1": "Що маєте на думці?",
"reply_to_account": "Відповісти {0}", "reply_to_account": "Відповісти до {0}",
"replying": "Відповідь" "replying": "Відповiдь"
},
"polls": {
"allow_multiple": "Дозволяти чисельний вибір",
"cancel": "Скасувати",
"create": "Створити опит",
"disallow_multiple": "Не дозволяти чисельний вибір",
"expiration": "Завершення опиту",
"hide_votes": "Сховати кількість голосів до завершення",
"option_placeholder": "Вибір опиту {current}/{max}",
"remove_option": "Вилучити вибір",
"settings": "Опції опиту",
"show_votes": "Завжди показувати кількість голосів"
}, },
"pwa": { "pwa": {
"dismiss": "Закрити", "dismiss": "Закрити",
@ -318,43 +371,90 @@
"update_available_short": "Оновити Elk", "update_available_short": "Оновити Elk",
"webmanifest": { "webmanifest": {
"canary": { "canary": {
"description": "Спритний веб-клієнт для Mastodon (canary)", "description": "Спритний вебклієнт для Mastodon (canary)",
"name": "Elk (canary)", "name": "Elk (canary)",
"short_name": "Elk (canary)" "short_name": "Elk (canary)"
}, },
"dev": { "dev": {
"description": "Спритний веб-клієнт для Mastodon (dev)", "description": "Спритний вебклієнт для Mastodon (dev)",
"name": "Elk (dev)", "name": "Elk (dev)",
"short_name": "Elk (dev)" "short_name": "Elk (dev)"
}, },
"preview": { "preview": {
"description": "Спритний веб-клієнт для Mastodon (preview)", "description": "Спритний вебклієнт для Mastodon (preview)",
"name": "Elk (preview)", "name": "Elk (preview)",
"short_name": "Elk (preview)" "short_name": "Elk (preview)"
}, },
"release": { "release": {
"description": "Спритний веб-клієнт для Mastodon", "description": "Спритний вебклієнт для Mastodon",
"name": "Elk", "name": "Elk",
"short_name": "Elk" "short_name": "Elk"
} }
} }
}, },
"report": {
"additional_comments": "Додаткові коментарі",
"another_server": "Користувач, на котрого скаржите, з іншого серверу",
"anything_else": "Чи щось ще ми повинні знати?",
"block_desc": "Більше не бачитимете дописів цього користувача. Він не зможе бачити ваші дописи чи підписатися на вас. Він зможе визначити, що він заблокований.",
"dontlike": "Не люблю це",
"dontlike_desc": "Це щось не те, що хочу бачити",
"forward": "Так, переслати скаргу до {0}",
"forward_question": "Хочeте також надіслати безіменну копію скарги на той сервер?",
"further_actions": {
"limit": {
"description": "Варіанти дій щодо того, що бачите:",
"title": "Не хочете бачити це?"
},
"report": {
"description": "Поки розглядаємо, ось що можете зробити:",
"title": "Дякуємо за скаргу, ми розглянемо"
}
},
"limiting": "Обмеження {0}",
"mute_desc": "Більше не бачитимете дописів цього користувача. Він все ще може бачити ваші дописи чи підписатися на вас. Він не зможе визначити, що він іґнорований.",
"other": "Щось інше",
"other_desc": "Проблема не підпадає під інші категорії",
"reporting": "Скарга {0}",
"select_many": "Можете вибрати все що підходить:",
"select_one": "Виберіть найкращий варіант:",
"select_posts": "Чи є якісь дописи, що підпадають під скаргу?",
"select_posts_other": "Чи є якісь інші дописи, що підпадають під скаргу?",
"spam": "Спам",
"spam_desc": "Зловмисні посилання, брехливі домовленості чи повторювані відповіді",
"submit": "Подати скаргу",
"unfollow_desc": "Більше не бачитимете дописів цього користувача в вашій головній стрічці. Все ще можете бачити дописи деінде.",
"violation": "Порушує одне чи більше правил сервера",
"whats_wrong_account": "Що не так з цим обліковим записом",
"whats_wrong_post": "Що не так з цим дописом"
},
"search": { "search": {
"search_desc": "Пошук користувачів та хештеґів", "search_desc": "Пошук користувачів і гаштаґів",
"search_empty": "Не вдалося знайти нічого, що відповідає цим пошуковим термінам" "search_empty": "Не вдалося знайти нічого під ці пошукові терміни"
}, },
"settings": { "settings": {
"about": { "about": {
"label": "Про нас" "built_at": "Оновлено",
"label": "Про нас",
"meet_the_team": "Команда",
"sponsor_action": "Спонсорувати",
"sponsor_action_desc": "Підтримати команду розробників Elk",
"sponsors": "Спонсори",
"sponsors_body_1": "Elk існує завдяки благородному спонсоруванню і допомозі:",
"sponsors_body_2": "І всім компанійним і індивідуальним спонсоруванням Команді Elk і її членам.",
"sponsors_body_3": "Якщо ви задоволені застосунком, то можете розглянути спонсорування нам:",
"version": "Версія"
}, },
"account_settings": { "account_settings": {
"description": "Відредагуйте налаштування облікового запису використовуєчи інтерфейс Mastodon", "description": "Правити налаштування облікового запису через інтерфейс Mastodon",
"label": "Налаштування облікового запису" "label": "Налаштування облікового запису"
}, },
"interface": { "interface": {
"color_mode": "Кольорова тема", "bottom_nav": "Нижня навіґація",
"bottom_nav_instructions": "Можете вибрати до пʼять бажаних кнопок до нижної навіґації. Мусить включати кнопку «Додаткове меню».",
"color_mode": "Кольоровий режим",
"dark_mode": "Темна", "dark_mode": "Темна",
"default": " (за замовчуванням)", "default": " (уставно)",
"font_size": "Розмір шрифта", "font_size": "Розмір шрифта",
"label": "Інтерфейс", "label": "Інтерфейс",
"light_mode": "Світла", "light_mode": "Світла",
@ -362,16 +462,16 @@
"theme_color": "Колір теми" "theme_color": "Колір теми"
}, },
"language": { "language": {
"display_language": "Мова інтерфейсу", "display_language": "Відображати мову",
"label": "Мова", "label": "Мова",
"post_language": "Мова дописів", "post_language": "Мова дописів",
"status": "Статус перекладу: {0}/{1} ({2}%)", "status": "Стан перекладу: {0}/{1} ({2}%)",
"translations": { "translations": {
"add": "Додати", "add": "Додати",
"choose_language": "Виберіть мову", "choose_language": "Вибрати мову",
"heading": "Переклад", "heading": "Переклади",
"hide_specific": "Приховати переклад з мов", "hide_specific": "Сховати окремі переклади",
"remove": "Видалити" "remove": "Вилучити"
} }
}, },
"notifications": { "notifications": {
@ -381,170 +481,224 @@
}, },
"push_notifications": { "push_notifications": {
"alerts": { "alerts": {
"favourite": "Вподобання", "favourite": "Уподобання",
"follow": "Нові підписники", "follow": "Нові підписники",
"mention": "Згадки", "mention": "Згадки",
"poll": "Опитування", "poll": "Опит",
"reblog": "Поширення вашого допису", "reblog": "Поширення",
"title": "Які сповіщення отримувати?" "title": "Які сповіщення отримувати?"
}, },
"description": "Отримуйте сповіщення, навіть якщо ви не використовуєте Elk.", "description": "Отримувати сповіщення навіть поза Elk.",
"instructions": "Не забудьте зберегти зміни за допомогою кнопки \"@:settings.notifications.push_notifications.save_settings{'\"'}!", "instructions": "Нагадка: зберегти зміни кнопкою «@:settings.notifications.push_notifications.save_settings{'»'}!",
"label": "Налаштування push-сповіщень", "label": "Налаштування push-сповіщень",
"policy": { "policy": {
"all": "Від будь-кого", "all": "Будь-кого",
"followed": "Людей, за якими я стежу", "followed": "Підписок",
"follower": "Людей, які слідкують за мною", "follower": "Підписників",
"none": "Ні від кого", "none": "Жодного",
"title": "Від кого отримувати сповіщення?" "title": "Від кого отримувати сповіщення?"
}, },
"save_settings": "Зберегти налаштування", "save_settings": "Зберегти налаштування",
"subscription_error": { "subscription_error": {
"clear_error": "Очистити помилку", "clear_error": "Очистити помилку",
"permission_denied": "У дозволі відмовлено: увімкніть сповіщення у своєму браузері.", "error_hint": "Можете порадитися зі списком поширених запитань, аби спробувати рішити проблему: {0}.",
"request_error": "Під час запиту на підписку сталася помилка. Повторіть спробу, а якщо помилка не зникне, повідомте про проблему в репозиторій Elk.", "invalid_vapid_key": "Схоже, прилюдний ключ VAPID є непридатним.",
"title": "Не вдалося підписатися на push-сповіщення" "permission_denied": "У дозволі відмовлено: треба включити сповіщення в своєму бравзері.",
"repo_link": "Репозиторій Elk на GitHub",
"request_error": "Під час запиту на підписку сталася помилка. Можете повторити спробу, якщо помилка не зникне, просимо повідомити про проблему в репозиторій Elk.",
"title": "Не вдалося підписатися на push-сповіщення",
"too_many_registrations": "Через обмеження бравзера, Elk не може користуватися сервісом push-сповіщень для чисельних облікових записів на різних серверах. Ви повинні відписатися від push-сповіщення від інших облікових записів і спробувати знову.",
"vapid_not_supported": "Ваш бравзер підтримує push-сповіщення, але, схоже, не впровадив VAPID протокол."
}, },
"title": "Налаштування push-сповіщення",
"undo_settings": "Скасувати зміни", "undo_settings": "Скасувати зміни",
"unsubscribe": "Вимкнути push-сповіщення", "unsubscribe": "Вимкнути push-сповіщення",
"unsupported": "Ваш браузер не підтримує push-сповіщення.", "unsupported": "Ваш бравзер не підтримує push-сповіщення.",
"warning": { "warning": {
"enable_close": "Закрити", "enable_close": "Закрити",
"enable_description": "Щоб отримувати сповіщення, коли Elk не відкрито, увімкніть push-сповіщення. Ви можете контролювати, які саме типи сповіщень генерують push-повідомлення, за допомогою кнопки \"@:settings.notifications.show_btn{'\"'} після ввімкнення.", "enable_description": "Push-сповіщення надають змогу отримувати сповіщення при невідкритому Elk. Після ввімкнення їх можете указати які види взаємодій створюють вони за кнопкою «@:settings.notifications.show_btn{'»'} .",
"enable_desktop": "Увімкнути push-повідомлення", "enable_description_desktop": "Push-сповіщення надають змогу отримувати сповіщення при невідкритому Elk. Після ввімкнення їх можете указати які види взаємодій створюють вони в «Налаштування > Сповіщення > Налаштування push-сповіщення».",
"enable_description_mobile": "Налаштування також доступне за навіґаційним меню «Налаштування > Сповіщення > Налаштування push-сповіщення».",
"enable_description_settings": "Push-сповіщення надають змогу отримувати сповіщення при невідкритому Elk. Після ввімкнення їх тут зможете указати які види взаємодій створюють вони.",
"enable_desktop": "Ввімкнути push-сповіщення",
"enable_title": "Ніколи нічого не пропускайте", "enable_title": "Ніколи нічого не пропускайте",
"re_auth": "Здається, ваш сервер не підтримує push-повідомлення. Спробуйте вийти та увійти знову, якщо це повідомлення все одно з’являється, зверніться до адміністратора свого сервера." "re_auth": "Здається, ваш сервер не підтримує push-сповіщення. Спробуйте вийти і ввійти знову, якщо це повідомлення однаково з’являється, варто звернутися до адміністратора сервера."
} }
}, },
"show_btn": "Перейти до налаштувань сповіщень" "show_btn": "Перейти до налаштувань сповіщень",
"under_construction": "Під розробкою"
}, },
"notifications_settings": "Сповіщення", "notifications_settings": "Сповіщення",
"preferences": { "preferences": {
"embedded_media": "Вбудований медіаплеєр", "embedded_media": "Вбудований медіаплеєр",
"embedded_media_description": "Відображати вбудований медіаплеєр замість картки, коли допис містить посилання на медіа.", "embedded_media_description": "Відображати вбудований медіаплеєр замість картки в дописі з посиланням на медіа.",
"enable_autoplay": "Увімкнути автовідтворення", "enable_autoplay": "Ввімкнути автовідтворення",
"enable_data_saving": "Увімкнути економію трафіку", "enable_data_saving": "Ввімкнути заощадження трафіку",
"enable_data_saving_description": "Економте трафік, відключивши автоматичне завантаження вкладень.", "enable_data_saving_description": "Заощаджити трафік через запобігання автозавантаження вкладень.",
"github_cards": "Картки GitHub", "github_cards": "Картки GitHub",
"grayscale_mode": "Режим відтінків сірого", "github_cards_description": "Посилання в дописі на GitHub створює доступну HTML картку з соціальним метаґрафом замість соціального зображення.",
"hide_account_hover_card": "Не відображати картку при наведенні на обліковий запис", "grayscale_mode": "Сіротонний режим",
"hide_alt_indi_on_posts": "Приховати індикатор альтернативного тексту у дописах", "hide_account_hover_card": "Сховати картку при наведенні на обліковий запис",
"hide_boost_count": "Приховати кількість поширень", "hide_alt_indi_on_posts": "Сховати ALT-покажчик в дописах",
"hide_favorite_count": "Приховати кількість вподобань", "hide_boost_count": "Сховати кількість поширень",
"hide_follower_count": "Приховати кількість підписок/підписників", "hide_favorite_count": "Сховати кількість уподобань",
"hide_news": "Приховати новини", "hide_follower_count": "Сховати кількість підписок/підписників",
"hide_reply_count": "Приховати кількість відповідей", "hide_gif_indi_on_posts": "Сховати GIF-покажчик в дописах",
"hide_tag_hover_card": "Не відображати картку при наведенні на хештеґ", "hide_news": "Сховати новини",
"hide_translation": "Приховати переклад", "hide_reply_count": "Сховати кількість відповідей",
"hide_username_emojis": "Приховати емодзі в іменах користувачів", "hide_tag_hover_card": "Сховати картку при наведенні на гаштаґ",
"hide_username_emojis_description": "Приховати емодзі в іменах користувачів у стрічках дописів. \nЕмодзі все одно відображатимуться на сторінках профілів.", "hide_translation": "Сховати переклад",
"hide_username_emojis": "Сховати емоджі в назвах користувачів",
"hide_username_emojis_description": "Сховати емоджі в назвах користувачів в стрічках дописів. \nЕмоджі все ще відображатимуться на сторінках профілів.",
"label": "Налаштування", "label": "Налаштування",
"optimize_for_low_performance_device": "Оптимізувати для низькопродуктивних пристроїв", "optimize_for_low_performance_device": "Оптимізувати для низькопродуктивних пристроїв",
"title": "Експериментальні налаштування", "title": "Дослідні налаштування",
"use_star_favorite_icon": "Використовувати піктограму \"зірка\" для вподобань", "use_star_favorite_icon": "Використовувати іконку «зірка» для уподобань",
"user_picker": "Перемикач облікових записів", "user_picker": "Перемикач облікових записів",
"user_picker_description": "Відображати аватари ваших облікових записів у нижньому лівому куті, щоб ви могли швидко перемикатися між ними.", "user_picker_description": "Відображати аватари ваших облікових записів в нижньолівому куті для швидкого перемикатися між ними.",
"virtual_scroll": "Віртуальний список", "virtual_scroll": "Віртуальний список",
"virtual_scroll_description": "Використовувати віртуальний список у стрічках дописів. Це дозволяє відображати більшу кількість елементів без втрати продуктивності.", "virtual_scroll_description": "Використовувати віртуальний список в стрічках дописів. Це дозволяє відображати більшу кількість елементів без втрати продуктивності.",
"zen_mode": "Дзен режим", "wellbeing": "Благополуччя",
"zen_mode_description": "Приховати бокові панелі, якщо на них не наведено курсор миші. \nТакож приховує деякі елементи у стрічці дописів." "zen_mode": "Zen режим",
"zen_mode_description": "Сховати бічні панелі, якщо на них не наведено курсор миші. \nТакож приховує деякі елементи в стрічці дописів."
}, },
"profile": { "profile": {
"appearance": { "appearance": {
"bio": "Про Вас", "bio": "Про вас",
"description": "Редагувати аватар, ім'я, профіль, тощо.", "description": "Правити аватар, назву, профіль тощо.",
"display_name": "Ім'я", "display_name": "Відображати назву",
"label": "Вигляд", "label": "Вигляд",
"profile_metadata": "Метадані профілю", "profile_metadata": "Метадані профілю",
"profile_metadata_desc": "У вашому профілі можна відображати до 4 елементів у вигляді таблиці", "profile_metadata_desc": "Можете відобразити до {0} елементів як таблицю в профілі",
"title": "Редагувати профіль" "profile_metadata_label": "Ярлик",
"profile_metadata_value": "Вміст",
"title": "Правити профіль"
}, },
"featured_tags": { "featured_tags": {
"description": "Користувачі можуть фільтрувати ваші загальнодоступні дописи за цими хештеґами.", "description": "Ваші прилюдні дописи можуть бути проглянуті за цими гаштаґами.",
"label": "Рекомендовані хештеґи" "label": "Рекомендовані гаштаґи",
"under_construction": "Під розробкою"
}, },
"label": "Профіль" "label": "Профіль"
}, },
"select_a_settings": "Виберіть налаштування", "select_a_settings": "Вибрати налаштування",
"users": { "users": {
"export": "Експортувати токени користувачів", "export": "Винести токени користувачів",
"import": "Імпортувати токени користувачів", "import": "Внести токени користувачів",
"label": "Користувачі" "label": "Користувачі"
} }
}, },
"share_target": {
"description": "Можна підлаштувати Elk, тож можете ділитися контентом з інших застосунків лише встановивши Elk на вашому пристрої чи компʼютері і ввійшовши.",
"hint": "Щоби поширити контент з Elk, Elk мусть бути встановленим, а ви мусите бути ввійденим.",
"title": "Поділитися з Elk"
},
"state": { "state": {
"attachments_exceed_server_limit": "Кількість вкладених файлів перевищила ліміт на допис.", "attachments_exceed_server_limit": "Кількість вкладених файлів на допис перевищено.",
"attachments_limit_error": "Перевищено максимальну кількість вкладень", "attachments_limit_audio_error": "Перевищено маскимальний розмір авдіо: {0}",
"edited": "(Відредаговано)", "attachments_limit_error": "Перевищено максимальну кількість вкладень: {0}",
"editing": "Редагування", "attachments_limit_image_error": "Перевищено маскимальний розмір зображення: {0}",
"attachments_limit_unknown_error": "Перевищено маскимальний розмір файла: {0}",
"attachments_limit_video_error": "Перевищено маскимальний розмір відео: {0}",
"edited": "(Виправлено)",
"editing": "Виправлення",
"loading": "Завантаження...", "loading": "Завантаження...",
"publish_failed": "Помилка оприлюднення",
"publishing": "Оприлюднення",
"save_failed": "Помилка збереження",
"upload_failed": "Помилка завантаження", "upload_failed": "Помилка завантаження",
"uploading": "Завантаження..." "uploading": "Завантаження..."
}, },
"status": { "status": {
"edited": "Редаговано {0}", "account": {
"filter_hidden_phrase": "Відфільтровано", "suspended_message": "Обліковий запис цього допису заморожений.",
"suspended_show": "Все одно показати допис?"
},
"boosted_by": "Поширено від",
"edited": "Виправлено {0}",
"embedded_warning": "Програвання цього може розкрити ваш IP-адрес іншим.",
"favourited_by": "Уподобано від",
"filter_hidden_phrase": "Відфільтровано від",
"filter_show_anyway": "Показати все одно", "filter_show_anyway": "Показати все одно",
"gif": "GIF",
"img_alt": { "img_alt": {
"desc": "Опис зображення", "ALT": "ALT",
"dismiss": "Закрити" "desc": "Опис",
"dismiss": "Закрити",
"read": "Читати {0} опис"
}, },
"poll": { "poll": {
"count": "{0} голосів|{0} голос|{0} голоси|{0} голосів", "count": "{0} голосів|{0} голос|{0} голоси|{0} голосів",
"ends": "завершується {0}", "ends": "завершується {0}",
"finished": "зевершилось {0}" "finished": "зевершилось {0}"
}, },
"replying_to": "Відповідає {0}", "replying_to": "Відповідь до {0}",
"show_full_thread": "Показати потік дописів", "show_full_thread": "Показати ряд дописів",
"someone": "комусь", "someone": "когось",
"spoiler_media_hidden": "Медіа приховано",
"spoiler_show_less": "Показувати менше", "spoiler_show_less": "Показувати менше",
"spoiler_show_more": "Показати більше", "spoiler_show_more": "Показати більше",
"try_original_site": "Спробуйте оригінальний сайт" "thread": "Ряд дописів",
"try_original_site": "Спробувати ориґінальний сайт"
}, },
"status_history": { "status_history": {
"created": "створено {0}", "created": "створено {0}",
"edited": "редаговано {0}" "edited": "виправлено {0}"
}, },
"tab": { "tab": {
"accounts": "Облікові записи",
"for_you": "Для вас", "for_you": "Для вас",
"hashtags": "Хештеґи", "hashtags": "Гаштаґи",
"list": "Список",
"media": "Медіа", "media": "Медіа",
"news": "Новини", "news": "Новини",
"notifications_all": "Усі", "notifications_admin": {
"report": "Скагра",
"sign_up": "Долучення"
},
"notifications_all": "Всі",
"notifications_favourite": "Уподобані",
"notifications_follow": "Підписки",
"notifications_follow_request": "Запит підписки",
"notifications_mention": "Згадки", "notifications_mention": "Згадки",
"notifications_more_tooltip": "Фільтрувати сповіщення за типом",
"notifications_poll": "Опити",
"notifications_reblog": "Поширення",
"notifications_status": "Статуси",
"notifications_update": "Оновлення",
"posts": "Дописи", "posts": "Дописи",
"posts_with_replies": "Дописи та відповіді" "posts_with_replies": "Дописи і відповіді"
}, },
"tag": { "tag": {
"follow": "Стежити", "follow": "Підписатися",
"follow_label": "Стежити за хештеґом {0}", "follow_label": "Підписатися на гаштаґ {0}",
"unfollow": "Не стежити", "unfollow": "Відписатися",
"unfollow_label": "Не стежити за хештеґом {0}" "unfollow_label": "Відписатися від гаштаґа {0}"
}, },
"time_ago_options": { "time_ago_options": {
"day_future": "через {n} днів|через {n} день|через {n} дні|через {n} днів", "day_future": "через {n} днів|через {n} день|через {n} дні|через {n} днів",
"day_past": "{n} днів томо|{n} день тому|{n} дні тому|{n} днів тому", "day_past": "{n} днів тому|{n} день тому|{n} дні тому|{n} днів тому",
"hour_future": "через {n} годин|через {n} годину|через {n} години|через {n} годин", "hour_future": "через {n} годин|через {n} годину|через {n} години|через {n} годин",
"hour_past": "{n} годин тому|{n} годину тому|{n} години тому|{n} годин тому", "hour_past": "{n} годин тому|{n} годину тому|{n} години тому|{n} годин тому",
"just_now": "тільки що", "just_now": "щойно",
"minute_future": "через {n} хвилин|через {n} хвилину|через {n} хвилини|через {n} хвилин", "minute_future": "через {n} хвилин|через {n} хвилину|через {n} хвилини|через {n} хвилин",
"minute_past": "{n} хвилин тому|{n} хвилину тому|{n} хвилини тому|{n} хвилин тому", "minute_past": "{n} хвилин тому|{n} хвилину тому|{n} хвилини тому|{n} хвилин тому",
"month_future": "через {n} місяців|через {n} місяць|через {n} місяці|через {n} місяців", "month_future": "через {n} місяців|через {n} місяць|через {n} місяці|через {n} місяців",
"month_past": "{n} місяців тому|{n} місяць тому|{n} місяці тому|{n} місяців тому", "month_past": "{n} місяців тому|{n} місяць тому|{n} місяці тому|{n} місяців тому",
"second_future": "тільки що|через {n} секунду|через {n} секунди|через {n} секунд", "second_future": "щойно|через {n} секунду|через {n} секунди|через {n} секунд",
"second_past": "тільки що|{n} секунду тому|{n} секунди тому|{n} секунд тому", "second_past": "щойно|{n} секунду тому|{n} секунди тому|{n} секунд тому",
"short_day_future": "через {n}дн", "short_day_future": "через {n} д",
"short_day_past": "{n}дн", "short_day_past": "{n} д",
"short_hour_future": "через {n}год", "short_hour_future": "через {n} г",
"short_hour_past": "{n}год", "short_hour_past": "{n} г",
"short_minute_future": "через {n} хв", "short_minute_future": "через {n} хв",
"short_minute_past": "{n} хв", "short_minute_past": "{n} хв",
"short_month_future": "через {n}міс", "short_month_future": "через {n} м",
"short_month_past": "{n}міс", "short_month_past": "{n} м",
"short_second_future": "через {n}сек", "short_second_future": "через {n} с",
"short_second_past": "{n}сек", "short_second_past": "{n} с",
"short_week_future": "через {n}тиж", "short_week_future": "через {n} т",
"short_week_past": "{n}тиж", "short_week_past": "{n} т",
"short_year_future": "через {n} р", "short_year_future": "через {n} р",
"short_year_past": "{n} р", "short_year_past": "{n} р",
"week_future": "через {n} тижнів|через {n} тиждень|через {n} тижні|через {n} тижнів", "week_future": "через {n} тижнів|через {n} тиждень|через {n} тижні|через {n} тижнів",
@ -553,42 +707,52 @@
"year_past": "{n} років тому|{n} рік тому|{n} роки тому|{n} років тому" "year_past": "{n} років тому|{n} рік тому|{n} роки тому|{n} років тому"
}, },
"timeline": { "timeline": {
"show_new_items": "Показати {v} нових дописів|Показати {v} новий допис|Показати {v} нових дописи|Показати {v} нових дописів", "show_new_items": "Показати {v} нових дописів|Показати {v} новий допис|Показати {v} нових дописів|Показати {v} нових дописів",
"view_older_posts": "Старіші дописи з інших серверів можуть не відображатися." "view_older_posts": "Старіші дописи з інших серверів можуть не відображатися."
}, },
"title": { "title": {
"federated_timeline": "Глобальна стрічка", "federated_timeline": "Ґлобальна стрічка",
"local_timeline": "Локальна стрічка" "local_timeline": "Локальна стрічка"
}, },
"tooltip": { "tooltip": {
"add_content_warning": "Додати попередження про вміст", "add_content_warning": "Додати попередження про вміст",
"add_media": "Додати зображення, відео або аудіо", "add_emojis": "Додати емоджі",
"add_media": "Додати зображення, відео або авдіо",
"add_publishable_content": "Варто додати вміст для оприлюднення",
"add_thread_item": "Додати допис до ряду",
"change_content_visibility": "Змінити видимість вмісту", "change_content_visibility": "Змінити видимість вмісту",
"change_language": "Змінити мову", "change_language": "Змінити мову",
"emoji": "Емодзі", "emoji": "Емоджі",
"explore_links_intro": "Ці новини розповідають історії про людей на цих та інших серверах децентралізованої мережі прямо зараз.", "explore_links_intro": "Прямо зараз на цьому і інших серверах децентралізованої мережі обговорюють ці новини.",
"explore_posts_intro": "Ці дописи з цього та інших серверів децентралізованої мережі зараз набирають популярності на цьому сервері.", "explore_posts_intro": "Прямо зараз на цьому і інших серверах децентралізованої мережі розходяться ці дописи.",
"explore_tags_intro": "Ці хештеґи зараз набирають популярності серед людей на цьому та інших серверах децентралізованої мережі.", "explore_tags_intro": "Прямо зараз на цьому і інших серверах децентралізованої мережі розходяться ці гаштаґи",
"toggle_code_block": "Блок коду" "open_editor_tools": "Інструменти редактора",
"pick_an_icon": "Підібрати іконку",
"publish_failed": "Закрити повідомлення помилок нагорі редактора для переоприлюднення дописів",
"remove_thread_item": "Вилучити допис з ряду",
"start_thread": "Запустити ряд дописів",
"toggle_bold": "Жирний",
"toggle_code_block": "Блок коду",
"toggle_italic": "Курсив"
}, },
"user": { "user": {
"add_existing": "Додати аккаунт", "add_existing": "Додати наявний обліковий запис",
"server_address_label": "Адреса серверу Mastodon", "server_address_label": "Адреса серверу Mastodon",
"sign_in_desc": "Увійдіть, щоб стежити за профілями або хештеґами, додавати до обраного, ділитися дописами та відповідати на них, або взаємодіяти з вашого аккаунту на іншому сервері.", "sign_in_desc": "Ввійти, аби підписатися на профілі або гаштаґи; уподобувати, відповідати на і ділитися з кимось дописи, або взаємодіяти з вашого облікового запису на іншому сервері.",
"sign_in_notice_title": "Перегляд публічних даних {0}", "sign_in_notice_title": "Перегляд прилюдних даних {0}",
"sign_out_account": "Вийти з {0}", "sign_out_account": "Вийти з {0}",
"single_instance_sign_in_desc": "Увійдіть, щоб стежити за профілями чи хештеґами, додавати до обраного, ділитися дописами та відповідати на них.", "single_instance_sign_in_desc": "Ввійти, аби підписатися на профілі або гаштаґи; уподобувати, відповідати на і ділитися з кимось дописи.",
"tip_no_account": "Якщо у вас ще немає аккаунту Mastodon, {0}.", "tip_no_account": "Якщо не маєте облікового Mastodon запису, {0}.",
"tip_register_account": "оберіть сервер і зареєструйтесь" "tip_register_account": "то можете підібрати сервер і долучитися"
}, },
"visibility": { "visibility": {
"direct": "Лише згадані користувачі", "direct": "Прямий",
"direct_desc": "Показати лише згаданим користувачам", "direct_desc": "Видимий лише згаданим користувачам",
"private": "Тільки для підписників", "private": "Лише підписникам",
"private_desc": "Показати лише підписникам", "private_desc": "Видимий лише підписникам",
"public": ублічно", "public": рилюдний",
"public_desc": "Видимий для всіх", "public_desc": "Видимий всім",
"unlisted": "Прихований", "unlisted": "Прихований",
"unlisted_desc": "Видимий для всіх, але не через можливості виявлення" "unlisted_desc": "Видимий всім, але не в прилюдних стрічках"
} }
} }

View file

@ -28,7 +28,7 @@
"go_to_profile": "Xem hồ sơ", "go_to_profile": "Xem hồ sơ",
"joined": "Đã tham gia", "joined": "Đã tham gia",
"lock": "KHÓA", "lock": "KHÓA",
"moved_title": "cho hay địa chỉ mới của họ bây giờ là:", "moved_title": "đã chuyển sang địa chỉ mới:",
"muted_users": "Người đã ẩn", "muted_users": "Người đã ẩn",
"muting": "Đã ẩn", "muting": "Đã ẩn",
"mutuals": "Theo dõi nhau", "mutuals": "Theo dõi nhau",
@ -73,6 +73,7 @@
"favourited": "Đã thích", "favourited": "Đã thích",
"more": "Xem thêm", "more": "Xem thêm",
"next": "Kế tiếp", "next": "Kế tiếp",
"open_image_preview_dialog": "Mở hộp thoại xem trước hình ảnh",
"prev": "Trước đó", "prev": "Trước đó",
"publish": "Đăng", "publish": "Đăng",
"publish_thread": "Đăng chuỗi tút", "publish_thread": "Đăng chuỗi tút",
@ -186,7 +187,7 @@
"account_not_found": "Không tìm thấy {0}", "account_not_found": "Không tìm thấy {0}",
"explore_list_empty": "Chưa có xu hướng. Hãy quay lại sau!", "explore_list_empty": "Chưa có xu hướng. Hãy quay lại sau!",
"file_size_cannot_exceed_n_mb": "Dung lượng file tối đa {0}MB", "file_size_cannot_exceed_n_mb": "Dung lượng file tối đa {0}MB",
"sign_in_error": "Không thể kết nối tới máy chủ.", "sign_in_error": "Không thể kết nối đến máy chủ.",
"status_not_found": "Không tìm thấy tút", "status_not_found": "Không tìm thấy tút",
"unsupported_file_format": "Định dạng file không được hỗ trợ" "unsupported_file_format": "Định dạng file không được hỗ trợ"
}, },
@ -246,7 +247,7 @@
"go_to_bookmarks": "Tút đã lưu", "go_to_bookmarks": "Tút đã lưu",
"go_to_conversations": "Nhắn riêng", "go_to_conversations": "Nhắn riêng",
"go_to_explore": "Khám phá", "go_to_explore": "Khám phá",
"go_to_favourites": "Lượt thích", "go_to_favourites": "Đã thích",
"go_to_federated": "Liên hợp", "go_to_federated": "Liên hợp",
"go_to_home": "Trang chủ", "go_to_home": "Trang chủ",
"go_to_lists": "Danh sách", "go_to_lists": "Danh sách",
@ -305,13 +306,13 @@
"back": "Quay về", "back": "Quay về",
"blocked_domains": "Máy chủ đã chặn", "blocked_domains": "Máy chủ đã chặn",
"blocked_users": "Người đã chặn", "blocked_users": "Người đã chặn",
"bookmarks": "Tút đã lưu", "bookmarks": "Đã lưu",
"built_at": "Bản dựng {0}", "built_at": "Bản dựng {0}",
"compose": "Soạn tút", "compose": "Soạn tút",
"conversations": "Nhắn riêng", "conversations": "Nhắn riêng",
"docs": "Tài liệu", "docs": "Tài liệu",
"explore": "Khám phá", "explore": "Khám phá",
"favourites": "Lượt thích", "favourites": "Đã thích",
"federated": "Liên hợp", "federated": "Liên hợp",
"hashtags": "Hashtag", "hashtags": "Hashtag",
"home": "Trang chủ", "home": "Trang chủ",
@ -345,8 +346,8 @@
}, },
"placeholder": { "placeholder": {
"content_warning": "Viết cảnh báo của bạn ở đây", "content_warning": "Viết cảnh báo của bạn ở đây",
"default_1": "Bạn đang nghĩ gì vậy?", "default_1": "Bạn đang nghĩ gì đó?",
"reply_to_account": "Trả lời {0}", "reply_to_account": "Trả lời đến {0}",
"replying": "Trả lời" "replying": "Trả lời"
}, },
"polls": { "polls": {
@ -355,7 +356,7 @@
"create": "Tạo bình chọn", "create": "Tạo bình chọn",
"disallow_multiple": "Chỉ chọn một lựa chọn", "disallow_multiple": "Chỉ chọn một lựa chọn",
"expiration": "Hết hạn", "expiration": "Hết hạn",
"hide_votes": "Ẩn số lượt bình chọn cho tới khi hết hạn", "hide_votes": "Ẩn số lượt bình chọn đến khi hết hạn",
"option_placeholder": "Lựa chọn {current}/{max}", "option_placeholder": "Lựa chọn {current}/{max}",
"remove_option": "Xóa lựa chọn", "remove_option": "Xóa lựa chọn",
"settings": "Tùy chọn", "settings": "Tùy chọn",
@ -402,8 +403,8 @@
"block_desc": "Bạn sẽ không còn thấy tút của người này. Họ sẽ không thể thấy tút của bạn hoặc theo dõi bạn. Họ biết là bạn đã chặn họ.", "block_desc": "Bạn sẽ không còn thấy tút của người này. Họ sẽ không thể thấy tút của bạn hoặc theo dõi bạn. Họ biết là bạn đã chặn họ.",
"dontlike": "Tôi không thích nó", "dontlike": "Tôi không thích nó",
"dontlike_desc": "Đó không phải là thứ gì mà bạn muốn thấy", "dontlike_desc": "Đó không phải là thứ gì mà bạn muốn thấy",
"forward": "Gửi luôn báo cáo tới {0}", "forward": "Gửi luôn báo cáo đến {0}",
"forward_question": "Bạn có chắc muốn gửi luôn báo cáo tới máy chủ của người này?", "forward_question": "Bạn có chắc muốn gửi luôn báo cáo đến máy chủ của người này?",
"further_actions": { "further_actions": {
"limit": { "limit": {
"description": "Đây là cách kiểm soát những thứ mà bạn thấy:", "description": "Đây là cách kiểm soát những thứ mà bạn thấy:",
@ -441,7 +442,7 @@
"label": "Giới thiệu", "label": "Giới thiệu",
"meet_the_team": "Đội ngũ", "meet_the_team": "Đội ngũ",
"sponsor_action": "Tài trợ", "sponsor_action": "Tài trợ",
"sponsor_action_desc": "Hỗ trợ đội ngũ phát triển Elk", "sponsor_action_desc": "Ủng hộ đội ngũ phát triển Elk",
"sponsors": "Nhà tài trợ", "sponsors": "Nhà tài trợ",
"sponsors_body_1": "Elk được thực hiện nhờ sự tài trợ và giúp đỡ hào phóng của:", "sponsors_body_1": "Elk được thực hiện nhờ sự tài trợ và giúp đỡ hào phóng của:",
"sponsors_body_2": "Và tất cả các công ty, cá nhân tài trợ cho đội ngũ Elk.", "sponsors_body_2": "Và tất cả các công ty, cá nhân tài trợ cho đội ngũ Elk.",
@ -493,7 +494,7 @@
"title": "Bạn muốn nhận những kiểu thông báo nào?" "title": "Bạn muốn nhận những kiểu thông báo nào?"
}, },
"description": "Nhận thông báo kể cả khi bạn không sử dụng Elk.", "description": "Nhận thông báo kể cả khi bạn không sử dụng Elk.",
"instructions": "Nhớ lưu các thay đổi của bạn bằng cách nhấn @:settings.notifications.push_notifications.save_settings !", "instructions": "Nhớ @:settings.notifications.push_notifications.save_settings sau khi chọn xong!",
"label": "Cài đặt thông báo đẩy", "label": "Cài đặt thông báo đẩy",
"policy": { "policy": {
"all": "Từ bất kỳ ai", "all": "Từ bất kỳ ai",
@ -550,7 +551,7 @@
"hide_follower_count": "Ẩn số lượt người theo dõi/đang theo dõi", "hide_follower_count": "Ẩn số lượt người theo dõi/đang theo dõi",
"hide_gif_indi_on_posts": "Ẩn biểu tượng GIF trên tút", "hide_gif_indi_on_posts": "Ẩn biểu tượng GIF trên tút",
"hide_news": "Ẩn tin tức", "hide_news": "Ẩn tin tức",
"hide_reply_count": "Ẩn số lượt trả lời", "hide_reply_count": "Ẩn số lượng trả lời",
"hide_tag_hover_card": "Ẩn xem trước hashtag", "hide_tag_hover_card": "Ẩn xem trước hashtag",
"hide_translation": "Ẩn chức năng dịch", "hide_translation": "Ẩn chức năng dịch",
"hide_username_emojis": "Ẩn emoji trong tên người dùng", "hide_username_emojis": "Ẩn emoji trong tên người dùng",
@ -634,8 +635,8 @@
}, },
"poll": { "poll": {
"count": "{0} bình chọn|{0} bình chọn|{0} bình chọn", "count": "{0} bình chọn|{0} bình chọn|{0} bình chọn",
"ends": "kết thúc {0}", "ends": "đóng {0}",
"finished": "hết hạn {0}" "finished": "kết thúc {0}"
}, },
"replying_to": "Trả lời {0}", "replying_to": "Trả lời {0}",
"show_full_thread": "Chuỗi tút liên quan", "show_full_thread": "Chuỗi tút liên quan",
@ -672,7 +673,7 @@
"notifications_status": "Tút mới", "notifications_status": "Tút mới",
"notifications_update": "Sửa tút", "notifications_update": "Sửa tút",
"posts": "Tút", "posts": "Tút",
"posts_with_replies": "Lượt trả lời" "posts_with_replies": "Trả lời"
}, },
"tag": { "tag": {
"follow": "Theo dõi", "follow": "Theo dõi",
@ -735,7 +736,7 @@
"pick_an_icon": "Chọn biểu tượng", "pick_an_icon": "Chọn biểu tượng",
"publish_failed": "Đóng các thông báo không thành công để đăng lại tút", "publish_failed": "Đóng các thông báo không thành công để đăng lại tút",
"remove_thread_item": "Xóa tút khỏi chuỗi", "remove_thread_item": "Xóa tút khỏi chuỗi",
"start_thread": "Bắt đầu chuỗi tút", "start_thread": "Tạo chuỗi tút",
"toggle_bold": "In đậm", "toggle_bold": "In đậm",
"toggle_code_block": "Đoạn mã", "toggle_code_block": "Đoạn mã",
"toggle_italic": "In nghiêng" "toggle_italic": "In nghiêng"

View file

@ -27,6 +27,7 @@
"follows_you": "已关注你", "follows_you": "已关注你",
"go_to_profile": "转到个人资料", "go_to_profile": "转到个人资料",
"joined": "已加入", "joined": "已加入",
"lock": "非公开",
"moved_title": "的新账号是:", "moved_title": "的新账号是:",
"muted_users": "已屏蔽的用户", "muted_users": "已屏蔽的用户",
"muting": "已屏蔽", "muting": "已屏蔽",
@ -57,7 +58,9 @@
"boost": "转发", "boost": "转发",
"boost_count": "{0}", "boost_count": "{0}",
"boosted": "已转发", "boosted": "已转发",
"clear": "清除",
"clear_publish_failed": "清除发布失败信息", "clear_publish_failed": "清除发布失败信息",
"clear_save_failed": "清除保存失败信息",
"clear_upload_failed": "清除上传失败信息", "clear_upload_failed": "清除上传失败信息",
"close": "关闭", "close": "关闭",
"compose": "撰写", "compose": "撰写",
@ -70,8 +73,10 @@
"favourited": "已喜欢", "favourited": "已喜欢",
"more": "更多", "more": "更多",
"next": "下一个", "next": "下一个",
"open_image_preview_dialog": "打开图像预览框",
"prev": "上一个", "prev": "上一个",
"publish": "发布", "publish": "发布",
"publish_thread": "发布串",
"reply": "回复", "reply": "回复",
"reply_count": "{0}", "reply_count": "{0}",
"reset": "重置", "reset": "重置",
@ -119,12 +124,14 @@
"block_account": { "block_account": {
"cancel": "取消", "cancel": "取消",
"confirm": "拉黑", "confirm": "拉黑",
"description": "你确定拉黑 {0} 吗?" "description": "你确定拉黑 {0} 吗?",
"title": "拉黑用户"
}, },
"block_domain": { "block_domain": {
"cancel": "取消", "cancel": "取消",
"confirm": "拉黑", "confirm": "拉黑",
"description": "你确定拉黑域名 {0} 吗?" "description": "你确定拉黑域名 {0} 吗?",
"title": "拉黑域名"
}, },
"common": { "common": {
"cancel": "否", "cancel": "否",
@ -133,27 +140,37 @@
"delete_list": { "delete_list": {
"cancel": "取消", "cancel": "取消",
"confirm": "删除", "confirm": "删除",
"description": "你确定要删除 \"{0}\" 列表吗?" "description": "你确定要删除 \"{0}\" 列表吗?",
"title": "删除列表"
}, },
"delete_posts": { "delete_posts": {
"cancel": "取消", "cancel": "取消",
"confirm": "删除", "confirm": "删除",
"description": "你确定要删除这条帖文吗?" "description": "你确定要删除这条帖文吗?",
"title": "删除帖文"
}, },
"mute_account": { "mute_account": {
"cancel": "取消", "cancel": "取消",
"confirm": "屏蔽", "confirm": "屏蔽",
"description": "你确定屏蔽 {0} 吗?" "days": "{0} 天",
"description": "你确定屏蔽{0} 吗?",
"hours": "{0} 小时",
"minute": "{0} 分钟",
"notifications": "屏蔽通知",
"specify_duration": "指定时长",
"title": "屏蔽用户"
}, },
"show_reblogs": { "show_reblogs": {
"cancel": "取消", "cancel": "取消",
"confirm": "显示", "confirm": "显示",
"description": "你确定要显示来自 {0} 的转发吗?" "description": "你确定要显示来自 {0} 的转发吗?",
"title": "显示转发"
}, },
"unfollow": { "unfollow": {
"cancel": "取消", "cancel": "取消",
"confirm": "取消关注", "confirm": "取消关注",
"description": "你确定要取消关注吗?" "description": "你确定要取消关注吗?",
"title": "取消关注"
} }
}, },
"conversation": { "conversation": {
@ -206,6 +223,7 @@
"error": "创建列表时出现了一个错误", "error": "创建列表时出现了一个错误",
"error_prefix": "错误:", "error_prefix": "错误:",
"list_title_placeholder": "列表标题", "list_title_placeholder": "列表标题",
"manage": "管理列表",
"modify_account": "修改列表中的用户", "modify_account": "修改列表中的用户",
"remove_account": "移除列表中的用户", "remove_account": "移除列表中的用户",
"save": "保存更改" "save": "保存更改"
@ -218,14 +236,26 @@
"command_mode": "命令面板", "command_mode": "命令面板",
"compose": "撰写", "compose": "撰写",
"favourite": "喜欢", "favourite": "喜欢",
"search": "搜索",
"show_new_items": "显示新的帖子",
"title": "操作" "title": "操作"
}, },
"media": { "media": {
"title": "媒体" "title": "媒体"
}, },
"navigation": { "navigation": {
"go_to_bookmarks": "书签",
"go_to_conversations": "会话",
"go_to_explore": "探索",
"go_to_favourites": "收藏",
"go_to_federated": "联合",
"go_to_home": "首页", "go_to_home": "首页",
"go_to_lists": "列表",
"go_to_local": "本地",
"go_to_notifications": "通知", "go_to_notifications": "通知",
"go_to_profile": "个人资料",
"go_to_search": "搜索",
"go_to_settings": "设置",
"next_status": "下一条帖文", "next_status": "下一条帖文",
"previous_status": "上一条帖文", "previous_status": "上一条帖文",
"shortcut_help": "快捷键帮助", "shortcut_help": "快捷键帮助",
@ -280,13 +310,16 @@
"built_at": "构建于 {0}", "built_at": "构建于 {0}",
"compose": "撰写", "compose": "撰写",
"conversations": "私信", "conversations": "私信",
"docs": "文档",
"explore": "探索", "explore": "探索",
"favourites": "喜欢", "favourites": "喜欢",
"federated": "跨站", "federated": "跨站",
"hashtags": "标签",
"home": "主页", "home": "主页",
"list": "列表", "list": "列表",
"lists": "列表", "lists": "列表",
"local": "本地", "local": "本地",
"more_menu": "更多",
"muted_users": "已屏蔽的用户", "muted_users": "已屏蔽的用户",
"notifications": "通知", "notifications": "通知",
"privacy": "隐私协议", "privacy": "隐私协议",
@ -421,6 +454,8 @@
"label": "账号设置" "label": "账号设置"
}, },
"interface": { "interface": {
"bottom_nav": "底部导航",
"bottom_nav_instructions": "选择您最喜欢的导航按钮(最多五个)作为底部导航。\n必须包含“更多菜单”按钮。",
"color_mode": "颜色", "color_mode": "颜色",
"dark_mode": "深色", "dark_mode": "深色",
"default": "(默认)", "default": "(默认)",
@ -432,7 +467,9 @@
}, },
"language": { "language": {
"display_language": "首选语言", "display_language": "首选语言",
"how_to_contribute": "如何贡献?",
"label": "语言", "label": "语言",
"post_language": "发布语言",
"status": "翻译进度: {0}/{1} ({2}%)", "status": "翻译进度: {0}/{1} ({2}%)",
"translations": { "translations": {
"add": "添加", "add": "添加",
@ -498,6 +535,8 @@
}, },
"notifications_settings": "通知", "notifications_settings": "通知",
"preferences": { "preferences": {
"embedded_media": "嵌入式媒体播放器",
"embedded_media_description": "扩展共享媒体流链接时显示嵌入式播放器而不是普通预览卡。",
"enable_autoplay": "开启自动播放", "enable_autoplay": "开启自动播放",
"enable_data_saving": "启用数据流量节省", "enable_data_saving": "启用数据流量节省",
"enable_data_saving_description": "通过阻止附件自动加载来节省数据流量。", "enable_data_saving_description": "通过阻止附件自动加载来节省数据流量。",
@ -510,12 +549,15 @@
"hide_boost_count": "隐藏转发数", "hide_boost_count": "隐藏转发数",
"hide_favorite_count": "隐藏收藏数", "hide_favorite_count": "隐藏收藏数",
"hide_follower_count": "隐藏关注者数", "hide_follower_count": "隐藏关注者数",
"hide_gif_indi_on_posts": "隐藏帖子上的 gif 指示器",
"hide_news": "隐藏新闻页", "hide_news": "隐藏新闻页",
"hide_reply_count": "隐藏回复数", "hide_reply_count": "隐藏回复数",
"hide_tag_hover_card": "隐藏标签悬停卡",
"hide_translation": "隐藏翻译", "hide_translation": "隐藏翻译",
"hide_username_emojis": "隐藏用户昵称的表情符号", "hide_username_emojis": "隐藏用户昵称的表情符号",
"hide_username_emojis_description": "隐藏时间线上用户的表情符号。表情符号仍然会在用户个人资料中展示。", "hide_username_emojis_description": "隐藏时间线上用户的表情符号。表情符号仍然会在用户个人资料中展示。",
"label": "首选项", "label": "首选项",
"optimize_for_low_performance_device": "针对低性能设备进行优化",
"title": "实验功能", "title": "实验功能",
"use_star_favorite_icon": "使用星形喜欢图标", "use_star_favorite_icon": "使用星形喜欢图标",
"user_picker": "用户选择器", "user_picker": "用户选择器",
@ -559,12 +601,17 @@
}, },
"state": { "state": {
"attachments_exceed_server_limit": "附件的数量超出了最大限制", "attachments_exceed_server_limit": "附件的数量超出了最大限制",
"attachments_limit_audio_error": "超出最大音频尺寸:{0}",
"attachments_limit_error": "超出每篇帖文的最大限制", "attachments_limit_error": "超出每篇帖文的最大限制",
"attachments_limit_image_error": "超出最大图像尺寸:{0}",
"attachments_limit_unknown_error": "超出最大文件尺寸:{0}",
"attachments_limit_video_error": "超出最大视频尺寸:{0}",
"edited": "(已编辑)", "edited": "(已编辑)",
"editing": "编辑中", "editing": "编辑中",
"loading": "加载中...", "loading": "加载中...",
"publish_failed": "发布失败", "publish_failed": "发布失败",
"publishing": "发布中...", "publishing": "发布中...",
"save_failed": "保存失败",
"upload_failed": "上传失败", "upload_failed": "上传失败",
"uploading": "上传中..." "uploading": "上传中..."
}, },
@ -575,9 +622,11 @@
}, },
"boosted_by": "被转发", "boosted_by": "被转发",
"edited": "在 {0} 编辑了", "edited": "在 {0} 编辑了",
"embedded_warning": "播放此内容可能会将你的 IP 地址泄露给他人。",
"favourited_by": "被喜欢", "favourited_by": "被喜欢",
"filter_hidden_phrase": "筛选依据", "filter_hidden_phrase": "筛选依据",
"filter_show_anyway": "仍然展示", "filter_show_anyway": "仍然展示",
"gif": "GIF",
"img_alt": { "img_alt": {
"ALT": "ALT", "ALT": "ALT",
"desc": "描述", "desc": "描述",
@ -609,8 +658,20 @@
"list": "列表", "list": "列表",
"media": "媒体", "media": "媒体",
"news": "最新消息", "news": "最新消息",
"notifications_admin": {
"report": "举报",
"sign_up": "注册"
},
"notifications_all": "全部", "notifications_all": "全部",
"notifications_favourite": "喜欢",
"notifications_follow": "关注",
"notifications_follow_request": "请求关注",
"notifications_mention": "提及", "notifications_mention": "提及",
"notifications_more_tooltip": "按类型筛选通知",
"notifications_poll": "投票",
"notifications_reblog": "转发",
"notifications_status": "状态",
"notifications_update": "更新",
"posts": "帖文", "posts": "帖文",
"posts_with_replies": "帖文与留言" "posts_with_replies": "帖文与留言"
}, },
@ -664,6 +725,7 @@
"add_emojis": "添加表情符号", "add_emojis": "添加表情符号",
"add_media": "添加图片、视频或者音频文件", "add_media": "添加图片、视频或者音频文件",
"add_publishable_content": "添加要发布的内容", "add_publishable_content": "添加要发布的内容",
"add_thread_item": "添加到帖文串",
"change_content_visibility": "修改内容是否可见", "change_content_visibility": "修改内容是否可见",
"change_language": "更改语言", "change_language": "更改语言",
"emoji": "表情符号", "emoji": "表情符号",
@ -673,6 +735,8 @@
"open_editor_tools": "编辑器工具", "open_editor_tools": "编辑器工具",
"pick_an_icon": "选择一个图标", "pick_an_icon": "选择一个图标",
"publish_failed": "关闭编辑器上方的错误信息以重新发布帖文。", "publish_failed": "关闭编辑器上方的错误信息以重新发布帖文。",
"remove_thread_item": "从帖文串中移除",
"start_thread": "开始帖文串",
"toggle_bold": "切换加粗", "toggle_bold": "切换加粗",
"toggle_code_block": "切换代码块", "toggle_code_block": "切换代码块",
"toggle_italic": "切换斜体" "toggle_italic": "切换斜体"

View file

@ -1,4 +1,4 @@
import fs from 'fs-extra' import { lstat } from 'node:fs'
import { createResolver, defineNuxtModule } from '@nuxt/kit' import { createResolver, defineNuxtModule } from '@nuxt/kit'
import { currentLocales } from '../config/i18n' import { currentLocales } from '../config/i18n'
@ -53,7 +53,7 @@ export default defineNuxtModule({
async function isFile(path: string) { async function isFile(path: string) {
return new Promise<boolean>((resolve) => { return new Promise<boolean>((resolve) => {
fs.lstat(path, (err, stats) => { lstat(path, (err, stats) => {
if (err) if (err)
resolve(false) resolve(false)
else else

View file

@ -14,7 +14,7 @@ export default defineNuxtModule({
return return
const s = new MagicString(code) const s = new MagicString(code)
s.replace(/<!--(?:.*?)-->/sg, '') s.replace(/<!--.*?-->/gs, '')
if (s.hasChanged()) { if (s.hasChanged()) {
return { return {

View file

@ -76,7 +76,7 @@ function createManifestTransform(base: string, appManifestFolder?: string): impo
}) })
if (appManifestFolder) { if (appManifestFolder) {
const regExp = /(\/)?[0-9a-f]{8}\b-[0-9a-f]{4}\b-[0-9a-f]{4}\b-[0-9a-f]{4}\b-[0-9a-f]{12}\.json$/i const regExp = /\/?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.json$/i
// we need to remove the revision from the sw prechaing manifest, UUID is enough: // we need to remove the revision from the sw prechaing manifest, UUID is enough:
// we don't use dontCacheBustURLsMatching, single regex // we don't use dontCacheBustURLsMatching, single regex
entries.filter(e => e && e.url.startsWith(appManifestFolder) && regExp.test(e.url)).forEach((e) => { entries.filter(e => e && e.url.startsWith(appManifestFolder) && regExp.test(e.url)).forEach((e) => {

View file

@ -1,5 +1,5 @@
import { Buffer } from 'node:buffer' import { Buffer } from 'node:buffer'
import { readFile } from 'fs-extra' import { readFile } from 'node:fs/promises'
import { createResolver } from '@nuxt/kit' import { createResolver } from '@nuxt/kit'
import type { ManifestOptions } from 'vite-plugin-pwa' import type { ManifestOptions } from 'vite-plugin-pwa'
import { getEnv } from '../../config/env' import { getEnv } from '../../config/env'

View file

@ -202,6 +202,11 @@ export default defineNuxtModule<VitePWANuxtOptions>({
'Cache-Control': 'public, max-age=0, must-revalidate', 'Cache-Control': 'public, max-age=0, must-revalidate',
}, },
} }
nitroConfig.routeRules!['/elk-sw.js'] = {
headers: {
'Cache-Control': 'public, max-age=0, must-revalidate',
},
}
for (const locale of pwaLocales) { for (const locale of pwaLocales) {
nitroConfig.routeRules![`/manifest-${locale.code}.webmanifest`] = { nitroConfig.routeRules![`/manifest-${locale.code}.webmanifest`] = {
headers: { headers: {

View file

@ -19,7 +19,7 @@ declare module '#app' {
} }
} }
declare module '@vue/runtime-core' { declare module 'vue' {
interface ComponentCustomProperties { interface ComponentCustomProperties {
$pwa?: UnwrapNestedRefs<PwaInjection> $pwa?: UnwrapNestedRefs<PwaInjection>
} }

View file

@ -8,11 +8,12 @@ import { currentLocales } from './config/i18n'
const { resolve } = createResolver(import.meta.url) const { resolve } = createResolver(import.meta.url)
export default defineNuxtConfig({ export default defineNuxtConfig({
compatibilityDate: '2024-09-11',
typescript: { typescript: {
tsConfig: { tsConfig: {
exclude: ['../service-worker'], exclude: ['../service-worker'],
vueCompilerOptions: { vueCompilerOptions: {
target: 3.4, target: 3.5,
}, },
}, },
}, },
@ -261,7 +262,7 @@ export default defineNuxtConfig({
{ rel: 'apple-touch-icon', href: '/apple-touch-icon.png' }, { rel: 'apple-touch-icon', href: '/apple-touch-icon.png' },
], ],
meta: [ meta: [
{ name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' }, { name: 'apple-mobile-web-app-status-bar-style', content: 'default' },
// open graph social image // open graph social image
{ property: 'og:title', content: 'Elk' }, { property: 'og:title', content: 'Elk' },
{ property: 'og:description', content: 'A nimble Mastodon web client' }, { property: 'og:description', content: 'A nimble Mastodon web client' },
@ -270,13 +271,13 @@ export default defineNuxtConfig({
{ property: 'og:image:width', content: '3800' }, { property: 'og:image:width', content: '3800' },
{ property: 'og:image:height', content: '1900' }, { property: 'og:image:height', content: '1900' },
{ property: 'og:site_name', content: 'Elk' }, { property: 'og:site_name', content: 'Elk' },
{ property: 'twitter:site', content: '@elk_zone' }, { name: 'twitter:site', content: '@elk_zone' },
{ property: 'twitter:card', content: 'summary_large_image' }, { name: 'twitter:card', content: 'summary_large_image' },
], ],
}, },
}, },
// eslint-disable-next-line ts/prefer-ts-expect-error // eslint-disable-next-line ts/ban-ts-comment
// @ts-ignore nuxt-security is conditional // @ts-ignore nuxt-security is conditional
security: { security: {
headers: { headers: {
@ -299,7 +300,7 @@ export default defineNuxtConfig({
'upgrade-insecure-requests': true, 'upgrade-insecure-requests': true,
}, },
permissionsPolicy: { permissionsPolicy: {
fullscreen: ['\'self\'', 'https:', 'http:'], fullscreen: '*',
}, },
}, },
rateLimiter: false, rateLimiter: false,
@ -333,6 +334,10 @@ declare global {
} }
declare module '#app' { declare module '#app' {
interface PageMeta {
wideLayout?: boolean
}
interface RuntimeNuxtHooks { interface RuntimeNuxtHooks {
'elk-logo:click': () => void 'elk-logo:click': () => void
} }

View file

@ -1,8 +1,8 @@
{ {
"name": "@elk-zone/elk", "name": "@elk-zone/elk",
"type": "module", "type": "module",
"version": "0.14.0", "version": "0.15.1",
"packageManager": "pnpm@8.15.5", "packageManager": "pnpm@9.11.0",
"license": "MIT", "license": "MIT",
"homepage": "https://elk.zone/", "homepage": "https://elk.zone/",
"main": "./nuxt.config.ts", "main": "./nuxt.config.ts",
@ -37,11 +37,11 @@
"@iconify-emoji/twemoji": "^1.0.2", "@iconify-emoji/twemoji": "^1.0.2",
"@iconify/json": "^2.2.170", "@iconify/json": "^2.2.170",
"@iconify/utils": "^2.1.22", "@iconify/utils": "^2.1.22",
"@nuxt/devtools": "^1.0.8", "@nuxt/devtools": "^1.5.0",
"@nuxt/test-utils": "^3.12.0", "@nuxt/test-utils": "^3.14.2",
"@nuxtjs/color-mode": "^3.3.2", "@nuxtjs/color-mode": "^3.4.4",
"@nuxtjs/i18n": "^8.3.0", "@nuxtjs/i18n": "^8.5.3",
"@pinia/nuxt": "^0.5.1", "@pinia/nuxt": "^0.5.4",
"@tiptap/core": "2.2.4", "@tiptap/core": "2.2.4",
"@tiptap/extension-bold": "2.2.4", "@tiptap/extension-bold": "2.2.4",
"@tiptap/extension-character-count": "2.2.4", "@tiptap/extension-character-count": "2.2.4",
@ -56,39 +56,40 @@
"@tiptap/starter-kit": "2.2.4", "@tiptap/starter-kit": "2.2.4",
"@tiptap/suggestion": "2.2.4", "@tiptap/suggestion": "2.2.4",
"@tiptap/vue-3": "2.2.4", "@tiptap/vue-3": "2.2.4",
"@unocss/nuxt": "^0.58.9", "@unocss/nuxt": "^0.62.3",
"@upstash/redis": "^1.27.1", "@upstash/redis": "^1.27.1",
"@vercel/kv": "^1.0.1", "@vercel/kv": "^2.0.0",
"@vue-macros/nuxt": "^1.6.0", "@vue-macros/nuxt": "^1.11.12",
"@vueuse/core": "^10.9.0", "@vueuse/core": "^11.0.3",
"@vueuse/gesture": "^2.0.0", "@vueuse/gesture": "^2.0.0",
"@vueuse/integrations": "^10.8.0", "@vueuse/integrations": "^11.0.3",
"@vueuse/math": "^10.8.0", "@vueuse/math": "^11.0.3",
"@vueuse/motion": "2.1.0", "@vueuse/motion": "2.2.5",
"@vueuse/nuxt": "^10.8.0", "@vueuse/nuxt": "^11.0.3",
"blurhash": "^2.0.5", "blurhash": "^2.0.5",
"browser-fs-access": "^0.35.0", "browser-fs-access": "^0.35.0",
"chroma-js": "^2.4.2", "cheerio": "^1.0.0",
"chroma-js": "^3.0.0",
"emoji-mart": "^5.5.2", "emoji-mart": "^5.5.2",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"floating-vue": "^5.2.2", "floating-vue": "^5.2.2",
"focus-trap": "^7.5.1", "focus-trap": "^7.5.1",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"fuse.js": "^6.6.2", "fuse.js": "^7.0.0",
"github-reserved-names": "^2.0.4", "github-reserved-names": "^2.0.4",
"happy-dom": "^10.5.2", "happy-dom": "^15.0.0",
"idb-keyval": "^6.2.1", "idb-keyval": "^6.2.1",
"ignore-dependency-scripts": "^1.0.1", "ignore-dependency-scripts": "^1.0.1",
"iso-639-1": "^3.0.0", "iso-639-1": "^3.0.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"lru-cache": "^10.0.0", "lru-cache": "^11.0.0",
"masto": "^6.7.0", "masto": "^6.7.5",
"node-emoji": "^2.1.3", "node-emoji": "^2.1.3",
"nuxt-security": "^0.13.1", "nuxt-security": "^1.4.3",
"page-lifecycle": "^0.1.2", "page-lifecycle": "^0.1.2",
"pinia": "^2.1.7", "pinia": "^2.2.2",
"postcss-nested": "^6.0.1", "postcss-nested": "^6.0.1",
"prosemirror-highlight": "^0.5.0", "prosemirror-highlight": "^0.9.0",
"rollup-plugin-node-polyfills": "^0.2.1", "rollup-plugin-node-polyfills": "^0.2.1",
"shiki": "^1.0.0", "shiki": "^1.0.0",
"simple-git": "^3.19.1", "simple-git": "^3.19.1",
@ -98,61 +99,63 @@
"string-length": "^5.0.1", "string-length": "^5.0.1",
"tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log", "tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log",
"tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store", "tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store",
"theme-vitesse": "^0.7.2", "theme-vitesse": "^0.8.0",
"tiny-decode": "^0.1.3", "tiny-decode": "^0.1.3",
"tippy.js": "^6.3.7", "tippy.js": "^6.3.7",
"ufo": "^1.5.3", "ufo": "^1.5.3",
"ultrahtml": "^1.5.3", "ultrahtml": "^1.5.3",
"unimport": "^3.7.1", "unimport": "^3.10.0",
"vite-plugin-pwa": "^0.19.2", "vite-plugin-pwa": "^0.20.5",
"vue-advanced-cropper": "^2.8.8", "vue-advanced-cropper": "^2.8.9",
"vue-virtual-scroller": "2.0.0-beta.8", "vue-virtual-scroller": "2.0.0-beta.8",
"workbox-build": "^7.0.0", "workbox-build": "^7.1.1",
"workbox-window": "^7.0.0", "workbox-window": "^7.1.0",
"ws": "^8.15.1" "ws": "^8.15.1"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^2.9.0", "@antfu/eslint-config": "^2.27.3",
"@antfu/ni": "^0.21.12", "@antfu/ni": "^0.23.0",
"@types/chroma-js": "^2.4.4", "@types/chroma-js": "^2.4.4",
"@types/file-saver": "^2.0.7", "@types/file-saver": "^2.0.7",
"@types/fnando__sparkline": "^0.3.7", "@types/fnando__sparkline": "^0.3.7",
"@types/fs-extra": "^11.0.4", "@types/fs-extra": "^11.0.4",
"@types/js-yaml": "^4.0.9", "@types/js-yaml": "^4.0.9",
"@types/prettier": "^3.0.0",
"@types/wicg-file-system-access": "^2023.10.5", "@types/wicg-file-system-access": "^2023.10.5",
"@types/ws": "^8.5.10", "@types/ws": "^8.5.12",
"@unlazy/nuxt": "^0.11.2", "@unlazy/nuxt": "^0.11.3",
"@unocss/eslint-config": "^0.58.9", "@unocss/eslint-config": "^0.62.4",
"@vue/test-utils": "2.4.5", "@vue/test-utils": "2.4.6",
"bumpp": "^9.4.0", "bumpp": "^9.5.2",
"consola": "^3.2.3", "consola": "^3.2.3",
"eslint": "^8.57.0", "eslint": "^9.11.0",
"eslint-plugin-format": "^0.1.0", "eslint-plugin-format": "^0.1.2",
"flat": "^6.0.1", "flat": "^6.0.1",
"fs-extra": "^11.2.0", "fs-extra": "^11.2.0",
"lint-staged": "^15.2.2", "lint-staged": "^15.2.10",
"nuxt": "^3.11.2", "nuxt": "^3.13.2",
"prettier": "^3.2.5", "prettier": "^3.3.3",
"sharp": "^0.33.3", "sharp": "^0.33.5",
"sharp-ico": "^0.1.5", "sharp-ico": "^0.1.5",
"simple-git-hooks": "^2.11.1", "simple-git-hooks": "^2.11.1",
"tsx": "^4.7.2", "tsx": "^4.19.1",
"typescript": "^5.4.4", "typescript": "^5.4.4",
"vitest": "1.4.0", "vitest": "2.1.1",
"vue-tsc": "^2.0.10" "vue-tsc": "^2.1.6"
}, },
"pnpm": { "pnpm": {
"overrides": {
"unstorage": "^1.10.2"
},
"patchedDependencies": { "patchedDependencies": {
"nuxt-security@0.13.1": "patches/nuxt-security@0.13.1.patch" "@vueuse/motion": "patches/@vueuse__motion.patch",
"pinceau": "patches/pinceau.patch",
"vue-i18n": "patches/vue-i18n.patch",
"nuxt-security": "patches/nuxt-security.patch",
"nuxt": "patches/nuxt.patch"
} }
}, },
"resolutions": { "resolutions": {
"vitest": "1.4.0", "nuxt-component-meta": "0.8.2",
"vue": "^3.4.21" "unstorage": "^1.12.0",
"vitest": "2.1.1",
"vue": "^3.5.4"
}, },
"simple-git-hooks": { "simple-git-hooks": {
"pre-commit": "pnpm lint-staged" "pre-commit": "pnpm lint-staged"

View file

@ -88,7 +88,7 @@ onReactivated(() => {
<PublishWidgetList <PublishWidgetList
v-if="currentUser" v-if="currentUser"
ref="publishWidget" ref="publishWidget"
border="y base" class="border-y border-base"
:draft-key="replyDraft!.key" :draft-key="replyDraft!.key"
:initial="replyDraft!.draft" :initial="replyDraft!.draft"
@published="refreshContext()" @published="refreshContext()"

Some files were not shown because too many files have changed in this diff Show more