Merge branch 'main' into userquin/feat-remember-last-position

This commit is contained in:
userquin 2023-01-09 01:00:26 +01:00
commit a217c59590
53 changed files with 3320 additions and 778 deletions

View file

@ -85,7 +85,7 @@ const buttonStyle = $computed(() => {
gap-1 items-center group gap-1 items-center group
:disabled="relationship?.requested" :disabled="relationship?.requested"
border-1 border-1
rounded-full flex="~ gap2 center" font-500 w-30 h-fit py1 rounded-full flex="~ gap2 center" font-500 min-w-30 h-fit px3 py1
:class="buttonStyle" :class="buttonStyle"
:hover="!relationship?.blocking && !relationship?.muting && relationship?.following ? 'border-red text-red' : 'bg-base border-primary text-primary'" :hover="!relationship?.blocking && !relationship?.muting && relationship?.following ? 'border-red text-red' : 'bg-base border-primary text-primary'"
@click="relationship?.blocking ? unblock() : relationship?.muting ? unmute() : toggleFollow()" @click="relationship?.blocking ? unblock() : relationship?.muting ? unmute() : toggleFollow()"

View file

@ -88,7 +88,7 @@ const isSelf = $computed(() => currentUser.value?.account.id === account.id)
<NuxtLink <NuxtLink
v-if="isSelf" v-if="isSelf"
to="/settings/profile/appearance" to="/settings/profile/appearance"
gap-1 items-center border="1" rounded-full flex="~ gap2 center" font-500 w-30 h-fit py1 gap-1 items-center border="1" rounded-full flex="~ gap2 center" font-500 min-w-30 h-fit px3 py1
hover="border-primary text-primary bg-active" hover="border-primary text-primary bg-active"
> >
{{ $t('settings.profile.appearance.title') }} {{ $t('settings.profile.appearance.title') }}

View file

@ -5,6 +5,7 @@ import {
isCommandPanelOpen, isCommandPanelOpen,
isConfirmDialogOpen, isConfirmDialogOpen,
isEditHistoryDialogOpen, isEditHistoryDialogOpen,
isFavouritedBoostedByDialogOpen,
isMediaPreviewOpen, isMediaPreviewOpen,
isPreviewHelpOpen, isPreviewHelpOpen,
isPublishDialogOpen, isPublishDialogOpen,
@ -20,11 +21,11 @@ const isMac = useIsMac()
// listen to ctrl+/ on windows/linux or cmd+/ on mac // listen to ctrl+/ on windows/linux or cmd+/ on mac
// or shift+ctrl+k on windows/linux or shift+cmd+k on mac // or shift+ctrl+k on windows/linux or shift+cmd+k on mac
useEventListener('keydown', (e: KeyboardEvent) => { useEventListener('keydown', (e: KeyboardEvent) => {
if (e.key === 'k' && (isMac.value ? e.metaKey : e.ctrlKey)) { if ((e.key === 'k' || e.key === 'л') && (isMac.value ? e.metaKey : e.ctrlKey)) {
e.preventDefault() e.preventDefault()
openCommandPanel(e.shiftKey) openCommandPanel(e.shiftKey)
} }
if (e.key === '/' && (isMac.value ? e.metaKey : e.ctrlKey)) { if ((e.key === '/' || e.key === ',') && (isMac.value ? e.metaKey : e.ctrlKey)) {
e.preventDefault() e.preventDefault()
openCommandPanel(true) openCommandPanel(true)
} }
@ -43,6 +44,10 @@ const handleConfirmChoice = (choice: ConfirmDialogChoice) => {
confirmDialogChoice.value = choice confirmDialogChoice.value = choice
isConfirmDialogOpen.value = false isConfirmDialogOpen.value = false
} }
const handleFavouritedBoostedByClose = () => {
isFavouritedBoostedByDialogOpen.value = false
}
</script> </script>
<template> <template>
@ -81,5 +86,12 @@ const handleConfirmChoice = (choice: ConfirmDialogChoice) => {
<ModalDialog v-model="isConfirmDialogOpen" py-4 px-8 max-w-125> <ModalDialog v-model="isConfirmDialogOpen" py-4 px-8 max-w-125>
<ModalConfirm v-if="confirmDialogLabel" v-bind="confirmDialogLabel" @choice="handleConfirmChoice" /> <ModalConfirm v-if="confirmDialogLabel" v-bind="confirmDialogLabel" @choice="handleConfirmChoice" />
</ModalDialog> </ModalDialog>
<ModalDialog
v-model="isFavouritedBoostedByDialogOpen"
max-w-180
@close="handleFavouritedBoostedByClose"
>
<StatusFavouritedBoostedBy />
</ModalDialog>
</template> </template>
</template> </template>

View file

@ -3,10 +3,10 @@ import { mastodon } from 'masto'
import type { Paginator, WsEvents } from 'masto' import type { Paginator, WsEvents } from 'masto'
// type used in <template> // type used in <template>
// eslint-disable-next-line @typescript-eslint/consistent-type-imports // eslint-disable-next-line @typescript-eslint/consistent-type-imports
import type { GroupedAccountLike, GroupedLikeNotifications, NotificationSlot } from '~/types' import type { GroupedAccountLike, GroupedLikeNotifications, GroupedNotifications, NotificationSlot } from '~/types'
const { paginator, stream } = defineProps<{ const { paginator, stream } = defineProps<{
paginator: Paginator<mastodon.v1.Notification[], mastodon.v1.ListNotificationsParams> paginator: Paginator<NotificationSlot[], mastodon.v1.ListNotificationsParams>
stream?: Promise<WsEvents> stream?: Promise<WsEvents>
}>() }>()
@ -101,19 +101,41 @@ function groupItems(items: mastodon.v1.Notification[]): NotificationSlot[] {
return results return results
} }
function preprocess(items: NotificationSlot[]): NotificationSlot[] {
const flattenedNotifications: mastodon.v1.Notification[] = []
for (const item of items) {
if (item.type === 'grouped-reblogs-and-favourites') {
const group = item as GroupedLikeNotifications
for (const like of group.likes) {
if (like.reblog)
flattenedNotifications.push(like.reblog)
if (like.favourite)
flattenedNotifications.push(like.favourite)
}
}
else if (item.type.startsWith('grouped-')) {
flattenedNotifications.push(...(item as GroupedNotifications).items)
}
else {
flattenedNotifications.push(item as mastodon.v1.Notification)
}
}
return groupItems(flattenedNotifications)
}
const { clearNotifications } = useNotifications() const { clearNotifications } = useNotifications()
const { formatNumber } = useHumanReadableNumber() const { formatNumber } = useHumanReadableNumber()
</script> </script>
<template> <template>
<CommonPaginator :paginator="paginator" :stream="stream" :eager="3" event-type="notification"> <CommonPaginator :paginator="paginator" :preprocess="preprocess" :stream="stream" :eager="3" event-type="notification">
<template #updater="{ number, update }"> <template #updater="{ number, update }">
<button py-4 border="b base" flex="~ col" p-3 w-full text-primary font-bold @click="() => { update(); clearNotifications() }"> <button py-4 border="b base" flex="~ col" p-3 w-full text-primary font-bold @click="() => { update(); clearNotifications() }">
{{ $t('timeline.show_new_items', number, { named: { v: formatNumber(number) } }) }} {{ $t('timeline.show_new_items', number, { named: { v: formatNumber(number) } }) }}
</button> </button>
</template> </template>
<template #items="{ items }"> <template #items="{ items }">
<template v-for="item of groupItems(items)" :key="item.id"> <template v-for="item of items" :key="item.id">
<NotificationGroupedFollow <NotificationGroupedFollow
v-if="item.type === 'grouped-follow'" v-if="item.type === 'grouped-follow'"
:items="item" :items="item"

View file

@ -184,6 +184,13 @@ defineExpose({
editor.value?.commands?.focus?.() editor.value?.commands?.focus?.()
}, },
}) })
const isPublishDisabled = computed(() => {
if (isEmpty || isUploading || (draft.attachments.length === 0 && !draft.params.status))
return true
return false
})
</script> </script>
<template> <template>
@ -348,14 +355,31 @@ defineExpose({
</template> </template>
</PublishVisibilityPicker> </PublishVisibilityPicker>
<CommonTooltip id="publish-tooltip" placement="top" :content="$t('tooltip.add_publishable_content')" :disabled="!isPublishDisabled">
<button <button
btn-solid rounded-3 text-sm w-full md:w-fit btn-solid rounded-3 text-sm w-full
:disabled="isEmpty || isUploading || (draft.attachments.length === 0 && !draft.params.status) || characterCount > characterLimit" md:w-fit
class="publish-button"
:aria-disabled="isPublishDisabled"
aria-describedby="publish-tooltip"
@click="publish" @click="publish"
> >
{{ !draft.editingStatus ? $t('action.publish') : $t('action.save_changes') }} {{ !draft.editingStatus ? $t('action.publish') : $t('action.save_changes') }}
</button> </button>
</CommonTooltip>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<style scoped>
.publish-button[aria-disabled=true] {
cursor: not-allowed;
background-color: var(--c-bg-btn-disabled);
color: var(--c-text-btn-disabled);
}
.publish-button[aria-disabled=true]:hover {
background-color: var(--c-bg-btn-disabled);
color: var(--c-text-btn-disabled);
}
</style>

View file

@ -111,6 +111,10 @@ async function editStatus() {
editingStatus: status, editingStatus: status,
}, true) }, true)
} }
const showFavoritedAndBoostedBy = () => {
openFavoridedBoostedByDialog(status.id)
}
</script> </script>
<template> <template>
@ -162,6 +166,13 @@ async function editStatus() {
/> />
</template> </template>
<CommonDropdownItem
:text="$t('menu.show_favourited_and_boosted_by')"
icon="i-ri:hearts-line"
:command="command"
@click="showFavoritedAndBoostedBy()"
/>
<CommonDropdownItem <CommonDropdownItem
:text="$t('menu.copy_link_to_post')" :text="$t('menu.copy_link_to_post')"
icon="i-ri:link" icon="i-ri:link"

View file

@ -0,0 +1,57 @@
<script setup lang="ts">
import { favouritedBoostedByStatusId } from '~/composables/dialog'
const type = ref<'favourited-by' | 'boosted-by'>('favourited-by')
function load() {
return useMasto().v1.statuses[type.value === 'favourited-by' ? 'listFavouritedBy' : 'listRebloggedBy'](favouritedBoostedByStatusId.value!)
}
const paginator = $computed(() => load())
function showFavouritedBy() {
type.value = 'favourited-by'
}
function showRebloggedBy() {
type.value = 'boosted-by'
}
const { t } = useI18n()
const tabs = [
{
name: 'favourited-by',
display: t('status.favourited_by'),
onClick: showFavouritedBy,
},
{
name: 'boosted-by',
display: t('status.boosted_by'),
onClick: showRebloggedBy,
},
]
</script>
<template>
<div flex w-full items-center lg:text-lg of-x-auto scrollbar-hide>
<template
v-for="option in tabs"
:key="option.name"
>
<div
relative flex flex-auto cursor-pointer sm:px6 px2 rounded transition-all
tabindex="1"
hover:bg-active transition-100
@click="option.onClick"
>
<span
ws-nowrap mxa sm:px2 sm:py3 xl:pb4 xl:pt5 py2 text-center border-b-3
:class="option.name === type ? 'border-primary op100 text-base' : 'border-transparent text-secondary-light hover:text-secondary op50'"
>{{
option.display
}}</span>
</div>
</template>
</div>
<AccountPaginator :key="`paginator-${type}`" :paginator="paginator" />
</template>

View file

@ -22,9 +22,12 @@ export const isEditHistoryDialogOpen = ref(false)
export const isPreviewHelpOpen = ref(isFirstVisit.value) export const isPreviewHelpOpen = ref(isFirstVisit.value)
export const isCommandPanelOpen = ref(false) export const isCommandPanelOpen = ref(false)
export const isConfirmDialogOpen = ref(false) export const isConfirmDialogOpen = ref(false)
export const isFavouritedBoostedByDialogOpen = ref(false)
export const lastPublishDialogStatus = ref<mastodon.v1.Status | null>(null) export const lastPublishDialogStatus = ref<mastodon.v1.Status | null>(null)
export const favouritedBoostedByStatusId = ref<string | null>(null)
export function openSigninDialog() { export function openSigninDialog() {
isSigninDialogOpen.value = true isSigninDialogOpen.value = true
} }
@ -62,6 +65,11 @@ export async function openPublishDialog(draftKey = 'dialog', draft?: Draft, over
await until(isPublishDialogOpen).toBe(false) await until(isPublishDialogOpen).toBe(false)
} }
export async function openFavoridedBoostedByDialog(statusId: string) {
isFavouritedBoostedByDialogOpen.value = true
favouritedBoostedByStatusId.value = statusId
}
if (isPreviewHelpOpen.value) { if (isPreviewHelpOpen.value) {
watch(isPreviewHelpOpen, () => { watch(isPreviewHelpOpen, () => {
isFirstVisit.value = false isFirstVisit.value = false

View file

@ -24,7 +24,7 @@ export function usePaginator<T, P>(
const nuxtApp = useNuxtApp() const nuxtApp = useNuxtApp()
async function update() { async function update() {
items.value.unshift(...prevItems.value) items.value.unshift(...preprocess(prevItems.value as any) as any)
prevItems.value = [] prevItems.value = []
} }
@ -74,6 +74,8 @@ export function usePaginator<T, P>(
state.value = 'idle' state.value = 'idle'
} }
else { else {
items.value.push(...nextItems.value)
nextItems.value = []
state.value = 'done' state.value = 'done'
} }
} }

View file

@ -55,6 +55,18 @@ const locales: LocaleObjectData[] = [
file: 'fr-FR.json', file: 'fr-FR.json',
name: 'Français', name: 'Français',
}, },
{
code: 'uk-UA',
file: 'uk-UA.json',
name: 'Українська',
pluralRule: (choice: number) => {
if (choice === 0)
return 0
const name = new Intl.PluralRules('uk-UA').select(choice)
return { zero: 0, one: 1, two: 0 /* not used */, few: 2, many: 3, other: 4 }[name]
},
},
{ {
code: 'cs-CZ', code: 'cs-CZ',
file: 'cs-CZ.json', file: 'cs-CZ.json',

3
docs/.env.example Executable file
View file

@ -0,0 +1,3 @@
# Create one with no scope selected on https://github.com/settings/tokens/new
# This token is used for fetching the repository releases.
GITHUB_TOKEN=

12
docs/.gitignore vendored Executable file
View file

@ -0,0 +1,12 @@
node_modules
*.iml
.idea
*.log*
.nuxt
.vscode
.DS_Store
coverage
dist
sw.*
.env
.output

32
docs/app.config.ts Normal file
View file

@ -0,0 +1,32 @@
export default defineAppConfig({
docus: {
title: 'Elk',
description: 'A nimble Mastodon web client.',
image: 'https://docs.elk.zone/elk-screenshot.png',
socials: {
twitter: 'elk-zone',
github: 'elk-zone/elk',
},
aside: {
level: 0,
exclude: [],
},
header: {
logo: true,
showLinkIcon: true,
exclude: [],
},
footer: {
iconLinks: [
{
href: 'https://nuxt.com',
icon: 'IconNuxtLabs',
},
{
href: 'https://m.webtoo.ls/@elk',
icon: 'IconMastodon',
},
],
},
},
})

15
docs/app.vue Normal file
View file

@ -0,0 +1,15 @@
<template>
<AppLayout>
<NuxtPage />
</AppLayout>
</template>
<style>
@font-face {
font-display: swap;
font-family: 'DM Sans';
font-style: normal;
font-weight: 400;
src: url(/fonts/DM-sans-v11.ttf) format('truetype');
}
</style>

View file

@ -0,0 +1,9 @@
<script>
export default {
name: 'IconMastodon',
}
</script>
<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>
</template>

View file

@ -0,0 +1,23 @@
<template>
<div class="logo">
<img alt="Elk" src="/logo.svg">
Elk
</div>
</template>
<style lang="ts" scoped>
css({
'.logo': {
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
gap: '0.5rem',
fontSize: '1.5rem',
},
img: {
flexShrink: 0,
aspectRatio: '1/1',
height: '2.5rem'
}
})
</style>

36
docs/content/0.index.md Executable file
View file

@ -0,0 +1,36 @@
---
title: Elk
navigation: false
layout: page
---
::block-hero
---
cta:
- Read more
- /guide
secondary:
- Try it out →
- https://elk.zone
---
#title
Elk
#description
An in-progress, nimble Mastodon web client
#support
![Screenshot of Elk](/docs/screenshot.png)
#extra
::list
- markdown support
- code blocks
- reordering and connecting posts in timelines
- multi account
- GitHub HTML cards
- and more...
::
::

View file

@ -0,0 +1,33 @@
# Introduction
## What is Elk?
::alert{type=warning}
🚧 This section is a work in progress. 🚧
::
## What is Mastodon?
<!-- -> external links -->
::alert{type=warning}
🚧 This section is a work in progress. 🚧
::
## What is a Mastodon Client?
<!-- -> other examples -->
::alert{type=warning}
🚧 This section is a work in progress. 🚧
::
## Sponsors
We want to thank the generous sponsoring and help of:
[![NuxtLabs](/docs/images/nuxtlabs.svg)](https://nuxtlabs.com/)
[![StackBlitz](/docs/images/stackblitz.svg)](https://stackblitz.com/)
And all the companies and individuals sponsoring Elk Team members.
[Find out more about sponsoring Elk](/guide/sponsoring).

View file

@ -0,0 +1,14 @@
# Features
::alert{type=warning}
🚧 This section is a work in progress. 🚧
::
<!-- once the UI is more stable, we can add screenshots -->
<!-- - markdown support
- code blocks
- reordering and connecting posts in timelines
- multi account
- GitHub HTML cards
- and so on... -->

View file

@ -0,0 +1,49 @@
# Contributing
We're really excited that you're interested in contributing to Elk! Before submitting your contribution, please read through the following guide.
## Online
You can use [StackBlitz CodeFlow](https://stackblitz.com/codeflow) to fix bugs or implement features. You'll also see a CodeFlow button on PRs to review them without a local setup. Once the elk repo has been cloned in CodeFlow, the dev server will start automatically and print the URL to open the App. You should receive a prompt in the bottom-right suggesting to open it in the Editor or in another Tab. To learn more, check out the [CodeFlow docs](https://developer.stackblitz.com/codeflow/what-is-codeflow).
[![Open in Codeflow](https://developer.stackblitz.com/img/open_in_codeflow.svg)](https://pr.new/elk-zone/elk)
## Local Setup
Clone the repository and run on the root folder:
```bash
pnpm i
pnpm run dev
```
`Warning`: you will need `corepack` enabled, check out the [Elk Contributing Guide](./CONTRIBUTING.md) for a detailed guide on how to set up the project locally.
We recommend installing [ni](https://github.com/antfu/ni#ni), that will use the right package manager in each of your projects. If `ni` is installed, you can instead run:
```bash
ni
nr dev
```
## Testing
Elk uses [Vitest](https://vitest.dev). You can run the test suite with:
```bash
nr test
```
# Stack
- [Vite](https://vitejs.dev/) - Next Generation Frontend Tooling
- [Nuxt](https://nuxt.com/) - The Intuitive Web Framework
- [Vue](https://vuejs.org/) - The Progressive JavaScript Framework
- [VueUse](https://vueuse.org/) - Collection of Vue Composition Utilities
- [Pinia](https://pinia.vuejs.org/) - The Vue Store that you will enjoy using
- [Vue Macros](https://vue-macros.sxzz.moe/) - More macros and syntax sugar for Vue
- [UnoCSS](https://uno.antfu.me/) - The instant on-demand atomic CSS engine
- [Iconify](https://github.com/iconify/icon-sets#iconify-icon-sets-in-json-format) - Iconify icon sets in JSON format
- [Masto.js](https://neet.github.io/masto.js) - Mastodon API client in TypeScript
- [shiki](https://shiki.matsu.io/) - A beautiful Syntax Highlighter
- [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) - Prompt for update and push notifications

View file

@ -0,0 +1,10 @@
# Sponsoring
If you're enjoying the app, consider sponsoring our team:
- [Anthony Fu](https://github.com/sponsors/antfu)
- [Daniel Roe](https://github.com/sponsors/danielroe)
- [三咲智子 Kevin Deng](https://github.com/sponsors/sxzz)
- [Patak](https://github.com/sponsors/patak-dev)
We would also appreciate sponsoring other contributors to the Elk project. If someone helps you solve an issue or implement a feature you wanted, supporting them would help make this project and OS more sustainable.

10
docs/netlify.toml Executable file
View file

@ -0,0 +1,10 @@
[build]
publish = "dist"
command = "pnpm generate"
# Allow previewing docs
[[redirects]]
from = "/docs/*"
to = "/:splat"
status = 200
force = true

6
docs/nuxt.config.ts Executable file
View file

@ -0,0 +1,6 @@
export default defineNuxtConfig({
app: {
baseURL: '/docs',
},
extends: '@nuxt-themes/docus',
})

15
docs/package.json Executable file
View file

@ -0,0 +1,15 @@
{
"name": "elk-docs",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "nuxi dev",
"build": "nuxi build",
"generate": "nuxi generate",
"preview": "nuxi preview"
},
"devDependencies": {
"@nuxt-themes/docus": "^1.4.4",
"nuxt": "^3.0.0"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
docs/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -0,0 +1,16 @@
<svg width="400" height="100" viewBox="0 0 400 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect fill="#111" x="0" width="400" height="100" rx="15" />
<g transform="translate(50 15) scale(0.55)">
<path d="M137.5 98.7C130.9 98.7 125.2 97.2 120.6 94.2C116.1 91.3 112.7 86.9 111 81.8L120.7 76.1C123.5 83.8 129.2 87.7 137.8 87.7C142.1 87.7 145.2 86.9 147.3 85.2C149.4 83.7 150.6 81.2 150.6 78.6C150.7 76 149.4 73.5 147.2 72.2C144.9 70.7 140.8 69.1 135 67.3C132.3 66.5 129.6 65.6 127 64.5C124.7 63.5 122.6 62.3 120.5 61C118.4 59.5 116.6 57.5 115.5 55.2C114.3 52.7 113.8 49.9 113.8 47.1C113.8 41 116 36.2 120.3 32.6C124.7 29 130.2 27.1 135.9 27.2C141 27.1 146 28.5 150.4 31.2C154.6 33.9 157.9 37.8 159.9 42.3L150.4 47.8C147.5 41.4 142.7 38.2 135.9 38.2C132.6 38.2 130 39 128 40.6C126.1 42.1 125 44.4 125 46.8C124.9 49.2 126 51.5 128 52.9C130 54.3 133.7 55.9 138.9 57.5C141.5 58.4 143.4 59 144.6 59.5C145.8 59.9 147.6 60.5 149.7 61.5C151.5 62.2 153.2 63.1 154.7 64.3C156 65.4 157.2 66.5 158.3 67.8C159.6 69.1 160.5 70.7 161.1 72.5C161.6 74.5 161.9 76.5 161.9 78.5C161.9 84.7 159.6 89.7 155.1 93.4C150.6 97.1 144.7 98.8 137.5 98.7Z" fill="white"/>
<path d="M194.5 58.5H182.3V82.1C182.3 84.1 182.8 85.6 183.7 86.5C184.8 87.4 186.3 88 187.7 88C189.5 88.1 191.8 88 194.5 87.9V97.4C186.4 98.4 180.5 97.7 177 95.3C173.5 92.9 171.7 88.5 171.7 82V58.4H162.6V48.2H171.7V37.6L182.3 34.5V48.3H194.5V58.5Z" fill="white"/>
<path d="M238.6 48.3H249.2V97.5H238.6V90.4C234.6 96 228.9 98.8 221.4 98.8C214.8 98.9 208.5 96.2 204.1 91.3C199.4 86.4 196.8 79.7 196.9 72.9C196.9 65.6 199.3 59.5 204.1 54.5C208.5 49.7 214.8 46.9 221.4 47C228.9 47 234.6 49.7 238.6 55.2V48.3ZM211.9 84.2C218.1 90.1 227.9 90.1 234.1 84.2C237.1 81.2 238.6 77.1 238.5 72.9C238.6 68.7 237 64.6 234.1 61.7C227.9 55.7 218 55.7 211.9 61.7C208.9 64.7 207.3 68.7 207.5 72.9C207.4 77.1 209 81.2 211.9 84.2Z" fill="white"/>
<path d="M282.4 98.7C275 98.7 268.8 96.2 263.8 91.2C258.9 86.3 256.3 79.7 256.4 72.8C256.4 65.5 258.9 59.3 263.8 54.4C268.7 49.5 274.9 47 282.4 46.9C287 46.8 291.5 48 295.5 50.3C299.3 52.4 302.4 55.7 304.4 59.5L295.3 64.8C294.2 62.5 292.4 60.5 290.2 59.3C287.9 57.9 285.2 57.2 282.4 57.2C278.3 57.1 274.4 58.7 271.5 61.6C265.7 67.8 265.7 77.4 271.5 83.6C276.5 88.5 284.1 89.4 290.2 86C292.5 84.7 294.3 82.8 295.5 80.5L304.6 85.7C302.5 89.6 299.4 92.9 295.5 95C291.5 97.6 287 98.8 282.4 98.7Z" fill="white"/>
<path d="M353.2 97.5H340.5L320.3 74.8V97.5H309.7V28.6H320.3V70L339.4 48.3H352.4L330.8 72.4L353.2 97.5Z" fill="white"/>
<path d="M399.2 61.8C405.3 64.8 409 71.1 408.9 77.8C409 83.1 406.8 88.3 402.9 91.9C398.9 95.6 393.7 97.6 388.2 97.5H358.7V28.6H386C391.3 28.5 396.4 30.5 400.2 34.1C404.1 37.5 406.2 42.5 406.1 47.7C406.1 53.6 403.8 58.3 399.2 61.8ZM386 39.2H370V57.3H386C388.4 57.4 390.6 56.4 392.3 54.7C394 53 394.9 50.6 394.9 48.2C395 45.8 394 43.5 392.3 41.8C390.7 40.1 388.4 39.2 386 39.2ZM388.1 86.8C390.6 86.9 393 85.9 394.7 84C396.5 82.2 397.5 79.7 397.5 77.1C397.6 74.6 396.6 72.1 394.7 70.3C393 68.4 390.6 67.4 388.1 67.4H369.9V86.7H388.1V86.8Z" fill="white"/>
<path d="M415.5 97.5V25.7H426.1V97.5H415.5Z" fill="white"/>
<path d="M446.1 38.9C444.9 40.2 443.2 40.9 441.4 40.9C437.7 40.9 434.6 37.9 434.6 34.2V34.1C434.7 30.4 437.7 27.4 441.4 27.3C445.1 27.4 448.1 30.4 448.2 34.1C448.2 35.9 447.4 37.6 446.1 38.9ZM436 97.5V48.3H446.6V97.5H436Z" fill="white"/>
<path d="M484 58.5H471.8V82.1C471.8 84.1 472.3 85.6 473.2 86.5C474.3 87.4 475.8 88 477.2 88C479 88.1 481.3 88 484 87.9V97.4C475.9 98.4 470 97.7 466.5 95.3C463 92.9 461.2 88.5 461.2 82V58.4H452.1V48.2H461.2V37.6L471.8 34.5V48.3H484V58.5Z" fill="white"/>
<path d="M503.4 87.4H527.3V97.4H488.9V90.3L511.9 58.2H489.9V48.2H526.3V55.3L503.4 87.4Z" fill="white"/>
<path d="M0.700012 75H38.1L16.3 127.8L87.8 52.6H50.2L71.8 0.199997L0.700012 75Z" fill="#1389FD"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

8
docs/public/logo.svg Normal file
View file

@ -0,0 +1,8 @@
<svg width="180" height="180" viewBox="0 0 250 250" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M131.676 48.2479C122.848 49.273 118.156 46.9152 115.331 55.3212C115.331 55.3212 124.815 69.6216 150.09 69.2628C148.677 75.106 149.333 79.4115 149.333 84.5884C149.333 101.81 135.712 116.828 105.695 116.828C90.4593 116.828 71.9446 119.596 57.8189 127.336C47.7796 132.82 39.9247 140.765 36.4488 151.785L40.3888 157.372L47.931 157.474V189.099L38.7291 203.605L41.3726 245.635H50.1003L50.857 211.806C55.1956 209.243 65.134 202.58 73.6094 192.329C85.1118 178.541 93.9403 158.5 83.5478 133.692L91.317 130.36C99.8428 150.709 96.8663 168.341 89.3999 182.539C103.677 182.077 115.936 181.155 126.328 179.412L123.957 150.555L132.332 149.837L140.303 245.635H148.98L150.443 183.256C157.355 180.283 173.095 169.366 180.46 131.436C181.368 126.823 181.873 122.928 182.125 119.596C183.285 111.139 183.941 101.605 184.143 90.7391L171.783 86.7924H209.771L213.454 78.3352C209.872 78.4889 205.584 76.5925 205.584 76.5925L206.441 72.492H214.412L171.278 49.7855C166.486 51.6308 161.441 54.0398 157.909 56.9614C155.084 54.9112 145.297 48.5041 131.676 48.2479Z" fill="#EA9E44"/>
<path d="M165.174 185.512C169.714 180.591 174.961 173.671 179.855 164.394C180.006 168.238 180.258 170.545 180.46 171.724L202.809 190.893L185.959 224.107L178.392 220.519L188.935 196.173L165.174 185.512Z" fill="#A75C26"/>
<path d="M84.0523 191.15C90.5098 191.047 96.5636 190.791 102.264 190.432C94.9493 201.35 86.0703 209.192 82.3875 212.267V245.584H73.7608L69.3717 207.142C74.6184 202.734 79.6633 197.044 84.0523 191.15Z" fill="#A75C26"/>
<path d="M58.4243 6.24353L66.5466 3.93701C70.4816 18.1862 75.3751 25.9771 81.5299 29.9238C87.0793 33.2913 94.5962 33.3836 102.567 32.9479C100.246 32.1791 98.0771 31.1027 96.0592 29.6163C91.5692 26.2846 87.7351 20.749 84.8595 10.7028L92.9313 8.29378C95.1006 15.8797 97.6231 20.2364 101.003 22.748C104.383 25.2083 108.47 25.8233 113.313 26.3359C122.393 27.361 133.744 27.7711 147.921 34.4344C149.838 35.1519 151.805 36.0746 153.722 37.0997L153.722 37.0996C153.47 36.587 153.218 36.0745 152.865 35.5107C150.443 31.6665 145.701 27.6173 136.923 24.3369L139.748 16.341C154.025 21.5691 159.675 29.0012 161.945 34.8957C164.569 41.6102 162.954 46.8639 162.954 46.8639C160.936 47.5303 158.918 48.4529 156.598 49.1705C152.209 46.1464 148.072 43.8655 144.137 42.0715C129.608 36.5871 115.381 40.3288 102.769 41.5077C93.2845 42.379 84.6073 41.969 77.0904 37.1509C69.6744 32.4354 63.1665 23.4143 58.4243 6.24353Z" fill="#A75C26"/>
<path d="M113.918 19.9802C112.253 16.1872 111.244 11.5229 111.698 5.78223L120.073 6.3973C119.568 13.3681 121.99 18.0837 124.714 21.159C121.183 20.544 117.803 20.4722 113.918 19.9802Z" fill="#A75C26"/>
<path d="M166.889 19.1088L172.388 12.7018C186.665 25.3108 177.786 43.3529 177.786 43.3529L169.967 42.4816C169.715 38.3606 169.21 30.7029 165.578 26.3872C167.949 27.6019 169.967 28.9397 172.187 30.9489C172.187 27.2073 171.026 22.7992 166.889 19.1088Z" fill="#A75C26"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
docs/public/pwa-192x192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
docs/public/pwa-512x512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
docs/public/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 KiB

View file

@ -0,0 +1,19 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/pwa-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/pwa-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

10
docs/tokens.config.ts Normal file
View file

@ -0,0 +1,10 @@
import { defineTheme, palette } from 'pinceau'
export default defineTheme({
font: {
sans: 'DM Sans',
},
color: {
primary: palette('#d98018'),
},
})

3
docs/tsconfig.json Executable file
View file

@ -0,0 +1,3 @@
{
"extends": "./.nuxt/tsconfig.json"
}

View file

@ -54,7 +54,7 @@
"more": "المزيد", "more": "المزيد",
"next": "التالي", "next": "التالي",
"prev": "السابق", "prev": "السابق",
"publish": "!نشر", "publish": "نشر",
"reply": "رد", "reply": "رد",
"save": "حفظ", "save": "حفظ",
"save_changes": "حفظ التغييرات", "save_changes": "حفظ التغييرات",

View file

@ -39,7 +39,7 @@
"more": "Více", "more": "Více",
"next": "Dále", "next": "Dále",
"prev": "Zpět", "prev": "Zpět",
"publish": "Zveřejnit!", "publish": "Zveřejnit",
"reply": "Odpovědět", "reply": "Odpovědět",
"save_changes": "Uložit změny", "save_changes": "Uložit změny",
"sign_in": "Přihlásit se", "sign_in": "Přihlásit se",

View file

@ -39,7 +39,7 @@
"more": "Mehr", "more": "Mehr",
"next": "Nächster", "next": "Nächster",
"prev": "Vorheriger", "prev": "Vorheriger",
"publish": "Veröffentlichen!", "publish": "Veröffentlichen",
"reply": "Antworten", "reply": "Antworten",
"save_changes": "Änderungen speichern", "save_changes": "Änderungen speichern",
"sign_in": "Anmelden", "sign_in": "Anmelden",

View file

@ -54,7 +54,7 @@
"more": "More", "more": "More",
"next": "Next", "next": "Next",
"prev": "Prev", "prev": "Prev",
"publish": "Publish!", "publish": "Publish",
"reply": "Reply", "reply": "Reply",
"save": "Save", "save": "Save",
"save_changes": "Save changes", "save_changes": "Save changes",
@ -362,6 +362,7 @@
"tooltip": { "tooltip": {
"add_content_warning": "Add content warning", "add_content_warning": "Add content warning",
"add_media": "Add images, a video or an audio file", "add_media": "Add images, a video or an audio file",
"add_publishable_content": "Add content to publish",
"change_content_visibility": "Change content visibility", "change_content_visibility": "Change content visibility",
"change_language": "Change language", "change_language": "Change language",
"emoji": "Emoji", "emoji": "Emoji",

View file

@ -56,7 +56,7 @@
"more": "More", "more": "More",
"next": "Next", "next": "Next",
"prev": "Prev", "prev": "Prev",
"publish": "Publish!", "publish": "Publish",
"reply": "Reply", "reply": "Reply",
"reply_count": "{0}", "reply_count": "{0}",
"reset": "Reset", "reset": "Reset",
@ -146,6 +146,7 @@
"open_in_original_site": "Open in original site", "open_in_original_site": "Open in original site",
"pin_on_profile": "Pin on profile", "pin_on_profile": "Pin on profile",
"share_post": "Share this post", "share_post": "Share this post",
"show_favourited_and_boosted_by": "Show who favourited and boosted",
"show_reblogs": "Show boosts from {0}", "show_reblogs": "Show boosts from {0}",
"show_untranslated": "Show untranslated", "show_untranslated": "Show untranslated",
"toggle_theme": { "toggle_theme": {
@ -346,7 +347,9 @@
"uploading": "Uploading..." "uploading": "Uploading..."
}, },
"status": { "status": {
"boosted_by": "Boosted By",
"edited": "Edited {0}", "edited": "Edited {0}",
"favourited_by": "Favorited By",
"filter_hidden_phrase": "Filtered by", "filter_hidden_phrase": "Filtered by",
"filter_removed_phrase": "Removed by filter", "filter_removed_phrase": "Removed by filter",
"filter_show_anyway": "Show anyway", "filter_show_anyway": "Show anyway",
@ -429,6 +432,7 @@
"tooltip": { "tooltip": {
"add_content_warning": "Add content warning", "add_content_warning": "Add content warning",
"add_media": "Add images, a video or an audio file", "add_media": "Add images, a video or an audio file",
"add_publishable_content": "Add content to publish",
"change_content_visibility": "Change content visibility", "change_content_visibility": "Change content visibility",
"change_language": "Change language", "change_language": "Change language",
"emoji": "Emoji", "emoji": "Emoji",

View file

@ -54,7 +54,7 @@
"more": "Más", "more": "Más",
"next": "Siguiente", "next": "Siguiente",
"prev": "Anterior", "prev": "Anterior",
"publish": "¡Publicar!", "publish": "Publicar",
"reply": "Responder", "reply": "Responder",
"save": "Guardar", "save": "Guardar",
"save_changes": "Guardar", "save_changes": "Guardar",

View file

@ -8,9 +8,9 @@
}, },
"account": { "account": {
"avatar_description": "Avatar de {0}", "avatar_description": "Avatar de {0}",
"blocked_by": "Vous êtes bloqué·e par cet·te utilisateur.", "blocked_by": "Vous êtes bloqué·e par cet·te utilisateur·ice.",
"blocked_domains": "Domaines bloqués", "blocked_domains": "Domaines bloqués",
"blocked_users": "Utilisateurs bloqués", "blocked_users": "utilisateur·ice·s bloqué·e·s",
"blocking": "Blocked", "blocking": "Blocked",
"bot": "Automatisé", "bot": "Automatisé",
"favourites": "Favoris", "favourites": "Favoris",
@ -25,8 +25,8 @@
"go_to_profile": "Aller à son profil", "go_to_profile": "Aller à son profil",
"joined": "a rejoint", "joined": "a rejoint",
"moved_title": "a indiqué que son nouveau compte est désormais :", "moved_title": "a indiqué que son nouveau compte est désormais :",
"muted_users": "Utilisateurs mis en sourdine", "muted_users": "Utilisateur·ice·s masqué·e·s",
"muting": "Muted", "muting": "Masqué·e",
"mutuals": "@:account.following", "mutuals": "@:account.following",
"pinned": "Épinglés", "pinned": "Épinglés",
"posts": "Messages", "posts": "Messages",
@ -56,6 +56,7 @@
"prev": "Précédent", "prev": "Précédent",
"publish": "Publier", "publish": "Publier",
"reply": "Répondre", "reply": "Répondre",
"reset": "Réinitialiser",
"save": "Enregistrer", "save": "Enregistrer",
"save_changes": "Enregistrer les changements", "save_changes": "Enregistrer les changements",
"sign_in": "Se connecter", "sign_in": "Se connecter",
@ -109,6 +110,9 @@
"desc_para6": "et rejoingez l'aventure.", "desc_para6": "et rejoingez l'aventure.",
"title": "Elk est mode Preview !" "title": "Elk est mode Preview !"
}, },
"language": {
"search": "Recherche"
},
"menu": { "menu": {
"block_account": "Bloquer {0}", "block_account": "Bloquer {0}",
"block_domain": "Bloquer le domaine {0}", "block_domain": "Bloquer le domaine {0}",
@ -122,6 +126,7 @@
"mute_conversation": "Message muet", "mute_conversation": "Message muet",
"open_in_original_site": "Ouvrir sur le site d'origine", "open_in_original_site": "Ouvrir sur le site d'origine",
"pin_on_profile": "Épingler sur le profil", "pin_on_profile": "Épingler sur le profil",
"share_post": "Partager ce message",
"show_untranslated": "Montrer le message non-traduit", "show_untranslated": "Montrer le message non-traduit",
"toggle_theme": { "toggle_theme": {
"dark": "Passer au thème foncé", "dark": "Passer au thème foncé",
@ -135,6 +140,9 @@
"unpin_on_profile": "Désépingler du profil" "unpin_on_profile": "Désépingler du profil"
}, },
"nav": { "nav": {
"back": "Retourner à la page précédente",
"blocked_domains": "Domaines bloqués",
"blocked_users": "Utilisateur·ice·s bloqué·e·s",
"bookmarks": "Marque-pages", "bookmarks": "Marque-pages",
"built_at": "Dernier build {0}", "built_at": "Dernier build {0}",
"conversations": "Conversations", "conversations": "Conversations",
@ -143,6 +151,7 @@
"federated": "Fédérés", "federated": "Fédérés",
"home": "Accueil", "home": "Accueil",
"local": "Local", "local": "Local",
"muted_users": "Utilisateur·ice·s masqué·e·s",
"notifications": "Notifications", "notifications": "Notifications",
"profile": "Profil", "profile": "Profil",
"search": "Rechercher", "search": "Rechercher",
@ -175,7 +184,29 @@
"dismiss": "Fermer", "dismiss": "Fermer",
"title": "Nouvelle mise à jour Elk disponible !", "title": "Nouvelle mise à jour Elk disponible !",
"update": "Mettre à jour", "update": "Mettre à jour",
"update_available_short": "Mettre à jour Elk" "update_available_short": "Mettre à jour Elk",
"webmanifest": {
"canary": {
"description": "Un client Web Mastodon (canary)",
"name": "Elk (canary)",
"short_name": "Elk (canary)"
},
"dev": {
"description": "Un client Web Mastodon (dev)",
"name": "Elk (dev)",
"short_name": "Elk (dev)"
},
"preview": {
"description": "Un client Web Mastodon (aperçu)",
"name": "Elk (aperçu)",
"short_name": "Elk (aperçu)"
},
"release": {
"description": "Un client Web Mastodon",
"name": "Elk",
"short_name": "Elk"
}
}
}, },
"search": { "search": {
"search_desc": "Recherche de personnes & hashtags" "search_desc": "Recherche de personnes & hashtags"
@ -184,6 +215,10 @@
"about": { "about": {
"label": "À propos" "label": "À propos"
}, },
"account_settings": {
"description": "Modifiez les paramètres de votre compte dans l'interface de Mastodon",
"label": "Paramètres de compte"
},
"feature_flags": { "feature_flags": {
"github_cards": "GitHub Cards", "github_cards": "GitHub Cards",
"title": "Fonctionnalités expérimentales", "title": "Fonctionnalités expérimentales",
@ -193,10 +228,17 @@
"interface": { "interface": {
"color_mode": "Couleur de thème", "color_mode": "Couleur de thème",
"dark_mode": "Mode sombre", "dark_mode": "Mode sombre",
"default": "(défaut)", "default": " (par défaut)",
"font_size": "Taille de police", "font_size": "Taille de police",
"label": "Interface", "label": "Interface",
"light_mode": "Mode lumineux" "light_mode": "Mode lumineux",
"size_label": {
"lg": "Grande",
"md": "Moyenne",
"sm": "Petite",
"xl": "Très grande",
"xs": "Très petite"
}
}, },
"language": { "language": {
"display_language": "Langue d'affichage", "display_language": "Langue d'affichage",
@ -254,10 +296,12 @@
"profile": { "profile": {
"appearance": { "appearance": {
"bio": "Bio", "bio": "Bio",
"description": "Editer l'avatar, nom d'utilisateur, profile, etc.", "description": "Editer l'avatar, nom d'utilisateur·ice, profil, etc.",
"display_name": "Nom d'affichage", "display_name": "Nom d'affichage",
"label": "Apparence", "label": "Apparence",
"title": "Editer le profile" "profile_metadata": "Métadonnées de profil",
"profile_metadata_desc": "Vous pouvez avoir jusqu'à 4 éléments affichés sous forme de tableau sur votre profil",
"title": "Editer le profil"
}, },
"featured_tags": { "featured_tags": {
"description": "Les gens peuvent parcourir vos messages publics sous ces hashtags.", "description": "Les gens peuvent parcourir vos messages publics sous ces hashtags.",
@ -267,9 +311,9 @@
}, },
"select_a_settings": "Sélectionner un paramètre", "select_a_settings": "Sélectionner un paramètre",
"users": { "users": {
"export": "Exporter les tokens d'utilisateur", "export": "Exporter les tokens d'utilisateur·ice",
"import": "Importer des tokens d'utilisateur", "import": "Importer des tokens d'utilisateur·ice",
"label": "Utilisateurs connectés" "label": "Utilisateur·ice·s connecté·e·s"
} }
}, },
"state": { "state": {
@ -316,6 +360,12 @@
"posts": "Messages", "posts": "Messages",
"posts_with_replies": "Messages et réponses" "posts_with_replies": "Messages et réponses"
}, },
"tag": {
"follow": "Suivre",
"follow_label": "Suivre la balise {0}",
"unfollow": "Ne plus suivre",
"unfollow_label": "Ne plus suivre la balise {0}"
},
"time_ago_options": { "time_ago_options": {
"day_future": "dans 0 jour|demain|dans {n} jours", "day_future": "dans 0 jour|demain|dans {n} jours",
"day_past": "il y a 0 jour|hier|il y a {n} jours", "day_past": "il y a 0 jour|hier|il y a {n} jours",
@ -348,7 +398,8 @@
"year_past": "il y a 0 année|l'année dernière|il y a {n} années" "year_past": "il y a 0 année|l'année dernière|il y a {n} années"
}, },
"timeline": { "timeline": {
"show_new_items": "Voir le nouveau message|Voir les {v} nouveaux messages" "show_new_items": "Voir le nouveau message|Voir les {v} nouveaux messages",
"view_older_posts": "Les messages plus anciens d'autres instances peuvent ne pas être affichés."
}, },
"title": { "title": {
"federated_timeline": "Fil d'actualité fédéré", "federated_timeline": "Fil d'actualité fédéré",

View file

@ -21,7 +21,7 @@
"action": { "action": {
"compose": "今なにしてる?", "compose": "今なにしてる?",
"enter_app": "使い始める", "enter_app": "使い始める",
"publish": "投稿!", "publish": "投稿",
"save_changes": "変更を保存", "save_changes": "変更を保存",
"sign_in": "サインイン", "sign_in": "サインイン",
"vote": "投票" "vote": "投票"

View file

@ -56,7 +56,7 @@
"more": "Meer", "more": "Meer",
"next": "Volgende", "next": "Volgende",
"prev": "Vorige", "prev": "Vorige",
"publish": "Publiceer!", "publish": "Publiceer",
"reply": "Beantwoord", "reply": "Beantwoord",
"reply_count": "{0}", "reply_count": "{0}",
"reset": "Resetten", "reset": "Resetten",

432
locales/uk-UA.json Normal file
View file

@ -0,0 +1,432 @@
{
"a11y": {
"loading_page": "Завантаження сторінки, будь ласка, зачекайте",
"loading_titled_page": "Завантаження сторінки {0}, будь ласка, зачекайте",
"locale_changed": "Мову змінено на {0}",
"locale_changing": "Зміна мови, будь ласка, зачекайте",
"route_loaded": "Сторінка {0} завантажена"
},
"account": {
"avatar_description": "Аватар {0}",
"blocked_by": "Ви заблоковані цим користувачем.",
"blocked_domains": "Заблоковані домени",
"blocked_users": "Заблоковані користувачі",
"blocking": "Заблоковані",
"bot": "БОТ",
"favourites": "Улюблені",
"follow": "Підписатися",
"follow_back": "Підписатися",
"follow_requested": "Запити",
"followers": "Підписники",
"followers_count": "{0} підписників|{0} підписник|{0} підписники|{0} підписників",
"following": "Підписаний",
"following_count": "{0} підписок",
"follows_you": "Підписаний на вас",
"go_to_profile": "Перейти до профілю",
"joined": "Зареєстровано",
"moved_title": "вказав, що його новий обліковий запис тепер:",
"muted_users": "Приховані користувачі",
"muting": "Приховано",
"mutuals": "Взаємно",
"pinned": "Закріплені дописи",
"posts": "Дописи",
"posts_count": "{0} дописів|{0} допис|{0} дописи|{0} дописів",
"profile_description": "Заголовок профілю {0}",
"profile_unavailable": "Профіль недоступний",
"unblock": "Розблокувати",
"unfollow": "Відписатися",
"unmute": "Приховати"
},
"action": {
"apply": "Застосувати",
"bookmark": "Додати в закладки",
"bookmarked": "Додано з закладки",
"boost": "Поширити",
"boost_count": "{0}",
"boosted": "Поширено",
"clear_upload_failed": "Очистити помилки завантаження",
"close": "Закрити",
"compose": "Написати",
"confirm": "Підтвердити",
"edit": "Редагувати",
"enter_app": "Перейти до додатку",
"favourite": "Вподобати",
"favourite_count": "{0}",
"favourited": "Подобається",
"more": "Більше",
"next": "Наступний",
"prev": "Попередній",
"publish": "Опублікувати",
"reply": "Відповісти",
"reply_count": "{0}",
"reset": "Скинути",
"save": "Зберегти",
"save_changes": "Зберегти зміни",
"sign_in": "Увійти",
"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": {
"confirm_dialog": {
"cancel": "Відмінити",
"confirm": "Так",
"title": "Ви впевнені?"
},
"end_of_list": "Кінець списку",
"error": "ПОМИЛКА",
"in": "в",
"not_found": "404 Не знайдено",
"offline_desc": "Схоже, ви відключені від мережі. Будь ласка, перевірте ваше підключення до мережі."
},
"compose": {
"draft_title": "Чернетка {0}",
"drafts": "Чернетки ({v})"
},
"conversation": {
"with": "з"
},
"error": {
"account_not_found": "Обліковий запис {0} не знайдено",
"explore-list-empty": "Зараз нічого не в тренді. Перевірте пізніше!",
"file_size_cannot_exceed_n_mb": "Розмір файлу не може перевищувати {0} Мб",
"sign_in_error": "Не вдалося підключитися до сервера.",
"status_not_found": "Допис не знайдено",
"unsupported_file_format": "Непідтримуваний формат файлу"
},
"help": {
"desc_highlight": "Очікуйте деякі помилки та відсутні функції тут і там.",
"desc_para1": "Дякуємо за ваш інтерес до випробування Elk, нашого універсального клієнта Mastodon, який ще у розробці!",
"desc_para2": "Ми наполегливо працюємо над розробкою та вдосконалюємо його. Ми відкриємо вихідний код, коли він буде готовий для загального використання.",
"desc_para3": "Щоб допомогти прискорити розробку, ви можете спонсорувати членів нашої команди за посиланнями нижче. Сподіваємося, вам сподобається Elk!",
"desc_para4": "До цього, якщо ви хочете допомогти з тестуванням, надіслати відгук або зробити внесок,",
"desc_para5": "зв’яжіться з нами на Mastodon",
"desc_para6": "і долучіться.",
"title": "Elk у попередньому перегляді!"
},
"language": {
"none": "Жодного",
"search": "Пошук"
},
"menu": {
"block_account": "Заблокувати {0}",
"block_domain": "Заблокувати домен {0}",
"copy_link_to_post": "Скопіювати посилання на цей допис",
"delete": "Видалити",
"delete_and_redraft": "Видалити і переписати",
"delete_confirm": {
"cancel": "Скасувати",
"confirm": "Видалити",
"title": "Ви впевнені, що хочете видалити цей допис?"
},
"direct_message_account": "Пряме повідомлення {0}",
"edit": "Редагувати",
"mention_account": "Згадати {0}",
"mute_account": "Приховати {0}",
"mute_conversation": "Ігнорувати цей допис",
"open_in_original_site": "Відкрити на оригінальному сайті",
"pin_on_profile": "Закріпити на профілі",
"share_post": "Поділіться цим дописом",
"show_untranslated": "Показати без перекладу",
"toggle_theme": {
"dark": "Увімкнути темний режим",
"light": "Увімкнути світлий режим"
},
"translate_post": "Перекласти допис",
"unblock_account": "Розблокувати {0}",
"unblock_domain": "Розблокувати домен {0}",
"unmute_account": "Не приховувати {0}",
"unmute_conversation": "Не ігнорувати цей допис",
"unpin_on_profile": "Відкріпити з профілю"
},
"nav": {
"back": "Назад",
"blocked_domains": "Заблоковані домени",
"blocked_users": "Заблоковані користувачі",
"bookmarks": "Закладки",
"built_at": "Оновлено {0}",
"conversations": "Прямі повідомлення",
"explore": "Огляд",
"favourites": "Вподобане",
"federated": "Глобальна",
"home": "Головна",
"local": "Локальна",
"muted_users": "Приховані користувачі",
"notifications": "Сповіщення",
"profile": "Профіль",
"search": "Пошук",
"select_feature_flags": "Налаштування функцій",
"select_font_size": "Вибрати розмір шрифту",
"select_language": "Вибрати мову",
"settings": "Налаштування",
"show_intro": "Показати інтро",
"toggle_theme": "Змінити тему",
"zen_mode": "Zen-режим"
},
"notification": {
"favourited_post": "додали ваший допис до вибраного",
"followed_you": "підписались на вас",
"followed_you_count": "{followers} людей підписалися на вас|{followers} людина підписалися на вас|{followers} людини підписалися на вас|{followers} людей підписалися на вас",
"missing_type": "ВІДСУТНІЙ notification.type:",
"reblogged_post": "поширили ваш допис",
"request_to_follow": "попросили підписатися на вас",
"signed_up": "зареєструвалися",
"update_status": "оновили свою публікацію"
},
"placeholder": {
"content_warning": "Напишіть ваше попередження тут",
"default_1": "Що у вас на думці?",
"reply_to_account": "Відповісти {0}",
"replying": "Відповідь",
"the_thread": "нитка"
},
"pwa": {
"dismiss": "Закрити",
"title": "Доступна нова версія Elk!",
"update": "Оновити",
"update_available_short": "Оновити Elk"
},
"search": {
"search_desc": "Пошук користувачів та хештеґів"
},
"settings": {
"about": {
"label": "Про нас"
},
"account_settings": {
"description": "Відредагуйте налаштування облікового запису використовуєчи інтерфейс Mastodon",
"label": "Налаштування облікового запису"
},
"feature_flags": {
"github_cards": "GitHub картки",
"title": "Експериментальні налаштування"
},
"interface": {
"color_mode": "Кольорова тема",
"dark_mode": "Темна",
"default": " (за замовчуванням)",
"font_size": "Розмір шрифта",
"label": "Інтерфейс",
"light_mode": "Світла",
"size_label": {
"lg": "Великий",
"md": "Середній",
"sm": "Малий",
"xl": "Дуже великий",
"xs": "Дуже малий"
}
},
"language": {
"display_language": "Мова інтерфейсу",
"label": "Мова"
},
"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": "Очистити помилку",
"permission_denied": "У дозволі відмовлено: увімкніть сповіщення у своєму браузері.",
"request_error": "Під час запиту на підписку сталася помилка. Повторіть спробу, а якщо помилка не зникне, повідомте про проблему в репозиторій Elk.",
"title": "Не вдалося підписатися на push-сповіщення"
},
"undo_settings": "Скасувати зміни",
"unsubscribe": "Вимкнути push-сповіщення",
"unsupported": "Ваш браузер не підтримує push-сповіщення.",
"warning": {
"enable_close": "Закрити",
"enable_description": "Щоб отримувати сповіщення, коли Elk не відкрито, увімкніть push-сповіщення. Ви можете контролювати, які саме типи сповіщень генерують push-повідомлення, за допомогою кнопки \"@:settings.notifications.show_btn{'\"'} після ввімкнення.",
"enable_desktop": "Увімкнути push-повідомлення",
"enable_title": "Ніколи нічого не пропускайте",
"re_auth": "Здається, ваш сервер не підтримує push-повідомлення. Спробуйте вийти та увійти знову, якщо це повідомлення все одно з’являється, зверніться до адміністратора свого сервера."
}
},
"show_btn": "Перейти до налаштувань сповіщень"
},
"notifications_settings": "Сповіщення",
"preferences": {
"label": "Налаштування"
},
"profile": {
"appearance": {
"bio": "Про Вас",
"description": "Редагувати аватар, ім'я, профіль, тощо.",
"display_name": "Ім'я",
"label": "Вигляд",
"profile_metadata": "Метадані профілю",
"profile_metadata_desc": "У вашому профілі можна відображати до 4 елементів у вигляді таблиці",
"title": "Редагувати профіль"
},
"featured_tags": {
"description": "Користувачі можуть фільтрувати ваші загальнодоступні дописи за цими хештеґами.",
"label": "Рекомендовані хештеґи"
},
"label": "Профіль"
},
"select_a_settings": "Виберіть налаштування",
"users": {
"export": "Експортувати токени користувачів",
"import": "Імпортувати токени користувачів",
"label": "Користувачі"
}
},
"state": {
"attachments_exceed_server_limit": "Кількість вкладених файлів перевищила ліміт на допис.",
"attachments_limit_error": "Перевищено максимальну кількість вкладень",
"edited": "(Відредаговано)",
"editing": "Редагування",
"loading": "Завантаження...",
"upload_failed": "Помилка завантаження",
"uploading": "Завантаження..."
},
"status": {
"edited": "Редаговано {0}",
"filter_hidden_phrase": "Відфільтровано",
"filter_removed_phrase": "Видалено фільтром",
"filter_show_anyway": "Показати все одно",
"img_alt": {
"desc": "Опис зображення",
"dismiss": "Закрити"
},
"poll": {
"count": "{0} голосів|{0} голос|{0} голоси|{0} голосів",
"ends": "завершується {0}",
"finished": "зевершилось {0}"
},
"reblogged": "{0} поширив",
"replying_to": "Відповідає {0}",
"show_full_thread": "Показати потік дописів",
"someone": "комусь",
"spoiler_show_less": "Показувати менше",
"spoiler_show_more": "Показати більше",
"try_original_site": "Спробуйте оригінальний сайт"
},
"status_history": {
"created": "створено {0}",
"edited": "редаговано {0}"
},
"tab": {
"for_you": "Для вас",
"hashtags": "Хештеґи",
"media": "Медіа",
"news": "Новини",
"notifications_all": "Усі",
"notifications_mention": "Згадки",
"posts": "Дописи",
"posts_with_replies": "Дописи та відповіді"
},
"tag": {
"follow": "Стежити",
"follow_label": "Стежити за хештеґом {0}",
"unfollow": "Не стежити",
"unfollow_label": "Не стежити за хештеґом {0}"
},
"time_ago_options": {
"day_future": "через {n} днів|через {n} день|через {n} дні|через {n} днів",
"day_past": "{n} днів томо|{n} день тому|{n} дні тому|{n} днів тому",
"hour_future": "через {n} годин|через {n} годину|через {n} години|через {n} годин",
"hour_past": "{n} годин тому|{n} годину тому|{n} години тому|{n} годин тому",
"just_now": "тільки що",
"minute_future": "через {n} хвилин|через {n} хвилину|через {n} хвилини|через {n} хвилин",
"minute_past": "{n} хвилин тому|{n} хвилину тому|{n} хвилини тому|{n} хвилин тому",
"month_future": "через {n} місяців|через {n} місяць|через {n} місяці|через {n} місяців",
"month_past": "{n} місяців тому|{n} місяць тому|{n} місяці тому|{n} місяців тому",
"second_future": "тільки що|через {n} секунду|через {n} секунди|через {n} секунд",
"second_past": "тільки що|{n} секунду тому|{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": "через {n} тижнів|через {n} тиждень|через {n} тижні|через {n} тижнів",
"week_past": "{n} тижнів тому|{n} тиждень тому|{n} тижні тому|{n} тижнів тому",
"year_future": "через {n} років|через {n} рік|через {n} роки|через {n} років",
"year_past": "{n} років тому|{n} рік тому|{n} роки тому|{n} років тому"
},
"timeline": {
"show_new_items": "Показати {v} нових дописів|Показати {v} новий допис|Показати {v} нових дописи|Показати {v} нових дописів",
"view_older_posts": "Старіші дописи з інших серверів можуть не відображатися."
},
"title": {
"federated_timeline": "Глобальна стрічка",
"local_timeline": "Локальна стрічка"
},
"tooltip": {
"add_content_warning": "Додати попередження про вміст",
"add_media": "Додати зображення, відео або аудіо",
"change_content_visibility": "Змінити видимість вмісту",
"change_language": "Змінити мову",
"emoji": "Емоджі",
"explore_links_intro": "Ці новини розповідають історії про людей на цих та інших серверах децентралізованої мережі прямо зараз.",
"explore_posts_intro": "Ці дописи з цього та інших серверів децентралізованої мережі зараз набирають популярності на цьому сервері.",
"explore_tags_intro": "Ці хештеґи зараз набирають популярності серед людей на цьому та інших серверах децентралізованої мережі.",
"toggle_code_block": "Блок коду"
},
"user": {
"add_existing": "Додати аккаунт",
"server_address_label": "Адреса серверу Mastodon",
"sign_in_desc": "Увійдіть, щоб слідкувати за профілями або хештеґами, додавати до обраного, розповсюджувати і відповідати на дописи, або взаємодіяти з вашого аккаунту на іншому сервері.",
"sign_in_notice_title": "Перегляд публічних даних {0}",
"sign_out_account": "Вийти з {0}",
"tip_no_account": "Якщо у вас ще немає аккаунту Mastodon, {0}.",
"tip_register_account": "оберіть сервер і зареєструйтесь"
},
"visibility": {
"direct": "Лише згадані користувачі",
"direct_desc": "Показати лише згаданим користувачам",
"private": "Тільки для підписників",
"private_desc": "Показати лише підписникам",
"public": "Публічно",
"public_desc": "Видимий для всіх",
"unlisted": "Прихований",
"unlisted_desc": "Видимий для всіх, але не через можливості виявлення"
}
}

View file

@ -54,7 +54,7 @@
"more": "更多", "more": "更多",
"next": "下一个", "next": "下一个",
"prev": "上一个", "prev": "上一个",
"publish": "发布", "publish": "发布",
"reply": "回复", "reply": "回复",
"save": "保存", "save": "保存",
"save_changes": "保存更改", "save_changes": "保存更改",

View file

@ -54,7 +54,7 @@
"more": "更多", "more": "更多",
"next": "下一個", "next": "下一個",
"prev": "上一個", "prev": "上一個",
"publish": "發布", "publish": "發布",
"reply": "回复", "reply": "回复",
"save": "保存", "save": "保存",
"save_changes": "保存更改", "save_changes": "保存更改",

View file

@ -25,9 +25,9 @@ export default defineNuxtModule({
nuxt.hook('nitro:config', (config) => { nuxt.hook('nitro:config', (config) => {
config.publicAssets = config.publicAssets || [] config.publicAssets = config.publicAssets || []
if (env === 'dev') if (env === 'dev')
config.publicAssets.push({ dir: resolve('../public-dev') }) config.publicAssets.unshift({ dir: resolve('../public-dev') })
else if (env === 'canary' || env === 'preview' || !isCI) else if (env === 'canary' || env === 'preview' || !isCI)
config.publicAssets.push({ dir: resolve('../public-staging') }) config.publicAssets.unshift({ dir: resolve('../public-staging') })
}) })
}, },
}) })

File diff suppressed because it is too large Load diff

2
pnpm-workspace.yaml Normal file
View file

@ -0,0 +1,2 @@
packages:
- docs

1
public/_redirects Normal file
View file

@ -0,0 +1 @@
/docs/* https://docs.elk.zone/:splat 200