Compare commits

...

43 Commits

Author SHA1 Message Date
teutat3s 390878b86d
feat: add fly.toml 2024-03-26 17:45:41 +01:00
renovate[bot] 1b189043e4
chore(deps): update devdependencies (major) (#2400)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 08:51:07 +00:00
renovate[bot] a4867566d9
chore(deps): update devdependencies (#2697)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 08:34:06 +00:00
renovate[bot] 0757db69b2
chore(deps): update dependency @types/prettier to v3 (#2712)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 08:33:11 +00:00
renovate[bot] f0de25c992
chore(deps): update dependency @antfu/eslint-config to ^2.9.0 (#2711)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 08:32:33 +00:00
TAKAHASHI Shuuji 660549b08b
chore: update masto to v6.7.0 (#2708) 2024-03-21 15:18:53 +00:00
Joaquín Sánchez 7807730118
feat(i18n): add missing spanish mute duration dialog entries (#2696) 2024-03-21 12:37:57 +00:00
Joaquín Sánchez b526db0860
chore: update i18n module to 8.2.0 (#2703) 2024-03-21 12:13:28 +00:00
Sma11X 0133324ded
fix: correct local timeline stream (#2707) 2024-03-21 10:08:51 +00:00
TAKAHASHI Shuuji e9ab0cd40b
fix: prevent showing notification errors for dev for known emoji reaction types (#2704) 2024-03-19 15:04:16 +00:00
Joaquín Sánchez 9251ec496b
chore: add `ofetch` to `typescript.hoist` (#2693)
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-03-19 12:56:14 +00:00
renovate[bot] bd4cd02b2b
chore(deps): update pnpm to v8.15.5 (#2698)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-19 12:40:13 +00:00
Joaquín Sánchez 74ccfece5d
chore: update nuxt to 3.11.1 (#2702) 2024-03-19 12:36:25 +00:00
Sma11X c89e499f96
fix: pre tag overwritten by default style (#2699) 2024-03-18 11:34:03 +00:00
Dohány Tamás 89e3582dd7
feat(i18n): Update hu-HU.json (#2694) 2024-03-17 19:11:42 +00:00
TAKAHASHI Shuuji 48c013709a
ci(docker.yml): support `linux/arm64` container (#2691) 2024-03-17 15:15:04 +00:00
renovate[bot] f90f0a2e61
chore(deps): update pnpm to v8.15.4 (#2627)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-17 15:14:19 +00:00
renovate[bot] c58b585855
chore(deps): update lint (#2399)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-17 15:14:04 +00:00
Joaquín Sánchez ded2e0f3d7
chore: update nuxt to 3.11.0 (#2692) 2024-03-17 14:32:02 +00:00
Joaquín Sánchez 21d5633233
chore: bump to eslint-config to 2.8.1 (#2685) 2024-03-13 06:39:28 +00:00
Joaquín Sánchez 7703565c75
fix(ui): hashtags not working when composing (#2686) 2024-03-12 20:47:05 +00:00
cuithon 5a9546ec0a
chore: fix typo (#2681)
Signed-off-by: cuithon <dscs@outlook.com>
2024-03-12 07:58:20 +00:00
patak bc30a8bd82 chore: release v0.13.0 2024-03-11 12:08:52 +01:00
Duy c432c2bd0d
feat(i18n): Update vi-VN.json (#2664) 2024-03-11 10:55:18 +00:00
Francesco 364fbd350b
feat(i18n): Update it-IT locale (#2666) 2024-03-11 10:55:05 +00:00
Xabi c64580f782
feat(i18n): update eu-ES.json (#2670) 2024-03-11 10:54:53 +00:00
Emanuel Pina e7dfdafd59
feat(i18n): Update portuguese from Portugal translation (#2671) 2024-03-11 10:54:38 +00:00
Ayo Ayco b06ec9356d
feat(i18n): update Tagalog translations (#2677) 2024-03-11 10:54:20 +00:00
TAKAHASHI Shuuji 3b1a66c93c
fix: fix `vue/no-ref-as-operand` and `vue/return-in-computed-property` ESLint errors (#2679) 2024-03-11 10:53:25 +00:00
TAKAHASHI Shuuji ed8a1811cc
chore: upgrade `@vueuse/core` from `10.8.0` to `10.9.0` (#2674) 2024-03-10 18:38:37 +00:00
TAKAHASHI Shuuji dfbe2e080d
fix: prevent empty search keyword to send invalid request (#2676) 2024-03-10 18:37:32 +00:00
TAKAHASHI Shuuji 0fd9374e8c
fix: fix incorrect follow status on followers and following pages (#2669) 2024-03-09 19:31:40 +00:00
TAKAHASHI Shuuji 1c8e48bee4
fix: show loading spinner on follow button while fetching account relationship (#2667)
Co-authored-by: patak <583075+patak-dev@users.noreply.github.com>
2024-03-09 18:44:44 +00:00
TAKAHASHI Shuuji 3448335356
feat: allow to set mute duration and notifications mute option (#2665) 2024-03-09 09:52:41 +00:00
Joaquín Sánchez 4954473f50
chore: extract bg and theme colors to constants (#2662) 2024-03-07 19:15:35 +00:00
TAKAHASHI Shuuji efa17caf5e
fix: consistent hover highlight styling in mobile bottom navigation menus (#2661) 2024-03-07 19:14:20 +00:00
Joaquín Sánchez df165f0023
fix(pwa): wrong web manifest colors (#2659) 2024-03-07 14:55:27 +00:00
TAKAHASHI Shuuji 0f583ece28
feat: remember last accessed explore tab (#2658) 2024-03-07 14:33:25 +00:00
Ivan Demchuk d579977790
feat(i18n): update Ukrainian translations (#2660) 2024-03-07 13:41:24 +00:00
TAKAHASHI Shuuji 8786c83db7
fix: remember last accessed notification tab (#2654) 2024-03-06 22:00:07 +00:00
patak 1ce913e69d chore: release v0.12.1 2024-03-06 16:52:16 +01:00
Joaquín Sánchez 48a8b74e7c
fix(ui): mentions not working when composing (#2655) 2024-03-06 15:42:41 +00:00
patak 1ff13952b0 chore: release v0.12.0 2024-03-06 08:48:14 +01:00
55 changed files with 2741 additions and 1895 deletions

View File

@ -38,7 +38,7 @@ jobs:
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
with: with:
context: . context: .
platforms: linux/amd64 platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }} push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.metal.outputs.tags }} tags: ${{ steps.metal.outputs.tags }}
labels: ${{ steps.metal.outputs.labels }} labels: ${{ steps.metal.outputs.labels }}

View File

@ -13,6 +13,7 @@ const { t } = useI18n()
const isSelf = useSelfAccount(() => account) const isSelf = useSelfAccount(() => account)
const enable = computed(() => !isSelf.value && currentUser.value) const enable = computed(() => !isSelf.value && currentUser.value)
const relationship = computed(() => props.relationship || useRelationship(account).value) const relationship = computed(() => props.relationship || useRelationship(account).value)
const isLoading = computed(() => relationship.value === undefined)
const { client } = useMasto() const { client } = useMasto()
@ -62,6 +63,10 @@ const buttonStyle = computed(() => {
if (relationship.value ? relationship.value.following : context === 'following') if (relationship.value ? relationship.value.following : context === 'following')
return `text-base ${relationship.value?.followedBy ? 'border-strong' : 'border-base'}` return `text-base ${relationship.value?.followedBy ? 'border-strong' : 'border-base'}`
// If loading, use a plain style
if (isLoading.value)
return 'text-base border-base'
// If not following, use a button style // If not following, use a button style
return 'text-inverted bg-primary border-primary' return 'text-inverted bg-primary border-primary'
}) })
@ -77,28 +82,33 @@ const buttonStyle = computed(() => {
: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() : toggleFollowAccount(relationship!, account)" @click="relationship?.blocking ? unblock() : relationship?.muting ? unmute() : toggleFollowAccount(relationship!, account)"
> >
<template v-if="relationship?.blocking"> <template v-if="isLoading">
<span elk-group-hover="hidden">{{ $t('account.blocking') }}</span> <span i-svg-spinners-180-ring-with-bg />
<span hidden elk-group-hover="inline">{{ $t('account.unblock') }}</span>
</template>
<template v-if="relationship?.muting">
<span elk-group-hover="hidden">{{ $t('account.muting') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.unmute') }}</span>
</template>
<template v-else-if="relationship ? relationship.following : context === 'following'">
<span elk-group-hover="hidden">{{ relationship?.followedBy ? $t('account.mutuals') : $t('account.following') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.unfollow') }}</span>
</template>
<template v-else-if="relationship?.requested">
<span elk-group-hover="hidden">{{ $t('account.follow_requested') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.withdraw_follow_request') }}</span>
</template>
<template v-else-if="relationship ? relationship.followedBy : context === 'followedBy'">
<span elk-group-hover="hidden">{{ $t('account.follows_you') }}</span>
<span hidden elk-group-hover="inline">{{ account.locked ? $t('account.request_follow') : $t('account.follow_back') }}</span>
</template> </template>
<template v-else> <template v-else>
<span>{{ account.locked ? $t('account.request_follow') : $t('account.follow') }}</span> <template v-if="relationship?.blocking">
<span elk-group-hover="hidden">{{ $t('account.blocking') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.unblock') }}</span>
</template>
<template v-if="relationship?.muting">
<span elk-group-hover="hidden">{{ $t('account.muting') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.unmute') }}</span>
</template>
<template v-else-if="relationship ? relationship.following : context === 'following'">
<span elk-group-hover="hidden">{{ relationship?.followedBy ? $t('account.mutuals') : $t('account.following') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.unfollow') }}</span>
</template>
<template v-else-if="relationship?.requested">
<span elk-group-hover="hidden">{{ $t('account.follow_requested') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.withdraw_follow_request') }}</span>
</template>
<template v-else-if="relationship ? relationship.followedBy : context === 'followedBy'">
<span elk-group-hover="hidden">{{ $t('account.follows_you') }}</span>
<span hidden elk-group-hover="inline">{{ account.locked ? $t('account.request_follow') : $t('account.follow_back') }}</span>
</template>
<template v-else>
<span>{{ account.locked ? $t('account.request_follow') : $t('account.follow') }}</span>
</template>
</template> </template>
</button> </button>
</template> </template>

View File

@ -25,13 +25,16 @@ function shareAccount() {
} }
async function toggleReblogs() { async function toggleReblogs() {
if (!relationship.value!.showingReblogs && await openConfirmDialog({ if (!relationship.value!.showingReblogs) {
title: t('confirm.show_reblogs.title'), const dialogChoice = await openConfirmDialog({
description: t('confirm.show_reblogs.description', [account.acct]), title: t('confirm.show_reblogs.title'),
confirm: t('confirm.show_reblogs.confirm'), description: t('confirm.show_reblogs.description', [account.acct]),
cancel: t('confirm.show_reblogs.cancel'), confirm: t('confirm.show_reblogs.confirm'),
}) !== 'confirm') cancel: t('confirm.show_reblogs.cancel'),
return })
if (dialogChoice.choice !== 'confirm')
return
}
const showingReblogs = !relationship.value?.showingReblogs const showingReblogs = !relationship.value?.showingReblogs
relationship.value = await client.value.v1.accounts.$select(account.id).follow({ reblogs: showingReblogs }) relationship.value = await client.value.v1.accounts.$select(account.id).follow({ reblogs: showingReblogs })

View File

@ -22,7 +22,7 @@ onMounted(() => {
const commandMode = computed(() => input.value.startsWith('>')) const commandMode = computed(() => input.value.startsWith('>'))
const query = computed(() => commandMode ? '' : input.value.trim()) const query = computed(() => commandMode.value ? '' : input.value.trim())
const { accounts, hashtags, loading } = useSearch(query) const { accounts, hashtags, loading } = useSearch(query)
@ -61,7 +61,7 @@ const searchResult = computed<QueryResult>(() => {
} }
}) })
const result = computed<QueryResult>(() => commandMode const result = computed<QueryResult>(() => commandMode.value
? registry.query(scopes.value.map(s => s.id).join('.'), input.value.slice(1).trim()) ? registry.query(scopes.value.map(s => s.id).join('.'), input.value.slice(1).trim())
: searchResult.value, : searchResult.value,
) )

View File

@ -4,6 +4,8 @@ defineProps<{
hover?: boolean hover?: boolean
iconChecked?: string iconChecked?: string
iconUnchecked?: string iconUnchecked?: string
checkedIconColor?: string
prependCheckbox?: boolean
}>() }>()
const modelValue = defineModel<boolean | null>() const modelValue = defineModel<boolean | null>()
</script> </script>
@ -15,9 +17,12 @@ const modelValue = defineModel<boolean | null>()
v-bind="$attrs" v-bind="$attrs"
@click.prevent="modelValue = !modelValue" @click.prevent="modelValue = !modelValue"
> >
<span v-if="label" flex-1 ms-2 pointer-events-none>{{ label }}</span> <span v-if="label && !prependCheckbox" flex-1 ms-2 pointer-events-none>{{ label }}</span>
<span <span
:class="modelValue ? (iconChecked ?? 'i-ri:checkbox-line') : (iconUnchecked ?? 'i-ri:checkbox-blank-line')" :class="[
modelValue ? (iconChecked ?? 'i-ri:checkbox-line') : (iconUnchecked ?? 'i-ri:checkbox-blank-line'),
modelValue && checkedIconColor,
]"
text-lg text-lg
aria-hidden="true" aria-hidden="true"
/> />
@ -26,6 +31,7 @@ const modelValue = defineModel<boolean | null>()
type="checkbox" type="checkbox"
sr-only sr-only
> >
<span v-if="label && prependCheckbox" flex-1 ms-2 pointer-events-none>{{ label }}</span>
</label> </label>
</template> </template>

View File

@ -68,7 +68,7 @@ async function removeList() {
actionError.value = undefined actionError.value = undefined
await nextTick() await nextTick()
if (confirmDelete === 'confirm') { if (confirmDelete.choice === 'confirm') {
await nextTick() await nextTick()
try { try {
await client.v1.lists.$select(list.value.id).remove() await client.v1.lists.$select(list.value.id).remove()
@ -92,7 +92,7 @@ async function removeList() {
async function clearError() { async function clearError() {
actionError.value = undefined actionError.value = undefined
await nextTick() await nextTick()
if (isEditing) if (isEditing.value)
input.value?.focus() input.value?.focus()
else else
deleteBtn.value?.focus() deleteBtn.value?.focus()

View File

@ -0,0 +1,45 @@
<script setup lang="ts">
const model = defineModel<number>()
const isValid = defineModel<boolean>('isValid')
const days = ref<number | ''>(0)
const hours = ref<number | ''>(1)
const minutes = ref<number | ''>(0)
watchEffect(() => {
if (days.value === '' || hours.value === '' || minutes.value === '') {
isValid.value = false
return
}
const duration
= days.value * 24 * 60 * 60
+ hours.value * 60 * 60
+ minutes.value * 60
if (duration <= 0) {
isValid.value = false
return
}
isValid.value = true
model.value = duration
})
</script>
<template>
<div flex flex-grow-0 gap-2>
<label flex items-center gap-2>
<input v-model="days" type="number" min="0" max="1999" input-base :class="!isValid ? 'input-error' : null">
{{ $t('confirm.mute_account.days', days === '' ? 0 : days) }}
</label>
<label flex items-center gap-2>
<input v-model="hours" type="number" min="0" max="24" input-base :class="!isValid ? 'input-error' : null">
{{ $t('confirm.mute_account.hours', hours === '' ? 0 : hours) }}
</label>
<label flex items-center gap-2>
<input v-model="minutes" type="number" min="0" max="59" step="5" input-base :class="!isValid ? 'input-error' : null">
{{ $t('confirm.mute_account.minute', minutes === '' ? 0 : minutes) }}
</label>
</div>
</template>

View File

@ -1,11 +1,34 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ConfirmDialogChoice, ConfirmDialogLabel } from '~/types' import type { ConfirmDialogChoice, ConfirmDialogOptions } from '~/types'
import DurationPicker from '~/components/modal/DurationPicker.vue'
defineProps<ConfirmDialogLabel>() const props = defineProps<ConfirmDialogOptions>()
const emit = defineEmits<{ const emit = defineEmits<{
(evt: 'choice', choice: ConfirmDialogChoice): void (evt: 'choice', choice: ConfirmDialogChoice): void
}>() }>()
const hasDuration = ref(false)
const isValidDuration = ref(true)
const duration = ref(60 * 60) // default to 1 hour
const shouldMuteNotifications = ref(true)
const isMute = computed(() => props.extraOptionType === 'mute')
function handleChoice(choice: ConfirmDialogChoice['choice']) {
const dialogChoice = {
choice,
...isMute.value && {
extraOptions: {
mute: {
duration: hasDuration.value ? duration.value : 0,
notifications: shouldMuteNotifications.value,
},
},
},
}
emit('choice', dialogChoice)
}
</script> </script>
<template> <template>
@ -16,11 +39,17 @@ const emit = defineEmits<{
<div v-if="description"> <div v-if="description">
{{ description }} {{ description }}
</div> </div>
<div v-if="isMute" flex-col flex gap-4>
<CommonCheckbox v-model="hasDuration" :label="$t('confirm.mute_account.specify_duration')" prepend-checkbox checked-icon-color="text-primary" />
<DurationPicker v-if="hasDuration" v-model="duration" v-model:is-valid="isValidDuration" />
<CommonCheckbox v-model="shouldMuteNotifications" :label="$t('confirm.mute_account.notifications')" prepend-checkbox checked-icon-color="text-primary" />
</div>
<div flex justify-end gap-2> <div flex justify-end gap-2>
<button btn-text @click="emit('choice', 'cancel')"> <button btn-text @click="handleChoice('cancel')">
{{ cancel || $t('confirm.common.cancel') }} {{ cancel || $t('confirm.common.cancel') }}
</button> </button>
<button btn-solid @click="emit('choice', 'confirm')"> <button btn-solid :disabled="!isValidDuration" @click="handleChoice('confirm')">
{{ confirm || $t('confirm.common.confirm') }} {{ confirm || $t('confirm.common.confirm') }}
</button> </button>
</div> </div>

View File

@ -1,8 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
// only one icon can be lit up at the same time // only one icon can be lit up at the same time
import { STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE } from '~/constants'
const moreMenuVisible = ref(false) const moreMenuVisible = ref(false)
const { notifications } = useNotifications() const { notifications } = useNotifications()
const lastAccessedNotificationRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE, '')
const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '')
</script> </script>
<template> <template>
@ -19,7 +23,7 @@ const { notifications } = useNotifications()
<NuxtLink to="/search" :aria-label="$t('nav.search')" :active-class="moreMenuVisible ? '' : 'text-primary'" flex flex-row items-center place-content-center h-full flex-1 class="coarse-pointer:select-none" @click="$scrollToTop"> <NuxtLink to="/search" :aria-label="$t('nav.search')" :active-class="moreMenuVisible ? '' : 'text-primary'" flex flex-row items-center place-content-center h-full flex-1 class="coarse-pointer:select-none" @click="$scrollToTop">
<div i-ri:search-line /> <div i-ri:search-line />
</NuxtLink> </NuxtLink>
<NuxtLink to="/notifications" :aria-label="$t('nav.notifications')" :active-class="moreMenuVisible ? '' : 'text-primary'" flex flex-row items-center place-content-center h-full flex-1 class="coarse-pointer:select-none" @click="$scrollToTop"> <NuxtLink :to="`/notifications/${lastAccessedNotificationRoute}`" :aria-label="$t('nav.notifications')" :active-class="moreMenuVisible ? '' : 'text-primary'" flex flex-row items-center place-content-center h-full flex-1 class="coarse-pointer:select-none" @click="$scrollToTop">
<div flex relative> <div flex relative>
<div class="i-ri:notification-4-line" text-xl /> <div class="i-ri:notification-4-line" text-xl />
<div v-if="notifications" class="top-[-0.3rem] right-[-0.3rem]" absolute font-bold rounded-full h-4 w-4 text-xs bg-primary text-inverted flex items-center justify-center> <div v-if="notifications" class="top-[-0.3rem] right-[-0.3rem]" absolute font-bold rounded-full h-4 w-4 text-xs bg-primary text-inverted flex items-center justify-center>
@ -32,7 +36,7 @@ const { notifications } = useNotifications()
</NuxtLink> </NuxtLink>
</template> </template>
<template v-else> <template v-else>
<NuxtLink :to="`/${currentServer}/explore`" :aria-label="$t('nav.explore')" :active-class="moreMenuVisible ? '' : 'text-primary'" flex flex-row items-center place-content-center h-full flex-1 class="coarse-pointer:select-none" @click="$scrollToTop"> <NuxtLink :to="`/${currentServer}/explore/${lastAccessedExploreRoute}`" :aria-label="$t('nav.explore')" :active-class="moreMenuVisible ? '' : 'text-primary'" flex flex-row items-center place-content-center h-full flex-1 class="coarse-pointer:select-none" @click="$scrollToTop">
<div i-ri:compass-3-line /> <div i-ri:compass-3-line />
</NuxtLink> </NuxtLink>
<NuxtLink group :to="`/${currentServer}/public/local`" :aria-label="$t('nav.local')" :active-class="moreMenuVisible ? '' : 'text-primary'" flex flex-row items-center place-content-center h-full flex-1 class="coarse-pointer:select-none" @click="$scrollToTop"> <NuxtLink group :to="`/${currentServer}/public/local`" :aria-label="$t('nav.local')" :active-class="moreMenuVisible ? '' : 'text-primary'" flex flex-row items-center place-content-center h-full flex-1 class="coarse-pointer:select-none" @click="$scrollToTop">

View File

@ -1,9 +1,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE } from '~/constants'
const { command } = defineProps<{ const { command } = defineProps<{
command?: boolean command?: boolean
}>() }>()
const { notifications } = useNotifications() const { notifications } = useNotifications()
const useStarFavoriteIcon = usePreferences('useStarFavoriteIcon') const useStarFavoriteIcon = usePreferences('useStarFavoriteIcon')
const lastAccessedNotificationRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE, '')
const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '')
</script> </script>
<template> <template>
@ -12,7 +16,7 @@ const useStarFavoriteIcon = usePreferences('useStarFavoriteIcon')
<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" icon="i-ri:notification-4-line" user-only :command="command"> <NavSideItem :text="$t('nav.notifications')" :to="`/notifications/${lastAccessedNotificationRoute}`" 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 />
@ -30,7 +34,7 @@ const useStarFavoriteIcon = usePreferences('useStarFavoriteIcon')
<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` : '/explore'" icon="i-ri:compass-3-line" :command="command" /> <NavSideItem :text="$t('nav.explore')" :to="isHydrated ? `/${currentServer}/explore/${lastAccessedExploreRoute}` : `/explore/${lastAccessedExploreRoute}`" 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

@ -57,11 +57,21 @@ const noUserVisual = computed(() => isHydrated.value && props.userOnly && !curre
<div <div
class="item" class="item"
flex items-center gap4 flex items-center gap4
w-fit rounded-3
px2 mx3 sm:mxa
xl="ml0 mr5 px5 w-auto" xl="ml0 mr5 px5 w-auto"
transition-100 :class="isSmallScreen
elk-group-hover="bg-active" group-focus-visible:ring="2 current" ? `
w-full
px5 sm:mxa
transition-colors duration-200 transform
hover-bg-gray-100 hover-dark:(bg-gray-700 text-white)
` : `
w-fit rounded-3
px2 mx3 sm:mxa
transition-100
elk-group-hover-bg-active
group-focus-visible:ring-2
group-focus-visible:ring-current
`"
> >
<slot name="icon"> <slot name="icon">
<div :class="icon" text-xl /> <div :class="icon" text-xl />

View File

@ -4,6 +4,13 @@ import type { mastodon } from 'masto'
const { notification } = defineProps<{ const { notification } = defineProps<{
notification: mastodon.v1.Notification notification: mastodon.v1.Notification
}>() }>()
const { t } = useI18n()
// well-known emoji reactions types Elk does not support yet
const unsupportedEmojiReactionTypes = ['pleroma:emoji_reaction', 'reaction']
if (unsupportedEmojiReactionTypes.includes(notification.type))
console.warn(`[DEV] ${t('notification.missing_type')} '${notification.type}' (notification.id: ${notification.id})`)
</script> </script>
<template> <template>
@ -88,7 +95,8 @@ const { notification } = defineProps<{
<template v-else-if="notification.type === 'mention' || notification.type === 'poll' || notification.type === 'status'"> <template v-else-if="notification.type === 'mention' || notification.type === 'poll' || notification.type === 'status'">
<StatusCard :status="notification.status!" /> <StatusCard :status="notification.status!" />
</template> </template>
<template v-else> <template v-else-if="!unsupportedEmojiReactionTypes.includes(notification.type)">
<!-- prevent showing errors for dev for known emoji reaction types -->
<!-- type 'favourite' and 'reblog' should always rendered by NotificationGroupedLikes --> <!-- type 'favourite' and 'reblog' should always rendered by NotificationGroupedLikes -->
<div text-red font-bold> <div text-red font-bold>
[DEV] {{ $t('notification.missing_type') }} '{{ notification.type }}' [DEV] {{ $t('notification.missing_type') }} '{{ notification.type }}'

View File

@ -138,7 +138,7 @@ const characterCount = computed(() => {
length -= fullMatch.length - (before + username).length - 1 // - 1 for the @ length -= fullMatch.length - (before + username).length - 1 // - 1 for the @
if (draft.value.mentions) { if (draft.value.mentions) {
// + 1 is needed as mentions always need a space seperator at the end // + 1 is needed as mentions always need a space separator at the end
length += draft.value.mentions.map((mention) => { length += draft.value.mentions.map((mention) => {
const [handle] = mention.split('@') const [handle] = mention.split('@')
return `@${handle}` return `@${handle}`

View File

@ -62,12 +62,13 @@ async function shareLink(status: mastodon.v1.Status) {
} }
async function deleteStatus() { async function deleteStatus() {
if (await openConfirmDialog({ const confirmDelete = await openConfirmDialog({
title: t('confirm.delete_posts.title'), title: t('confirm.delete_posts.title'),
description: t('confirm.delete_posts.description'), description: t('confirm.delete_posts.description'),
confirm: t('confirm.delete_posts.confirm'), confirm: t('confirm.delete_posts.confirm'),
cancel: t('confirm.delete_posts.cancel'), cancel: t('confirm.delete_posts.cancel'),
}) !== 'confirm') })
if (confirmDelete.choice !== 'confirm')
return return
removeCachedStatus(status.value.id) removeCachedStatus(status.value.id)
@ -80,12 +81,13 @@ async function deleteStatus() {
} }
async function deleteAndRedraft() { async function deleteAndRedraft() {
if (await openConfirmDialog({ const confirmDelete = await openConfirmDialog({
title: t('confirm.delete_posts.title'), title: t('confirm.delete_posts.title'),
description: t('confirm.delete_posts.description'), description: t('confirm.delete_posts.description'),
confirm: t('confirm.delete_posts.confirm'), confirm: t('confirm.delete_posts.confirm'),
cancel: t('confirm.delete_posts.cancel'), cancel: t('confirm.delete_posts.cancel'),
}) !== 'confirm') })
if (confirmDelete.choice !== 'confirm')
return return
if (import.meta.dev) { if (import.meta.dev) {

View File

@ -1,18 +1,27 @@
<script setup lang="ts"> <script setup lang="ts">
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
import { STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE } from '~/constants'
const { filter } = defineProps<{ const { filter } = defineProps<{
filter?: mastodon.v1.NotificationType filter?: mastodon.v1.NotificationType
}>() }>()
const route = useRoute()
const lastAccessedNotificationRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE, '')
const options = { limit: 30, types: filter ? [filter] : [] } const options = { limit: 30, types: filter ? [filter] : [] }
// Default limit is 20 notifications, and servers are normally caped to 30 // Default limit is 20 notifications, and servers are normally caped to 30
const paginator = useMastoClient().v1.notifications.list(options) const paginator = useMastoClient().v1.notifications.list(options)
const stream = useStreaming(client => client.user.notification.subscribe()) const stream = useStreaming(client => client.user.notification.subscribe())
lastAccessedNotificationRoute.value = route.path.replace(/\/notifications\/?/, '')
const { clearNotifications } = useNotifications() const { clearNotifications } = useNotifications()
onActivated(clearNotifications) onActivated(() => {
clearNotifications()
lastAccessedNotificationRoute.value = route.path.replace(/\/notifications\/?/, '')
})
</script> </script>
<template> <template>

View File

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
const paginator = useMastoClient().v1.timelines.public.list({ limit: 30, local: true }) const paginator = useMastoClient().v1.timelines.public.list({ limit: 30, local: true })
const stream = useStreaming(client => client.direct.subscribe()) const stream = useStreaming(client => client.public.local.subscribe())
</script> </script>
<template> <template>

View File

@ -72,7 +72,7 @@ function onEnter(e: KeyboardEvent) {
} }
function escapeAutocomplete(evt: KeyboardEvent) { function escapeAutocomplete(evt: KeyboardEvent) {
if (!autocompleteShow) if (!autocompleteShow.value)
return return
autocompleteShow.value = false autocompleteShow.value = false
evt.stopPropagation() evt.stopPropagation()

View File

@ -1,9 +1,9 @@
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
import type { ConfirmDialogChoice, ConfirmDialogLabel, Draft, ErrorDialogData } from '~/types' import type { ConfirmDialogChoice, ConfirmDialogOptions, Draft, ErrorDialogData } from '~/types'
import { STORAGE_KEY_FIRST_VISIT } from '~/constants' import { STORAGE_KEY_FIRST_VISIT } from '~/constants'
export const confirmDialogChoice = ref<ConfirmDialogChoice>() export const confirmDialogChoice = ref<ConfirmDialogChoice>()
export const confirmDialogLabel = ref<ConfirmDialogLabel>() export const confirmDialogLabel = ref<ConfirmDialogOptions>()
export const errorDialogData = ref<ErrorDialogData>() export const errorDialogData = ref<ErrorDialogData>()
export const mediaPreviewList = ref<mastodon.v1.MediaAttachment[]>([]) export const mediaPreviewList = ref<mastodon.v1.MediaAttachment[]>([])
@ -39,7 +39,7 @@ export function openSigninDialog() {
isSigninDialogOpen.value = true isSigninDialogOpen.value = true
} }
export async function openConfirmDialog(label: ConfirmDialogLabel | string): Promise<ConfirmDialogChoice> { export async function openConfirmDialog(label: ConfirmDialogOptions | string): Promise<ConfirmDialogChoice> {
confirmDialogLabel.value = typeof label === 'string' ? { title: label } : label confirmDialogLabel.value = typeof label === 'string' ? { title: label } : label
confirmDialogChoice.value = undefined confirmDialogChoice.value = undefined
isConfirmDialogOpen.value = true isConfirmDialogOpen.value = true

View File

@ -11,9 +11,12 @@ let timeoutHandle: NodeJS.Timeout | undefined
export function useRelationship(account: mastodon.v1.Account): Ref<mastodon.v1.Relationship | undefined> { export function useRelationship(account: mastodon.v1.Account): Ref<mastodon.v1.Relationship | undefined> {
if (!currentUser.value) if (!currentUser.value)
return ref() return ref()
let relationship = requestedRelationships.get(account.id) let relationship = requestedRelationships.get(account.id)
if (relationship) if (relationship)
return relationship return relationship
// allow batch relationship requests
relationship = ref<mastodon.v1.Relationship | undefined>() relationship = ref<mastodon.v1.Relationship | undefined>()
requestedRelationships.set(account.id, relationship) requestedRelationships.set(account.id, relationship)
if (timeoutHandle) if (timeoutHandle)
@ -22,14 +25,19 @@ export function useRelationship(account: mastodon.v1.Account): Ref<mastodon.v1.R
timeoutHandle = undefined timeoutHandle = undefined
fetchRelationships() fetchRelationships()
}, 100) }, 100)
return relationship return relationship
} }
async function fetchRelationships() { async function fetchRelationships() {
const requested = Array.from(requestedRelationships.entries()).filter(([, r]) => !r.value) const requested = Array.from(requestedRelationships.entries()).filter(([, r]) => !r.value)
const relationships = await useMastoClient().v1.accounts.relationships.fetch({ id: requested.map(([id]) => id) }) const relationships = await useMastoClient().v1.accounts.relationships.fetch({ id: requested.map(([id]) => id) })
for (let i = 0; i < requested.length; i++) for (const relationship of relationships) {
requested[i][1].value = relationships[i] const requestedToUpdate = requested.find(([id]) => id === relationship.id)
if (!requestedToUpdate)
continue
requestedToUpdate[1].value = relationship
}
} }
export async function toggleFollowAccount(relationship: mastodon.v1.Relationship, account: mastodon.v1.Account) { export async function toggleFollowAccount(relationship: mastodon.v1.Relationship, account: mastodon.v1.Account) {
@ -39,12 +47,13 @@ export async function toggleFollowAccount(relationship: mastodon.v1.Relationship
const unfollow = relationship!.following || relationship!.requested const unfollow = relationship!.following || relationship!.requested
if (unfollow) { if (unfollow) {
if (await openConfirmDialog({ const confirmUnfollow = await openConfirmDialog({
title: i18n.t('confirm.unfollow.title'), title: i18n.t('confirm.unfollow.title'),
description: i18n.t('confirm.unfollow.description', [`@${account.acct}`]), description: i18n.t('confirm.unfollow.description', [`@${account.acct}`]),
confirm: i18n.t('confirm.unfollow.confirm'), confirm: i18n.t('confirm.unfollow.confirm'),
cancel: i18n.t('confirm.unfollow.cancel'), cancel: i18n.t('confirm.unfollow.cancel'),
}) !== 'confirm') })
if (confirmUnfollow.choice !== 'confirm')
return return
} }
@ -66,18 +75,28 @@ export async function toggleMuteAccount(relationship: mastodon.v1.Relationship,
const { client } = useMasto() const { client } = useMasto()
const i18n = useNuxtApp().$i18n const i18n = useNuxtApp().$i18n
if (!relationship!.muting && await openConfirmDialog({ let duration = 0 // default 0 == indefinite
title: i18n.t('confirm.mute_account.title'), let notifications = true // default true = mute notifications
description: i18n.t('confirm.mute_account.description', [account.acct]), if (!relationship!.muting) {
confirm: i18n.t('confirm.mute_account.confirm'), const confirmMute = await openConfirmDialog({
cancel: i18n.t('confirm.mute_account.cancel'), title: i18n.t('confirm.mute_account.title'),
}) !== 'confirm') description: i18n.t('confirm.mute_account.description', [account.acct]),
return confirm: i18n.t('confirm.mute_account.confirm'),
cancel: i18n.t('confirm.mute_account.cancel'),
extraOptionType: 'mute',
})
if (confirmMute.choice !== 'confirm')
return
duration = confirmMute.extraOptions!.mute.duration
notifications = confirmMute.extraOptions!.mute.notifications
}
relationship!.muting = !relationship!.muting relationship!.muting = !relationship!.muting
relationship = relationship!.muting relationship = relationship!.muting
? await client.value.v1.accounts.$select(account.id).mute({ ? await client.value.v1.accounts.$select(account.id).mute({
// TODO support more options duration,
notifications,
}) })
: await client.value.v1.accounts.$select(account.id).unmute() : await client.value.v1.accounts.$select(account.id).unmute()
} }
@ -86,13 +105,16 @@ export async function toggleBlockAccount(relationship: mastodon.v1.Relationship,
const { client } = useMasto() const { client } = useMasto()
const i18n = useNuxtApp().$i18n const i18n = useNuxtApp().$i18n
if (!relationship!.blocking && await openConfirmDialog({ if (!relationship!.blocking) {
title: i18n.t('confirm.block_account.title'), const confirmBlock = await openConfirmDialog({
description: i18n.t('confirm.block_account.description', [account.acct]), title: i18n.t('confirm.block_account.title'),
confirm: i18n.t('confirm.block_account.confirm'), description: i18n.t('confirm.block_account.description', [account.acct]),
cancel: i18n.t('confirm.block_account.cancel'), confirm: i18n.t('confirm.block_account.confirm'),
}) !== 'confirm') cancel: i18n.t('confirm.block_account.cancel'),
return })
if (confirmBlock.choice !== 'confirm')
return
}
relationship!.blocking = !relationship!.blocking relationship!.blocking = !relationship!.blocking
relationship = await client.value.v1.accounts.$select(account.id)[relationship!.blocking ? 'block' : 'unblock']() relationship = await client.value.v1.accounts.$select(account.id)[relationship!.blocking ? 'block' : 'unblock']()
@ -102,13 +124,16 @@ export async function toggleBlockDomain(relationship: mastodon.v1.Relationship,
const { client } = useMasto() const { client } = useMasto()
const i18n = useNuxtApp().$i18n const i18n = useNuxtApp().$i18n
if (!relationship!.domainBlocking && await openConfirmDialog({ if (!relationship!.domainBlocking) {
title: i18n.t('confirm.block_domain.title'), const confirmDomainBlock = await openConfirmDialog({
description: i18n.t('confirm.block_domain.description', [getServerName(account)]), title: i18n.t('confirm.block_domain.title'),
confirm: i18n.t('confirm.block_domain.confirm'), description: i18n.t('confirm.block_domain.description', [getServerName(account)]),
cancel: i18n.t('confirm.block_domain.cancel'), confirm: i18n.t('confirm.block_domain.confirm'),
}) !== 'confirm') cancel: i18n.t('confirm.block_domain.cancel'),
return })
if (confirmDomainBlock.choice !== 'confirm')
return
}
relationship!.domainBlocking = !relationship!.domainBlocking relationship!.domainBlocking = !relationship!.domainBlocking
await client.value.v1.domainBlocks[relationship!.domainBlocking ? 'create' : 'remove']({ domain: getServerName(account) }) await client.value.v1.domainBlocks[relationship!.domainBlocking ? 'create' : 'remove']({ domain: getServerName(account) })

View File

@ -59,11 +59,11 @@ export function useSearch(query: MaybeRefOrGetter<string>, options: UseSearchOpt
} }
watch(() => resolveUnref(query), () => { watch(() => resolveUnref(query), () => {
loading.value = !!(q && isHydrated.value) loading.value = !!(q.value && isHydrated.value)
}) })
debouncedWatch(() => resolveUnref(query), async () => { debouncedWatch(() => resolveUnref(query), async () => {
if (!q || !isHydrated.value) if (!q.value || !isHydrated.value)
return return
loading.value = true loading.value = true
@ -87,7 +87,7 @@ export function useSearch(query: MaybeRefOrGetter<string>, options: UseSearchOpt
}, { debounce: 300 }) }, { debounce: 300 })
const next = async () => { const next = async () => {
if (!q || !isHydrated.value || !paginator) if (!q.value || !isHydrated.value || !paginator)
return return
loading.value = true loading.value = true

View File

@ -64,7 +64,7 @@ export function usePushManager() {
policy?: mastodon.v1.WebPushSubscriptionPolicy, policy?: mastodon.v1.WebPushSubscriptionPolicy,
force?: boolean, force?: boolean,
): Promise<SubscriptionResult> => { ): Promise<SubscriptionResult> => {
if (!isSupported) if (!isSupported.value)
return 'not-supported' return 'not-supported'
if (!currentUser.value) if (!currentUser.value)
@ -112,7 +112,7 @@ export function usePushManager() {
} }
const unsubscribe = async () => { const unsubscribe = async () => {
if (!isSupported || !isSubscribed || !currentUser.value) if (!isSupported.value || !isSubscribed.value || !currentUser.value)
return false return false
await removePushNotifications(currentUser.value) await removePushNotifications(currentUser.value)

View File

@ -2,5 +2,6 @@ import { breakpointsTailwind } from '@vueuse/core'
export const breakpoints = useBreakpoints(breakpointsTailwind) export const breakpoints = useBreakpoints(breakpointsTailwind)
export const isSmallScreen = breakpoints.smallerOrEqual('sm')
export const isMediumOrLargeScreen = breakpoints.between('sm', 'xl') export const isMediumOrLargeScreen = breakpoints.between('sm', 'xl')
export const isExtraLargeScreen = breakpoints.smallerOrEqual('xl') export const isExtraLargeScreen = breakpoints.smallerOrEqual('xl')

View File

@ -55,11 +55,17 @@ export function useTiptap(options: UseTiptapOptions) {
}, },
}), }),
Mention.configure({ Mention.configure({
renderHTML({ options, node }) {
return ['span', { 'data-type': 'mention', 'data-id': node.attrs.id }, `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`]
},
suggestion: TiptapMentionSuggestion, suggestion: TiptapMentionSuggestion,
}), }),
Mention Mention
.extend({ name: 'hashtag' }) .extend({ name: 'hashtag' })
.configure({ .configure({
renderHTML({ options, node }) {
return ['span', { 'data-type': 'hashtag', 'data-id': node.attrs.id }, `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`]
},
suggestion: TiptapHashtagSuggestion, suggestion: TiptapHashtagSuggestion,
}), }),
Mention Mention

View File

@ -22,7 +22,16 @@ export const STORAGE_KEY_HIDE_EXPLORE_TAGS_TIPS = 'elk-hide-explore-tags-tips'
export const STORAGE_KEY_NOTIFICATION = 'elk-notification' export const STORAGE_KEY_NOTIFICATION = 'elk-notification'
export const STORAGE_KEY_NOTIFICATION_POLICY = 'elk-notification-policy' export const STORAGE_KEY_NOTIFICATION_POLICY = 'elk-notification-policy'
export const STORAGE_KEY_PWA_HIDE_INSTALL = 'elk-pwa-hide-install' export const STORAGE_KEY_PWA_HIDE_INSTALL = 'elk-pwa-hide-install'
export const STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE = 'elk-last-accessed-notification-route'
export const STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE = 'elk-last-accessed-explore-route'
export const HANDLED_MASTO_URLS = /^(https?:\/\/)?([\w\d-]+\.)+\w+\/(@[@\w\d-\.]+)(\/objects)?(\/\d+)?$/ export const HANDLED_MASTO_URLS = /^(https?:\/\/)?([\w\d-]+\.)+\w+\/(@[@\w\d-\.]+)(\/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']
export const THEME_COLORS = {
themeDark: '#111111',
themeLight: '#fafafa',
backgroundDark: '#fafafa',
backgroundLight: '#111111',
} as const

View File

@ -1,3 +1,8 @@
export default defineNuxtConfig({ export default defineNuxtConfig({
extends: '@nuxt-themes/docus', extends: '@nuxt-themes/docus',
vite: {
optimizeDeps: {
include: ['scule'],
},
},
}) })

View File

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

18
fly.toml Normal file
View File

@ -0,0 +1,18 @@
# fly.toml app configuration file generated for elk on 2023-07-15T00:09:39+02:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#
app = "elk"
primary_region = "ams"
[http_service]
internal_port = 5314
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
[mounts]
source="elkdata"
destination="/elk/data"

View File

@ -87,7 +87,6 @@
"activate": "چالاککردن", "activate": "چالاککردن",
"complete": "تەواو", "complete": "تەواو",
"compose_desc": "نووسینی بابەتێکی نوێ", "compose_desc": "نووسینی بابەتێکی نوێ",
"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}",
@ -162,7 +161,6 @@
}, },
"error": { "error": {
"account_not_found": "هەژمار {0} نەدۆزرایەوە", "account_not_found": "هەژمار {0} نەدۆزرایەوە",
"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": "بابەت نەدۆزرایەوە",
@ -308,8 +306,7 @@
"content_warning": "لێرەدا هۆشدارییەکەت بنووسە", "content_warning": "لێرەدا هۆشدارییەکەت بنووسە",
"default_1": "چی لە مێشکتدایە؟", "default_1": "چی لە مێشکتدایە؟",
"reply_to_account": "وەڵامی {0}", "reply_to_account": "وەڵامی {0}",
"replying": "وەڵامدانەوە", "replying": "وەڵامدانەوە"
"the_thread": "تارەکە"
}, },
"polls": { "polls": {
"allow_multiple": "ڕێگە بە چەندین هەڵبژاردن بدە", "allow_multiple": "ڕێگە بە چەندین هەڵبژاردن بدە",
@ -546,11 +543,6 @@
"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_error": "سنوور بۆ هەر بابەتێک تێپەڕی",
@ -572,7 +564,6 @@
"edited": "{0} دەستکاریکراو", "edited": "{0} دەستکاریکراو",
"favourited_by": "پەسەندکراوە لەلایەن", "favourited_by": "پەسەندکراوە لەلایەن",
"filter_hidden_phrase": "پاڵێوراوە لەلایەن", "filter_hidden_phrase": "پاڵێوراوە لەلایەن",
"filter_removed_phrase": "لابردن بە پاڵێو",
"filter_show_anyway": "بەهەر حاڵ پیشان بدە", "filter_show_anyway": "بەهەر حاڵ پیشان بدە",
"img_alt": { "img_alt": {
"ALT": "ALT", "ALT": "ALT",
@ -585,7 +576,6 @@
"ends": "کۆتایی بە {0} دێت", "ends": "کۆتایی بە {0} دێت",
"finished": "تەواو بوو {0}" "finished": "تەواو بوو {0}"
}, },
"reblogged": "{0} دووبارەی کردەوە",
"replying_to": "وەڵامدانەوەی {0}", "replying_to": "وەڵامدانەوەی {0}",
"show_full_thread": "تەوەرەی تەواو پیشان بدە", "show_full_thread": "تەوەرەی تەواو پیشان بدە",
"someone": "کەسێک", "someone": "کەسێک",

View File

@ -149,7 +149,12 @@
"mute_account": { "mute_account": {
"cancel": "Cancel", "cancel": "Cancel",
"confirm": "Mute", "confirm": "Mute",
"days": "days|day|days",
"description": "Are you sure you want to mute {0}?", "description": "Are you sure you want to mute {0}?",
"hours": "hours|hour|hours",
"minute": "minutes|minute|minutes",
"notifications": "Mute notifications",
"specify_duration": "Specify mute duration",
"title": "Mute account" "title": "Mute account"
}, },
"show_reblogs": { "show_reblogs": {

View File

@ -149,7 +149,12 @@
"mute_account": { "mute_account": {
"cancel": "Cancelar", "cancel": "Cancelar",
"confirm": "Silenciar", "confirm": "Silenciar",
"days": "días|día|días",
"description": "¿Estás seguro que quieres silenciar a {0}?", "description": "¿Estás seguro que quieres silenciar a {0}?",
"hours": "horas|hora|horas",
"minute": "minutos|minuto|minutos",
"notifications": "Silenciar notificaciones",
"specify_duration": "Especificar la duración del silenciado",
"title": "Silenciar cuenta" "title": "Silenciar cuenta"
}, },
"show_reblogs": { "show_reblogs": {

View File

@ -149,7 +149,12 @@
"mute_account": { "mute_account": {
"cancel": "Utzi", "cancel": "Utzi",
"confirm": "Mututu", "confirm": "Mututu",
"days": "egun|egun|egun",
"description": "Ziur {0} mututu nahi duzula?", "description": "Ziur {0} mututu nahi duzula?",
"hours": "ordu|ordu|ordu",
"minute": "minutu|minutu|minutu",
"notifications": "Mututu jakinarazpenak",
"specify_duration": "Zehaztu mututzearen iraupena",
"title": "Mututu kontua" "title": "Mututu kontua"
}, },
"show_reblogs": { "show_reblogs": {
@ -228,16 +233,27 @@
"compose": "Idatzi", "compose": "Idatzi",
"favourite": "Egin gogoko", "favourite": "Egin gogoko",
"search": "Bilatu", "search": "Bilatu",
"show_new_items": "Erakutsi elementu berriak",
"title": "Ekintzak" "title": "Ekintzak"
}, },
"media": { "media": {
"title": "Multimedia" "title": "Multimedia"
}, },
"navigation": { "navigation": {
"go_to_bookmarks": "Laster-markak",
"go_to_conversations": "Elkarrizketak",
"go_to_explore": "Arakatu",
"go_to_favourites": "Gogokoak",
"go_to_federated": "Federatua",
"go_to_home": "Hasiera", "go_to_home": "Hasiera",
"go_to_lists": "Zerrendak",
"go_to_local": "Lokala",
"go_to_notifications": "Jakinarazpenak", "go_to_notifications": "Jakinarazpenak",
"next_status": "Hurrengo egoera", "go_to_profile": "Profila",
"previous_status": "Aurreko egoera", "go_to_search": "Bilatu",
"go_to_settings": "Ezarpenak",
"next_status": "Hurrengo bidalketa",
"previous_status": "Aurreko bidalketa",
"shortcut_help": "Laster-teklak", "shortcut_help": "Laster-teklak",
"title": "Nabigazioa" "title": "Nabigazioa"
} }
@ -293,6 +309,7 @@
"explore": "Arakatu", "explore": "Arakatu",
"favourites": "Gogokoak", "favourites": "Gogokoak",
"federated": "Federatua", "federated": "Federatua",
"hashtags": "Traolak",
"home": "Hasiera", "home": "Hasiera",
"list": "Zerrenda", "list": "Zerrenda",
"lists": "Zerrendak", "lists": "Zerrendak",
@ -304,22 +321,22 @@
"search": "Bilaketa", "search": "Bilaketa",
"select_feature_flags": "Aldatu ezaugarrien adierazleak (Toggle Feature Flags)", "select_feature_flags": "Aldatu ezaugarrien adierazleak (Toggle Feature Flags)",
"select_font_size": "Letra-tipoaren tamaina", "select_font_size": "Letra-tipoaren tamaina",
"select_language": "Hizkuntza", "select_language": "Interfazearen hizkuntza",
"settings": "Ezarpenak", "settings": "Ezarpenak",
"show_intro": "Erakutsi aurkezpena", "show_intro": "Erakutsi aurkezpena",
"toggle_theme": "Gai argia/iluna", "toggle_theme": "Gai argia/iluna",
"zen_mode": "ZEN modua" "zen_mode": "ZEN modua"
}, },
"notification": { "notification": {
"favourited_post": "zure bidalketa gogoko egin du", "favourited_post": "(e)k zure bidalketa gogoko egin du",
"followed_you": "(e)k jarraitu dizu", "followed_you": "(e)k jarraitu dizu",
"followed_you_count": "{0} pertsonak jarraitu dizute|pertsona {0}ek jarraitu dizu|{0} pertsonak jarraitu dizute", "followed_you_count": "{0} pertsonak jarraitu dizute|pertsona {0}ek jarraitu dizu|{0} pertsonak jarraitu dizute",
"missing_type": "MISSING notification.type:", "missing_type": "MISSING notification.type:",
"reblogged_post": "zure bidalketari bultzada eman dio", "reblogged_post": "(e)k zure bidalketari bultzada eman dio",
"reported": "{0}(e)k {1} salatu du", "reported": "{0}(e)k {1} salatu du",
"request_to_follow": "jarraipen-eskaera bidali dizu", "request_to_follow": "(e)k jarraipen-eskaera bidali dizu",
"signed_up": "izena eman du", "signed_up": "(e)k izena eman du",
"update_status": "bidalketa eguneratu du" "update_status": "(e)k bidalketa eguneratu du"
}, },
"placeholder": { "placeholder": {
"content_warning": "Idatzi oharra hemen", "content_warning": "Idatzi oharra hemen",
@ -374,7 +391,7 @@
} }
}, },
"report": { "report": {
"additional_comments": "Ohar gehigarriak", "additional_comments": "Iruzkin gehigarriak",
"another_server": "Salatzen ari zaren erabiltzailea beste zerbitzari batekoa da", "another_server": "Salatzen ari zaren erabiltzailea beste zerbitzari batekoa da",
"anything_else": "Ba al dago jakin beharko genukeen beste ezer?", "anything_else": "Ba al dago jakin beharko genukeen beste ezer?",
"block_desc": "Ez duzu erabiltzaile honen bidalketarik ikusiko. Ezin izango ditu zure bidalketak ikusi edo zuri jarraitu. Blokeatu duzula jakingo du.", "block_desc": "Ez duzu erabiltzaile honen bidalketarik ikusiko. Ezin izango ditu zure bidalketak ikusi edo zuri jarraitu. Blokeatu duzula jakingo du.",
@ -395,10 +412,10 @@
"limiting": "Mugatu {0}", "limiting": "Mugatu {0}",
"mute_desc": "Ez duzu erabiltzaile honen bidalketarik ikusiko. Zure bidalketak ikusi eta zuri jarraitu diezazuke. Ez du jakingo mututu duzunik.", "mute_desc": "Ez duzu erabiltzaile honen bidalketarik ikusiko. Zure bidalketak ikusi eta zuri jarraitu diezazuke. Ez du jakingo mututu duzunik.",
"other": "Beste zerbait da", "other": "Beste zerbait da",
"other_desc": "Arazoa ez da beste kategorietan sartzen", "other_desc": "Arazoa ez dator bat beste kategoriekin",
"reporting": "{0} salatzen", "reporting": "{0} salatzen",
"select_many": "Hautatu bat datozen guztiak:", "select_many": "Hautatu dagozkion guztiak:",
"select_one": "Aukeratu hobekien datorrena:", "select_one": "Aukeratu hobekien doakiona:",
"select_posts": "Salaketa hau sostengatzen duen bidalketarik al dago?", "select_posts": "Salaketa hau sostengatzen duen bidalketarik al dago?",
"select_posts_other": "Ba al dago salaketa sostengatzen duen beste bidalketarik?", "select_posts_other": "Ba al dago salaketa sostengatzen duen beste bidalketarik?",
"spam": "Spama da", "spam": "Spama da",
@ -441,9 +458,9 @@
"theme_color": "Gaiaren kolorea" "theme_color": "Gaiaren kolorea"
}, },
"language": { "language": {
"display_language": "Hizkuntza", "display_language": "Interfazearen hizkuntza",
"label": "Hizkuntza", "label": "Hizkuntza",
"post_language": "Argitalpenaren 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",
@ -518,13 +535,14 @@
"github_cards": "GitHub txartelak", "github_cards": "GitHub txartelak",
"github_cards_description": "GitHub-eko esteka argitaratzean, HTML txartel irisgarri bat erakusten du gizarte-grafikoaren metadatuak erabiliz, irudi sozialaren ordez.", "github_cards_description": "GitHub-eko esteka argitaratzean, HTML txartel irisgarri bat erakusten du gizarte-grafikoaren metadatuak erabiliz, irudi sozialaren ordez.",
"grayscale_mode": "Gris modua", "grayscale_mode": "Gris modua",
"hide_account_hover_card": "Ezkutatu kontuaren geruza (Hide account hover card)", "hide_account_hover_card": "Ezkutatu kontuen aurrebista-txartelak sagua gainetik pasatzean",
"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 jarraitzaile kopurua",
"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_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.",
@ -537,7 +555,7 @@
"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 xagua gainean jarri arte. Denbora-lerroko elementu batzuk ere ezkutatzen ditu."
}, },
"profile": { "profile": {
@ -585,7 +603,7 @@
}, },
"status": { "status": {
"account": { "account": {
"suspended_message": "Argitalpen honen egileari zigorra jarri zaio.", "suspended_message": "Bidalketa honen egileari zigorra jarri zaio.",
"suspended_show": "Erakutsi edukia hala ere?" "suspended_show": "Erakutsi edukia hala ere?"
}, },
"boosted_by": "Bultzatu dute:", "boosted_by": "Bultzatu dute:",

View File

@ -247,7 +247,6 @@
"mute_account": "ساکت کردن {0}", "mute_account": "ساکت کردن {0}",
"mute_conversation": "ساکت کردن این فرسته", "mute_conversation": "ساکت کردن این فرسته",
"open_in_original_site": "باز کردن در سایت اصلی", "open_in_original_site": "باز کردن در سایت اصلی",
"open_in_original_site_2": "در سایت اصلی باز کنید",
"pin_on_profile": "به نمایه سنجاق کنید", "pin_on_profile": "به نمایه سنجاق کنید",
"remove_personal_note": "یادداشت شخصی را از {0} حذف کنید", "remove_personal_note": "یادداشت شخصی را از {0} حذف کنید",
"report_account": "گزارش {0}", "report_account": "گزارش {0}",
@ -381,28 +380,26 @@
"title": "از گزارش شما متشکریم، ما به آن رسیدگی خواهیم کرد." "title": "از گزارش شما متشکریم، ما به آن رسیدگی خواهیم کرد."
} }
}, },
"report": { "limiting": "محدود کردن {0}",
"limiting": "محدود کردن {0}", "mute_desc": "دیگر هیچ فرستهی از این کاربر را نخواهید دید. آن‌ها همچنان می‌توانند شما را دنبال کنند و فرسته‌های شما را ببینند. آن‌ها متوجه بی‌صدا شدن نخواهند شد.",
"mute_desc": "دیگر هیچ فرستهی از این کاربر را نخواهید دید. آن‌ها همچنان می‌توانند شما را دنبال کنند و فرسته‌های شما را ببینند. آن‌ها متوجه بی‌صدا شدن نخواهند شد.", "other": "مورد دیگری است",
"other": "مورد دیگری است", "other_desc": "مشکلی که مطرح شده در دسته‌بندی‌های دیگر نمی‌گنجد",
"other_desc": "مشکلی که مطرح شده در دسته‌بندی‌های دیگر نمی‌گنجد", "reporting": "گزارش {0}",
"reporting": "گزارش {0}", "select_many": "تمام موارد مرتبط را انتخاب کنید:",
"select_many": "تمام موارد مرتبط را انتخاب کنید:", "select_one": "بهترین تطابق را انتخاب کنید:",
"select_one": "بهترین تطابق را انتخاب کنید:", "select_posts": "آیا فرسته‌هایی وجود دارد که این گزارش را پشتیبانی می‌کند؟",
"select_posts": "آیا فرسته‌هایی وجود دارد که این گزارش را پشتیبانی می‌کند؟", "select_posts_other": "آیا فرسته‌های دیگری وجود دارد که این گزارش را پشتیبانی می‌کند؟",
"select_posts_other": "آیا فرسته‌های دیگری وجود دارد که این گزارش را پشتیبانی می‌کند؟", "spam": "هرزنامه است",
"spam": "هرزنامه است", "spam_desc": "پیوندهای مخرب، تعاملات تقلبی، یا پاسخ‌های تکراری",
"spam_desc": "پیوندهای مخرب، تعاملات تقلبی، یا پاسخ‌های تکراری", "submit": "ارسال گزارش",
"submit": "ارسال گزارش", "unfollow_desc": "دیگر فرسته‌های این کاربر را در فید خانگی خود نخواهید دید. ممکن است در جاهای دیگر فرسته‌های آن‌ها را ببینید.",
"unfollow_desc": "دیگر فرسته‌های این کاربر را در فید خانگی خود نخواهید دید. ممکن است در جاهای دیگر فرسته‌های آن‌ها را ببینید.", "violation": "یک یا چند قوانین سرور را نقض می‌کند",
"violation": "یک یا چند قوانین سرور را نقض می‌کند", "whats_wrong_account": "بگویید چه مشکلی با این حساب کاربری وجود دارد",
"whats_wrong_account": "بگویید چه مشکلی با این حساب کاربری وجود دارد", "whats_wrong_post": "بگویید چه مشکلی با این فرسته وجود دارد"
"whats_wrong_post": "بگویید چه مشکلی با این فرسته وجود دارد" },
}, "search": {
"search": { "search_desc": "جستجوی افراد و برچسب‌ها",
"search_desc": "جستجوی افراد و برچسب‌ها", "search_empty": "هیچ موردی برای اصطلاحات جستجو شده پیدا نشد"
"search_empty": "هیچ موردی برای اصطلاحات جستجو شده پیدا نشد"
}
}, },
"settings": { "settings": {
"about": { "about": {

View File

@ -214,8 +214,7 @@
"command_mode": "Mode commande", "command_mode": "Mode commande",
"compose": "Composer", "compose": "Composer",
"favourite": "J'aime", "favourite": "J'aime",
"title": "Actions", "title": "Actions"
"zen_mode": "Mode Zen"
}, },
"media": { "media": {
"title": "Média" "title": "Média"
@ -550,9 +549,6 @@
"label": "Comptes connectés" "label": "Comptes connectés"
} }
}, },
"share-target": {
"title": ""
},
"share_target": { "share_target": {
"description": "Elk peut être configuré pour que vous puissiez partager du contenu à partir d'autres applications, installez simplement Elk sur votre appareil ou ordinateur et connectez-vous.", "description": "Elk peut être configuré pour que vous puissiez partager du contenu à partir d'autres applications, installez simplement Elk sur votre appareil ou ordinateur et connectez-vous.",
"hint": "Pour partager du contenu avec Elk, Elk doit être installé et vous devez être connecté.", "hint": "Pour partager du contenu avec Elk, Elk doit être installé et vous devez être connecté.",
@ -605,7 +601,6 @@
"edited": "a édité {0}" "edited": "a édité {0}"
}, },
"tab": { "tab": {
"account": "Compte",
"accounts": "Comptes", "accounts": "Comptes",
"for_you": "Pour vous", "for_you": "Pour vous",
"hashtags": "Hashtags", "hashtags": "Hashtags",

View File

@ -27,6 +27,7 @@
"follows_you": "Követ téged", "follows_you": "Követ téged",
"go_to_profile": "Ugrás a profilhoz", "go_to_profile": "Ugrás a profilhoz",
"joined": "Csatlakozott", "joined": "Csatlakozott",
"lock": "Zárolt",
"moved_title": "jelezte, hogy az új fiók mostantól:", "moved_title": "jelezte, hogy az új fiók mostantól:",
"muted_users": "Némított felhasználók", "muted_users": "Némított felhasználók",
"muting": "Némított", "muting": "Némított",
@ -79,7 +80,7 @@
"save": "Ment", "save": "Ment",
"save_changes": "Változások mentése", "save_changes": "Változások mentése",
"sign_in": "Bejelentkezés", "sign_in": "Bejelentkezés",
"sign_in_to": "Bejelentkezés: {0}", "sign_in_to": "Bejelentkezve: {0}",
"switch_account": "Fiók váltás", "switch_account": "Fiók váltás",
"vote": "Szavazás" "vote": "Szavazás"
}, },
@ -94,7 +95,7 @@
"activate": "Aktivál", "activate": "Aktivál",
"complete": "Befejez", "complete": "Befejez",
"compose_desc": "Új bejegyzés írása", "compose_desc": "Új bejegyzés írása",
"n-people-in-the-past-n-days": "{0} felhasználó az elmúlt {1} napban", "n_people_in_the_past_n_days": "{0} ember az elmúlt {1} napban",
"select_lang": "Nyelv kiválasztása", "select_lang": "Nyelv kiválasztása",
"sign_in_desc": "Létező fiók hozzáadása", "sign_in_desc": "Létező fiók hozzáadása",
"switch_account": "Váltás: {0}", "switch_account": "Váltás: {0}",
@ -120,12 +121,14 @@
"block_account": { "block_account": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Blokkol", "confirm": "Blokkol",
"description": "Biztosan blokkolja? {0}" "description": "Biztosan blokkolja? {0}",
"title": "Hozzáférés blokkolása"
}, },
"block_domain": { "block_domain": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Blokkol", "confirm": "Blokkol",
"description": "Biztosan blokkolja? {0}" "description": "Biztosan blokkolja? {0}",
"title": "Domain blokkolása"
}, },
"common": { "common": {
"cancel": "Mégsem", "cancel": "Mégsem",
@ -134,27 +137,37 @@
"delete_list": { "delete_list": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Töröl", "confirm": "Töröl",
"description": "Biztosan törli a listát? \"{0}\"" "description": "Biztosan törli a listát? \"{0}\"",
"title": "Lista törlése"
}, },
"delete_posts": { "delete_posts": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Töröl", "confirm": "Töröl",
"description": "Biztosan törli a bejegyzést?" "description": "Biztosan törli a bejegyzést?",
"title": "Bejegyzés törlése"
}, },
"mute_account": { "mute_account": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Némít", "confirm": "Némít",
"description": "Biztosan némítja? {0}" "days": "napok|nap|napok",
"description": "Biztosan némítja? {0}",
"hours": "órák|óra|órák",
"minute": "perc|perc|perc",
"notifications": "Értesítések némítása",
"specify_duration": "Határozzon meg némítási időtartamot",
"title": "Hozzáférés némítása"
}, },
"show_reblogs": { "show_reblogs": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Mutat", "confirm": "Mutat",
"description": "Biztosan megjeleníti a Turbót tőle? {0}" "description": "Biztosan megjeleníti a Kiemelést tőle? {0}",
"title": "Kiemelés megjenítése"
}, },
"unfollow": { "unfollow": {
"cancel": "Mégsem", "cancel": "Mégsem",
"confirm": "Követés leállítása", "confirm": "Követés leállítása",
"description": "Biztosan leállítja a követését?" "description": "Biztosan leállítja a követését?",
"title": "Követés elállítása"
} }
}, },
"conversation": { "conversation": {
@ -169,7 +182,7 @@
}, },
"error": { "error": {
"account_not_found": "Fiók {0} nem található", "account_not_found": "Fiók {0} nem található",
"explore_list-empty": "Nincs most itt semmi... Nézz vissza később!", "explore_list_empty": "Nincs most semmi érdekes. Térj vissza később!",
"file_size_cannot_exceed_n_mb": "A fájl mérete nem haladhatja meg a {0}MB-ot", "file_size_cannot_exceed_n_mb": "A fájl mérete nem haladhatja meg a {0}MB-ot",
"sign_in_error": "Nem lehetséges a csatlakozás.", "sign_in_error": "Nem lehetséges a csatlakozás.",
"status_not_found": "A bejegyzés nem található", "status_not_found": "A bejegyzés nem található",
@ -220,14 +233,25 @@
"compose": "Közzétesz", "compose": "Közzétesz",
"favourite": "Kedvenc", "favourite": "Kedvenc",
"search": "Keresés", "search": "Keresés",
"show_new_items": "Új elemek mutatása",
"title": "Műveletek" "title": "Műveletek"
}, },
"media": { "media": {
"title": "Média" "title": "Média"
}, },
"navigation": { "navigation": {
"go_to_bookmarks": "Könyvjelzők",
"go_to_conversations": "Párbeszédek",
"go_to_explore": "Felfedez",
"go_to_favourites": "Kedvencek",
"go_to_federated": "Összesített",
"go_to_home": "Otthon", "go_to_home": "Otthon",
"go_to_lists": "Listák",
"go_to_local": "Helyi",
"go_to_notifications": "Értesítések", "go_to_notifications": "Értesítések",
"go_to_profile": "Profil",
"go_to_search": "Keresés",
"go_to_settings": "Beállítások",
"next_status": "Következő bejegyzés", "next_status": "Következő bejegyzés",
"previous_status": "Előző bejegyzés", "previous_status": "Előző bejegyzés",
"shortcut_help": "Gyors segítség", "shortcut_help": "Gyors segítség",
@ -285,6 +309,7 @@
"explore": "Felfedezés", "explore": "Felfedezés",
"favourites": "Kedvencek", "favourites": "Kedvencek",
"federated": "Összesített", "federated": "Összesített",
"hashtags": "Címkék",
"home": "Otthon", "home": "Otthon",
"list": "Lista", "list": "Lista",
"lists": "Listák", "lists": "Listák",
@ -316,7 +341,7 @@
"placeholder": { "placeholder": {
"content_warning": "Írja ide figyelmeztetését", "content_warning": "Írja ide figyelmeztetését",
"default_1": "Mi jár a fejedben?", "default_1": "Mi jár a fejedben?",
"reply_to_account": "Válasz: {0}", "reply_to_account": "Válasz erre: {0}",
"replying": "Válaszol" "replying": "Válaszol"
}, },
"polls": { "polls": {
@ -517,10 +542,12 @@
"hide_follower_count": "Követők/Követések számláló elrejtése", "hide_follower_count": "Követők/Követések számláló elrejtése",
"hide_news": "Hírek elrejtése", "hide_news": "Hírek elrejtése",
"hide_reply_count": "Visszajelzések számláló elrejtése", "hide_reply_count": "Visszajelzések számláló elrejtése",
"hide_tag_hover_card": "Lebegő kártya elrejtése",
"hide_translation": "Fordítás elrejtése", "hide_translation": "Fordítás elrejtése",
"hide_username_emojis": "Felhasználói emoji elrejtése", "hide_username_emojis": "Felhasználói emoji elrejtése",
"hide_username_emojis_description": "Elrejti a hangulatjeleket a felhasználónevek elől az idővonalakban. A hangulatjelek továbbra is láthatók lesznek a profiljukban.", "hide_username_emojis_description": "Elrejti a hangulatjeleket a felhasználónevek elől az idővonalakban. A hangulatjelek továbbra is láthatók lesznek a profiljukban.",
"label": "Preferenciák", "label": "Preferenciák",
"optimize_for_low_performance_device": "Alacsony teljesítményre optimalizálás",
"title": "Kísérleti képességek", "title": "Kísérleti képességek",
"use_star_favorite_icon": "Használja a csillag favikont", "use_star_favorite_icon": "Használja a csillag favikont",
"user_picker": "Felhasználók váltása", "user_picker": "Felhasználók váltása",
@ -557,10 +584,10 @@
"label": "Bejelentkezett felhasználók" "label": "Bejelentkezett felhasználók"
} }
}, },
"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 megoszthasson tartalmat, egyszerűen telepítse az Elket eszközére vagy számítógépére, és jelentkezzen be.",
"hint": "A tartalom Elkkel való 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 jelentkeznie.",
"title": "Megosztás Elkkel" "title": "Oszd meg Elkkel"
}, },
"state": { "state": {
"attachments_exceed_server_limit": "A mellékletek száma meghaladta a bejegyzésenkénti korlátot.", "attachments_exceed_server_limit": "A mellékletek száma meghaladta a bejegyzésenkénti korlátot.",

View File

@ -149,7 +149,12 @@
"mute_account": { "mute_account": {
"cancel": "Annulla", "cancel": "Annulla",
"confirm": "Silenzia", "confirm": "Silenzia",
"days": "giorni|giorno|giorni",
"description": "Confermi di voler silenziare {0}?", "description": "Confermi di voler silenziare {0}?",
"hours": "ore|ora|ore",
"minute": "minuti|minuto|minuti",
"notifications": "Silenzia notifiche",
"specify_duration": "Specifica durata silenziamento",
"title": "Silenzia account" "title": "Silenzia account"
}, },
"show_reblogs": { "show_reblogs": {

View File

@ -149,7 +149,12 @@
"mute_account": { "mute_account": {
"cancel": "Cancelar", "cancel": "Cancelar",
"confirm": "Silenciar", "confirm": "Silenciar",
"days": "dias|dia|dias",
"description": "Tem a certeza que pretende silenciar {0}?", "description": "Tem a certeza que pretende silenciar {0}?",
"hours": "horas|hora|horas",
"minute": "minutos|minuto|minutos",
"notifications": "Silenciar notificações",
"specify_duration": "Especificar duração do silêncio",
"title": "Silenciar conta" "title": "Silenciar conta"
}, },
"show_reblogs": { "show_reblogs": {

View File

@ -7,6 +7,8 @@
"route_loaded": "Naloload na ang pahina {0}" "route_loaded": "Naloload na ang pahina {0}"
}, },
"account": { "account": {
"authorize": "Pahintulutan na sumunod",
"authorized": "Pinahintulutan mo ang kahilingan",
"avatar_description": "Avatar ni {0}", "avatar_description": "Avatar ni {0}",
"blocked_by": "Ika'y na-block ng user na ito.", "blocked_by": "Ika'y na-block ng user na ito.",
"blocked_domains": "Mga naka-block na domain", "blocked_domains": "Mga naka-block na domain",
@ -25,6 +27,7 @@
"follows_you": "Sinusundan ka", "follows_you": "Sinusundan ka",
"go_to_profile": "Pumunta sa profile", "go_to_profile": "Pumunta sa profile",
"joined": "Sumali", "joined": "Sumali",
"lock": "Ikandado",
"moved_title": "nagpahiwatig na ang kanilang bagong account ay:", "moved_title": "nagpahiwatig na ang kanilang bagong account ay:",
"muted_users": "Mga naka-mute na user", "muted_users": "Mga naka-mute na user",
"muting": "Naka-mute", "muting": "Naka-mute",
@ -37,36 +40,42 @@
"profile_description": "Header ng profile ni {0}", "profile_description": "Header ng profile ni {0}",
"profile_personal_note": "Personal na Tala", "profile_personal_note": "Personal na Tala",
"profile_unavailable": "Hindi magamit ang profile", "profile_unavailable": "Hindi magamit ang profile",
"reject": "Tanggihan na sumunod",
"rejected": "Tinanggihan mo ang kahilingan",
"request_follow": "Humiling ng pagsunod", "request_follow": "Humiling ng pagsunod",
"requested": "{0} ay humiling na sundan ka",
"unblock": "Tanggalin ang pagka-block", "unblock": "Tanggalin ang pagka-block",
"unfollow": "Huminto sa pagsunod", "unfollow": "Huminto sa pagsunod",
"unmute": "Tanggalin ang pagka-mute", "unmute": "Tanggalin ang pagka-mute",
"view_other_followers": "Ang mga tagasunod mula sa ibang mga instance ay hindi maipapakita.", "view_other_followers": "Ang mga tagasunod mula sa ibang mga instance ay hindi maipapakita.",
"view_other_following": "Ang mga sinusundan mula sa ibang mga instance ay hindi maipapakita." "view_other_following": "Ang mga sinusundan mula sa ibang mga instance ay hindi maipapakita.",
"withdraw_follow_request": "Bawiin ang kahilingan na sumunod"
}, },
"action": { "action": {
"apply": "Mag-apply", "apply": "Mag-apply",
"bookmark": "I-bookmark", "bookmark": "I-bookmark",
"bookmarked": "Nai-bookmark na", "bookmarked": "Nai-bookmark na",
"boost": "I-boost", "boost": "I-boost",
"boost_count": "{0} ang nag-boost", "boost_count": "{0} nag-boost",
"boosted": "Nai-boost na", "boosted": "Nai-boost na",
"clear_publish_failed": "Tanggalin ang mga error sa pag-publish", "clear_publish_failed": "I-clear ang mga error sa pag-publish",
"clear_upload_failed": "Tanggalin ang mga error sa pag-upload ng file", "clear_save_failed": "I-clear ang mga error sa pag-save",
"clear_upload_failed": "I-clear ang mga error sa pag-upload ng file",
"close": "Isara", "close": "Isara",
"compose": "Mag-compose", "compose": "Mag-compose",
"confirm": "Kumpirmahin", "confirm": "Kumpirmahin",
"done": "Tapos na",
"edit": "I-edit", "edit": "I-edit",
"enter_app": "Tumuloy sa App", "enter_app": "Tumuloy sa App",
"favourite": "I-favorite", "favourite": "I-favorite",
"favourite_count": "{0} ang nag-favorite", "favourite_count": "{0} nag-favorite",
"favourited": "Nai-favorite na", "favourited": "Nai-favorite na",
"more": "Iba pa", "more": "Iba pa",
"next": "Susunod", "next": "Susunod",
"prev": "Nakaraan", "prev": "Nakaraan",
"publish": "I-publish", "publish": "I-publish",
"reply": "Sumagot", "reply": "Sumagot",
"reply_count": "{0} ang sumagot", "reply_count": "{0} sumagot",
"reset": "I-reset", "reset": "I-reset",
"save": "I-save", "save": "I-save",
"save_changes": "I-save ang mga pagbabago", "save_changes": "I-save ang mga pagbabago",
@ -99,6 +108,8 @@
"error": "ERROR", "error": "ERROR",
"fetching": "Kumukuha...", "fetching": "Kumukuha...",
"in": "sa", "in": "sa",
"no_bookmarks": "Wala pang naka-bookmark na mga post",
"no_favourites": "Wala pang ni-like na post",
"not_found": "404 Hindi Nakita", "not_found": "404 Hindi Nakita",
"offline_desc": "Mukhang offline ka. Mangyaring suriin ang iyong koneksyon sa network." "offline_desc": "Mukhang offline ka. Mangyaring suriin ang iyong koneksyon sa network."
}, },
@ -110,12 +121,14 @@
"block_account": { "block_account": {
"cancel": "Kanselahin", "cancel": "Kanselahin",
"confirm": "I-block", "confirm": "I-block",
"description": "Sigurado ka bang gusto mong i-block si {0}?" "description": "Sigurado ka bang gusto mong i-block si {0}?",
"title": "I-block ang account"
}, },
"block_domain": { "block_domain": {
"cancel": "Kanselahin", "cancel": "Kanselahin",
"confirm": "I-block", "confirm": "I-block",
"description": "Sigurado ka bang gusto mong i-block ang {0}?" "description": "Sigurado ka bang gusto mong i-block ang {0}?",
"title": "I-block ang domain"
}, },
"common": { "common": {
"cancel": "Hindi", "cancel": "Hindi",
@ -124,27 +137,37 @@
"delete_list": { "delete_list": {
"cancel": "Kanselahin", "cancel": "Kanselahin",
"confirm": "Burahin", "confirm": "Burahin",
"description": "Sigurado ka bang gusto mong burahin ang listahan na \"{0}\"?" "description": "Sigurado ka bang gusto mong burahin ang listahan na \"{0}\"?",
"title": "I-delete ang list"
}, },
"delete_posts": { "delete_posts": {
"cancel": "Kanselahin", "cancel": "Kanselahin",
"confirm": "Burahin", "confirm": "Burahin",
"description": "Sigurado ka bang gusto mong burahin ang post na ito?" "description": "Sigurado ka bang gusto mong burahin ang post na ito?",
"title": "I-delete post"
}, },
"mute_account": { "mute_account": {
"cancel": "Kanselahin", "cancel": "Kanselahin",
"confirm": "I-mute", "confirm": "I-mute",
"description": "Sigurado ka bang gusto mong i-mute si {0}?" "days": "mga araw|araw|mga araw",
"description": "Sigurado ka bang gusto mong i-mute si {0}?",
"hours": "mga oras|oras|mga oras",
"minute": "mga minuto|minuto|mga minuto",
"notifications": "I-mute ang notifications",
"specify_duration": "Tukuyin ang tagal ng pag-mute",
"title": "I-mute ang account"
}, },
"show_reblogs": { "show_reblogs": {
"cancel": "Kanselahin", "cancel": "Kanselahin",
"confirm": "Ipakita", "confirm": "Ipakita",
"description": "Sigurado ka bang gusto mong ipakita ang mga boosts mula kay {0}?" "description": "Sigurado ka bang gusto mong ipakita ang mga boosts mula kay {0}?",
"title": "Ipakita ang boosts"
}, },
"unfollow": { "unfollow": {
"cancel": "Kanselahin", "cancel": "Kanselahin",
"confirm": "Huminto sa pagsunod", "confirm": "Itigil ang pagsunod",
"description": "Sigurado ka bang gusto mong huminto sa pagsunod?" "description": "Sigurado ka bang gusto mong huminto sa pagsunod?",
"title": "Itigil ang pagsunod"
} }
}, },
"conversation": { "conversation": {
@ -196,7 +219,7 @@
"edit_error": "Mayroong error sa pag-update ng listahan", "edit_error": "Mayroong error sa pag-update ng listahan",
"error": "Mayroong error sa paglikha ng listahan", "error": "Mayroong error sa paglikha ng listahan",
"error_prefix": "Error: ", "error_prefix": "Error: ",
"list_title_placeholder": "Pamagat ng listahan", "list_title_placeholder": "Pangalan ng listahan",
"modify_account": "Baguhin ang mga listahan sa account", "modify_account": "Baguhin ang mga listahan sa account",
"remove_account": "Tanggalin ang account sa listahan", "remove_account": "Tanggalin ang account sa listahan",
"save": "I-save ang mga pagbabago" "save": "I-save ang mga pagbabago"
@ -209,24 +232,36 @@
"command_mode": "Mode ng Command", "command_mode": "Mode ng Command",
"compose": "Mag-compose", "compose": "Mag-compose",
"favourite": "Paborito", "favourite": "Paborito",
"search": "Hanapin",
"show_new_items": "Ipakita ang mga bagong item",
"title": "Mga aksyon" "title": "Mga aksyon"
}, },
"media": { "media": {
"title": "Media" "title": "Media"
}, },
"navigation": { "navigation": {
"go_to_bookmarks": "Mga Tandang-Pahina",
"go_to_conversations": "Mga Usapang Pribado",
"go_to_explore": "Mag-Explore",
"go_to_favourites": "Mga Paborito",
"go_to_federated": "Pederal",
"go_to_home": "Tungo sa Home", "go_to_home": "Tungo sa Home",
"go_to_lists": "Mga Listahan",
"go_to_local": "Lokal",
"go_to_notifications": "Tungo sa mga Abiso", "go_to_notifications": "Tungo sa mga Abiso",
"go_to_profile": "Profile",
"go_to_search": "Hanapin",
"go_to_settings": "Mga Setting",
"next_status": "Susunod na status", "next_status": "Susunod na status",
"previous_status": "Nakaraang status", "previous_status": "Nakaraang status",
"shortcut_help": "Tulong sa shortcut", "shortcut_help": "Tulong sa shortcut",
"title": "Pag-navigate" "title": "Pag-navigate"
} }
}, },
"sequence_then": "pagkatapos" "sequence_then": "tapos"
}, },
"menu": { "menu": {
"add_personal_note": "Magdagdag ng personal na note sa {0}", "add_personal_note": "Sumulat ng personal na tala",
"block_account": "I-block si {0}", "block_account": "I-block si {0}",
"block_domain": "I-block ang domain ng {0}", "block_domain": "I-block ang domain ng {0}",
"copy_link_to_post": "Kopyahin ang link", "copy_link_to_post": "Kopyahin ang link",
@ -236,12 +271,14 @@
"direct_message_account": "I-message ng direkta si {0}", "direct_message_account": "I-message ng direkta si {0}",
"edit": "I-edit", "edit": "I-edit",
"hide_reblogs": "Itago ang mga boost mula kay {0}", "hide_reblogs": "Itago ang mga boost mula kay {0}",
"mention_account": "Banggitin si {0}", "mention_account": "Tumugon kay {0}",
"mute_account": "I-mute si {0}", "mute_account": "I-mute si {0}",
"mute_conversation": "I-mute ang post na ito", "mute_conversation": "I-mute ang post na ito",
"open_in_original_site": "Buksan sa orihinal na site", "open_in_original_site": "Buksan sa orihinal na site",
"pin_on_profile": "I-pin sa profile", "pin_on_profile": "I-pin sa profile",
"remove_personal_note": "Tanggalin ang personal na note sa {0}", "remove_personal_note": "Tanggalin ang personal na tala",
"report_account": "I-report si {0}",
"share_account": "I-share si {0}",
"share_post": "I-share ang post na ito", "share_post": "I-share ang post na ito",
"show_favourited_and_boosted_by": "Ipakita ang mga nag-favorite at nag-boost", "show_favourited_and_boosted_by": "Ipakita ang mga nag-favorite at nag-boost",
"show_reblogs": "Ipakita ang mga boost mula kay {0}", "show_reblogs": "Ipakita ang mga boost mula kay {0}",
@ -253,6 +290,7 @@
"translate_post": "I-translate ang post", "translate_post": "I-translate ang post",
"unblock_account": "I-unblock ang {0}", "unblock_account": "I-unblock ang {0}",
"unblock_domain": "I-unblock ang domain ng {0}", "unblock_domain": "I-unblock ang domain ng {0}",
"unfollow_account": "Unfollow {0}",
"unmute_account": "I-unmute si {0}", "unmute_account": "I-unmute si {0}",
"unmute_conversation": "I-unmute ang post na ito", "unmute_conversation": "I-unmute ang post na ito",
"unpin_on_profile": "I-unpin sa profile" "unpin_on_profile": "I-unpin sa profile"
@ -265,12 +303,13 @@
"blocked_domains": "Mga Naka-Block na Domain", "blocked_domains": "Mga Naka-Block na Domain",
"blocked_users": "Mga Naka-Block na Users", "blocked_users": "Mga Naka-Block na Users",
"bookmarks": "Mga Tandang-Pahina", "bookmarks": "Mga Tandang-Pahina",
"built_at": "Ginawa noong {0}", "built_at": "Build version mula noong {0}",
"compose": "Lumikha ng Mensahe", "compose": "Lumikha ng Mensahe",
"conversations": "Mga Usapang Pribado", "conversations": "Mga Usapang Pribado",
"explore": "Mag-Explore", "explore": "Mag-Explore",
"favourites": "Mga Paborito", "favourites": "Mga Paborito",
"federated": "Pederal", "federated": "Pederal",
"hashtags": "Mga Hashtags",
"home": "Tahanan", "home": "Tahanan",
"list": "Listahan", "list": "Listahan",
"lists": "Mga Listahan", "lists": "Mga Listahan",
@ -304,10 +343,26 @@
"reply_to_account": "Sagot kay {0}", "reply_to_account": "Sagot kay {0}",
"replying": "Sumasagot" "replying": "Sumasagot"
}, },
"polls": {
"allow_multiple": "Payagan ang maramihang pagboto",
"cancel": "Kanselahin",
"create": "Likhain ang poll",
"disallow_multiple": "Huwag payagan ang maramihang pagboto",
"expiration": "Katapusan ng pagboto",
"hide_votes": "Itago ang bilang ng mga boto hanggang sa katapusan",
"option_placeholder": "Poll choice {current}/{max}",
"remove_option": "Remove choice",
"settings": "Poll options",
"show_votes": "Always show vote totals"
},
"pwa": { "pwa": {
"dismiss": "I-dismiss", "dismiss": "I-dismiss",
"install": "I-install", "install": "I-install",
"install_title": "I-install ang Elk", "install_title": "I-install ang Elk",
"screenshots": {
"dark": "Screenshot of Elk running in dark mode",
"light": "Screenshot of Elk running in light mode"
},
"title": "May bagong update para sa Elk!", "title": "May bagong update para sa Elk!",
"update": "I-update", "update": "I-update",
"update_available_short": "I-update ang Elk", "update_available_short": "I-update ang Elk",
@ -334,6 +389,42 @@
} }
} }
}, },
"report": {
"additional_comments": "Karagdagang mga komento",
"another_server": "Ang user na iyong inire-report ay mula sa ibang server",
"anything_else": "May iba pa ba kaming kailangan malaman?",
"block_desc": "Hindi mo na makikita ang mga post mula sa user na ito. Hindi rin nila masusundan ang iyong account o makikita ang iyong mga post. Malalaman nilang naka-block sila.",
"dontlike": "Hindi ko ito gusto",
"dontlike_desc": "Hindi mo ito gustong makita",
"forward": "Oo, ipasa ang report na ito sa {0}",
"forward_question": "Gusto mo bang magpadala din ng anonymous na kopya ng report na ito sa server na iyon?",
"further_actions": {
"limit": {
"description": "Narito ang iyong mga pwedeng gawin upang ma-control iyong nakikita:",
"title": "Ayaw mong makita ito?"
},
"report": {
"description": "Habang sinusuri namin ang iyong report, narito ang mga maaari mong gawin:",
"title": "Salamat sa pag-report, titingnan namin ito"
}
},
"limiting": "Inili-limit {0}",
"mute_desc": "Hindi mo na makikita ang mga post mula sa user na ito. Maaari ka pa rin nilang sundan at makita ang iyong mga post. Hindi nila malalaman na sila ay naka-mute",
"other": "Iba ang aking dahilan",
"other_desc": "Ang isyu ay hindi umaangkop sa mga nabanggit na kategorya",
"reporting": "Pag-report si {0}",
"select_many": "Piliin ang lahat ng tugma:",
"select_one": "Piliin ang pinaka-tugma:",
"select_posts": "Mayroon bang mga post na nagba-back up sa report na ito?",
"select_posts_other": "Mayroon pa bang mga post na nagba-back up sa report na ito?",
"spam": "Ito ay spam",
"spam_desc": "May mga malicious na link, pekeng engagement, o paulit-ulit na reply",
"submit": "I-sumite ang report",
"unfollow_desc": "Hindi mo na makikita ang mga post mula sa user na ito sa iyong feed na Tahanan. Maaari ka pa ring makakita ng mga post mula sa kanila sa ibang lugar.",
"violation": "Lumalabag ito sa mga rules ng server",
"whats_wrong_account": "Sabihin sa amin kung ano ang mali sa account na ito",
"whats_wrong_post": "Sabihin sa amin kung ano ang mali sa post na ito"
},
"search": { "search": {
"search_desc": "Maghanap ng mga tao at hashtag", "search_desc": "Maghanap ng mga tao at hashtag",
"search_empty": "Walang nahanap para sa mga terminong ito" "search_empty": "Walang nahanap para sa mga terminong ito"
@ -368,6 +459,7 @@
"language": { "language": {
"display_language": "Ipakita ang Wika", "display_language": "Ipakita ang Wika",
"label": "Wika", "label": "Wika",
"post_language": "Posting Language",
"status": "Kalagayan ng Pagsasalin: {0}/{1} ({2}%)", "status": "Kalagayan ng Pagsasalin: {0}/{1} ({2}%)",
"translations": { "translations": {
"add": "Magdagdag", "add": "Magdagdag",
@ -386,7 +478,7 @@
"alerts": { "alerts": {
"favourite": "Mga Paborito", "favourite": "Mga Paborito",
"follow": "Mga Bagong Tagasunod", "follow": "Mga Bagong Tagasunod",
"mention": "Mga Mention", "mention": "Mga Tugon",
"poll": "Mga Poll", "poll": "Mga Poll",
"reblog": "Mga Reblog ng iyong Post", "reblog": "Mga Reblog ng iyong Post",
"title": "Anong mga abiso ang nais mong matanggap?" "title": "Anong mga abiso ang nais mong matanggap?"
@ -433,25 +525,33 @@
}, },
"notifications_settings": "Mga Notification", "notifications_settings": "Mga Notification",
"preferences": { "preferences": {
"embedded_media": "Naka-Embed na Media Player",
"embedded_media_description": "Magpakita ng naka-embed na player sa halip na preview card para sa mga post na may media streaming.",
"enable_autoplay": "Paganahin ang Autoplay", "enable_autoplay": "Paganahin ang Autoplay",
"enable_data_saving": "Paganahin ang pag-save ng data", "enable_data_saving": "Paganahin ang pag-save ng data",
"enable_data_saving_description": "I-save ang data sa pamamagitan ng pagpigil sa mga attachment na auto-loading.", "enable_data_saving_description": "I-save ang data sa pamamagitan ng pagpigil sa mga attachment na auto-loading.",
"enable_pinch_to_zoom": "Paganahin ang pinch-to-zoom", "enable_pinch_to_zoom": "Paganahin ang pinch-to-zoom",
"github_cards": "Mga Card ng GitHub", "github_cards": "Mga Card ng GitHub",
"github_cards_description": "Kapag may post na GitHub link, ipakita ang isang HTML preview card na naglalaman ng social graph meta sa halip na ang social image.",
"grayscale_mode": "Grayscale mode", "grayscale_mode": "Grayscale mode",
"hide_account_hover_card": "Itago ang account hover card", "hide_account_hover_card": "Itago ang account hover card",
"hide_alt_indi_on_posts": "Itago ang alt indicator sa mga post", "hide_alt_indi_on_posts": "Itago ang alt indicator sa mga post",
"hide_boost_count": "Itago ang boost count", "hide_boost_count": "Itago ang boost count",
"hide_favorite_count": "Itago ang favorite count", "hide_favorite_count": "Itago ang favorite count",
"hide_follower_count": "Itago ang following/follower count", "hide_follower_count": "Itago ang following/follower count",
"hide_news": "Itago ang mga balita",
"hide_reply_count": "Itago ang reply count", "hide_reply_count": "Itago ang reply count",
"hide_tag_hover_card": "Itago ang tag hover card",
"hide_translation": "Itago ang translation", "hide_translation": "Itago ang translation",
"hide_username_emojis": "Itago ang username emojis", "hide_username_emojis": "Itago ang username emojis",
"hide_username_emojis_description": "Itinatago ang mga emojis mula sa mga usernames sa timelines. Makikita pa rin ang mga emojis sa kanilang mga profile.", "hide_username_emojis_description": "Itinatago ang mga emojis mula sa mga usernames sa timelines. Makikita pa rin ang mga emojis sa kanilang mga profile.",
"label": "Mga Nais", "label": "Mga Nais",
"optimize_for_low_performance_device": "I-optimize para sa device na mabagal",
"title": "Mga Experimental na Tampok", "title": "Mga Experimental na Tampok",
"user_picker": "User Picker", "use_star_favorite_icon": "Gumamit ng star na icon para sa pag-paborito",
"virtual_scroll": "Virtual Scrolling", "user_picker": "Pagpipilian na mga Account",
"user_picker_description": "Ipakita ang mga avatar ng mga naka-login na account sa kaliwang ibaba para makalipat sa mga ito.",
"virtual_scroll": "Virtual na Scrolling",
"wellbeing": "Kalusugan at Kagalingan", "wellbeing": "Kalusugan at Kagalingan",
"zen_mode": "Modong Zen", "zen_mode": "Modong Zen",
"zen_mode_description": "Itago ang ibang mga elemento sa timeline at mga asides maliban kung naka-focus ang mouse cursor sa kanila." "zen_mode_description": "Itago ang ibang mga elemento sa timeline at mga asides maliban kung naka-focus ang mouse cursor sa kanila."
@ -495,6 +595,7 @@
"loading": "Nagloload...", "loading": "Nagloload...",
"publish_failed": "Nabigo sa pagpapaskil", "publish_failed": "Nabigo sa pagpapaskil",
"publishing": "Nagpapaskil", "publishing": "Nagpapaskil",
"save_failed": "Nabigo ang pag-save",
"upload_failed": "Nabigo sa pag-upload", "upload_failed": "Nabigo sa pag-upload",
"uploading": "Naguuupload..." "uploading": "Naguuupload..."
}, },
@ -503,8 +604,9 @@
"suspended_message": "Ang account ng status na ito ay nakasuspinde.", "suspended_message": "Ang account ng status na ito ay nakasuspinde.",
"suspended_show": "Ipakita pa rin ang nilalaman?" "suspended_show": "Ipakita pa rin ang nilalaman?"
}, },
"boosted_by": "Binuhay muli ni", "boosted_by": "Ini-boost ni",
"edited": "Naedit {0}", "edited": "Naedit {0}",
"embedded_warning": "Ang pag-play nito ay maaaring magbunyag ng iyong IP address sa iba.",
"favourited_by": "Pumaborito si", "favourited_by": "Pumaborito si",
"filter_hidden_phrase": "Nakafilter dahil sa", "filter_hidden_phrase": "Nakafilter dahil sa",
"filter_show_anyway": "Ipakita pa rin", "filter_show_anyway": "Ipakita pa rin",
@ -539,8 +641,20 @@
"list": "Listahan", "list": "Listahan",
"media": "Media", "media": "Media",
"news": "Balita", "news": "Balita",
"notifications_admin": {
"report": "Mga Report",
"sign_up": "Mga Sign-Up"
},
"notifications_all": "Lahat", "notifications_all": "Lahat",
"notifications_mention": "Mention", "notifications_favourite": "Mga Paborito",
"notifications_follow": "Mga Pagsunod",
"notifications_follow_request": "Mga Hiling ng Pagsunod",
"notifications_mention": "Mga Tugon",
"notifications_more_tooltip": "I-filter ang mga notification ayon sa uri",
"notifications_poll": "Mga Poll",
"notifications_reblog": "Mga Boost",
"notifications_status": "Mga Sinusundang Status",
"notifications_update": "Mga Update",
"posts": "Mga Post", "posts": "Mga Post",
"posts_with_replies": "Mga Post at Mga Tugon" "posts_with_replies": "Mga Post at Mga Tugon"
}, },

View File

@ -89,7 +89,10 @@
"common": { "common": {
"end_of_list": "Кінець списку", "end_of_list": "Кінець списку",
"error": "ПОМИЛКА", "error": "ПОМИЛКА",
"fetching": "Завантаження...",
"in": "в", "in": "в",
"no_bookmarks": "Немає збережених дописів",
"no_favourites": "Немає вподобаних дописів",
"not_found": "404 Не знайдено", "not_found": "404 Не знайдено",
"offline_desc": "Схоже, ви відключені від мережі. Будь ласка, перевірте ваше підключення до мережі." "offline_desc": "Схоже, ви відключені від мережі. Будь ласка, перевірте ваше підключення до мережі."
}, },
@ -98,14 +101,51 @@
"drafts": "Чернетки ({v})" "drafts": "Чернетки ({v})"
}, },
"confirm": { "confirm": {
"block_account": {
"cancel": "Скасувати",
"confirm": "Блокувати",
"description": "Ви впевнені, що бажаєте заблокувати {0}?",
"title": "Заблокувати користувача"
},
"block_domain": {
"cancel": "Скасувати",
"confirm": "Блокувати",
"description": "Ви впевнені, що бажаєте заблокувати {0}?",
"title": "Заблокувати домен"
},
"common": { "common": {
"cancel": "Відмінити", "cancel": "Скасувати",
"confirm": "Так" "confirm": "Так"
}, },
"delete_list": {
"cancel": "Скасувати",
"confirm": "Видалити",
"description": "Ви впевнені, що бажаєте видалити список \"{0}\"?",
"title": "Видалити список"
},
"delete_posts": { "delete_posts": {
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Видалити", "confirm": "Видалити",
"description": "Ви впевнені, що хочете видалити цей допис?" "description": "Ви впевнені, що хочете видалити цей допис?",
"title": "Видалити допис"
},
"mute_account": {
"cancel": "Скасувати",
"confirm": "Приховати",
"description": "Ви впевнені, що бажаєте приховати {0}?",
"title": "Приховати обліковий запис"
},
"show_reblogs": {
"cancel": "Скасувати",
"confirm": "Показати",
"description": "Ви впевнені, що хочете показати поширення від {0}?",
"title": "Показати поширення"
},
"unfollow": {
"cancel": "Скасувати",
"confirm": "Відписатися",
"description": "Ви впевнені, що бажаєте відписатися від {0}?",
"title": "Відписатися"
} }
}, },
"conversation": { "conversation": {
@ -127,25 +167,86 @@
"desc_para4": "До цього, якщо ви хочете допомогти з тестуванням, надіслати відгук або зробити внесок,", "desc_para4": "До цього, якщо ви хочете допомогти з тестуванням, надіслати відгук або зробити внесок,",
"desc_para5": "зв’яжіться з нами на GitHub", "desc_para5": "зв’яжіться з нами на GitHub",
"desc_para6": "і долучіться.", "desc_para6": "і долучіться.",
"footer_team": "Команда Elk",
"title": "Elk у попередньому перегляді!" "title": "Elk у попередньому перегляді!"
}, },
"language": { "language": {
"search": "Пошук" "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": { "menu": {
"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": "Скопіювати оригінальне посилання на цей допис",
"delete": "Видалити", "delete": "Видалити",
"delete_and_redraft": "Видалити і переписати", "delete_and_redraft": "Видалити і переписати",
"direct_message_account": "Пряме повідомлення {0}", "direct_message_account": "Пряме повідомлення {0}",
"edit": "Редагувати", "edit": "Редагувати",
"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}",
"report_account": "Повідомити про зловживання {0}",
"share_account": "Поділитися {0}",
"share_post": "Поділіться цим дописом", "share_post": "Поділіться цим дописом",
"show_favourited_and_boosted_by": "Показати, хто вподобав та поширив",
"show_reblogs": "Показати поширення від {0}",
"show_untranslated": "Показати без перекладу", "show_untranslated": "Показати без перекладу",
"toggle_theme": { "toggle_theme": {
"dark": "Увімкнути темний режим", "dark": "Увімкнути темний режим",
@ -154,6 +255,7 @@
"translate_post": "Перекласти допис", "translate_post": "Перекласти допис",
"unblock_account": "Розблокувати {0}", "unblock_account": "Розблокувати {0}",
"unblock_domain": "Розблокувати домен {0}", "unblock_domain": "Розблокувати домен {0}",
"unfollow_account": "Скасувати підписку на {0}",
"unmute_account": "Не приховувати {0}", "unmute_account": "Не приховувати {0}",
"unmute_conversation": "Не ігнорувати цей допис", "unmute_conversation": "Не ігнорувати цей допис",
"unpin_on_profile": "Відкріпити з профілю" "unpin_on_profile": "Відкріпити з профілю"
@ -164,14 +266,19 @@
"blocked_users": "Заблоковані користувачі", "blocked_users": "Заблоковані користувачі",
"bookmarks": "Закладки", "bookmarks": "Закладки",
"built_at": "Оновлено {0}", "built_at": "Оновлено {0}",
"conversations": "Прямі повідомлення", "compose": "Написати",
"conversations": "Розмови",
"explore": "Огляд", "explore": "Огляд",
"favourites": "Вподобане", "favourites": "Вподобане",
"federated": "Глобальна", "federated": "Глобальна стрічка",
"hashtags": "Хештеґи",
"home": "Головна", "home": "Головна",
"local": "Локальна", "list": "Список",
"lists": "Списки",
"local": "Локальна стрічка",
"muted_users": "Приховані користувачі", "muted_users": "Приховані користувачі",
"notifications": "Сповіщення", "notifications": "Сповіщення",
"privacy": "Конфіденційність",
"profile": "Профіль", "profile": "Профіль",
"search": "Пошук", "search": "Пошук",
"select_feature_flags": "Налаштування функцій", "select_feature_flags": "Налаштування функцій",
@ -183,14 +290,14 @@
"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} людей підписалися на вас|{0} людина підписалися на вас|{0} людини підписалися на вас|{0} людей підписалися на вас",
"missing_type": "ВІДСУТНІЙ notification.type:", "missing_type": "ВІДСУТНІЙ notification.type:",
"reblogged_post": "поширили ваш допис", "reblogged_post": "поширили ваш допис",
"request_to_follow": "попросили підписатися на вас", "request_to_follow": "попросили підписатися на вас",
"signed_up": "зареєструвалися", "signed_up": "зареєструвалися",
"update_status": "оновили свою публікацію" "update_status": "оновили свій допис"
}, },
"placeholder": { "placeholder": {
"content_warning": "Напишіть ваше попередження тут", "content_warning": "Напишіть ваше попередження тут",
@ -200,9 +307,37 @@
}, },
"pwa": { "pwa": {
"dismiss": "Закрити", "dismiss": "Закрити",
"install": "Встановити",
"install_title": "Встановити Elk",
"screenshots": {
"dark": "Знімок екрану Elk, в темному режимі",
"light": "Знімок екрану Elk, в світлому режимі"
},
"title": "Доступна нова версія Elk!", "title": "Доступна нова версія Elk!",
"update": "Оновити", "update": "Оновити",
"update_available_short": "Оновити Elk" "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"
}
}
}, },
"search": { "search": {
"search_desc": "Пошук користувачів та хештеґів", "search_desc": "Пошук користувачів та хештеґів",
@ -222,11 +357,22 @@
"default": " (за замовчуванням)", "default": " (за замовчуванням)",
"font_size": "Розмір шрифта", "font_size": "Розмір шрифта",
"label": "Інтерфейс", "label": "Інтерфейс",
"light_mode": "Світла" "light_mode": "Світла",
"system_mode": "Cистемна",
"theme_color": "Колір теми"
}, },
"language": { "language": {
"display_language": "Мова інтерфейсу", "display_language": "Мова інтерфейсу",
"label": "Мова" "label": "Мова",
"post_language": "Мова дописів",
"status": "Статус перекладу: {0}/{1} ({2}%)",
"translations": {
"add": "Додати",
"choose_language": "Виберіть мову",
"heading": "Переклад",
"hide_specific": "Приховати переклад з мов",
"remove": "Видалити"
}
}, },
"notifications": { "notifications": {
"label": "Сповіщення", "label": "Сповіщення",
@ -274,7 +420,34 @@
}, },
"notifications_settings": "Сповіщення", "notifications_settings": "Сповіщення",
"preferences": { "preferences": {
"label": "Налаштування" "embedded_media": "Вбудований медіаплеєр",
"embedded_media_description": "Відображати вбудований медіаплеєр замість картки, коли допис містить посилання на медіа.",
"enable_autoplay": "Увімкнути автовідтворення",
"enable_data_saving": "Увімкнути економію трафіку",
"enable_data_saving_description": "Економте трафік, відключивши автоматичне завантаження вкладень.",
"github_cards": "Картки GitHub",
"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": "Приховати емодзі в іменах користувачів у стрічках дописів. \nЕмодзі все одно відображатимуться на сторінках профілів.",
"label": "Налаштування",
"optimize_for_low_performance_device": "Оптимізувати для низькопродуктивних пристроїв",
"title": "Експериментальні налаштування",
"use_star_favorite_icon": "Використовувати піктограму \"зірка\" для вподобань",
"user_picker": "Перемикач облікових записів",
"user_picker_description": "Відображати аватари ваших облікових записів у нижньому лівому куті, щоб ви могли швидко перемикатися між ними.",
"virtual_scroll": "Віртуальний список",
"virtual_scroll_description": "Використовувати віртуальний список у стрічках дописів. Це дозволяє відображати більшу кількість елементів без втрати продуктивності.",
"zen_mode": "Дзен режим",
"zen_mode_description": "Приховати бокові панелі, якщо на них не наведено курсор миші. \nТакож приховує деякі елементи у стрічці дописів."
}, },
"profile": { "profile": {
"appearance": { "appearance": {
@ -392,7 +565,7 @@
"add_media": "Додати зображення, відео або аудіо", "add_media": "Додати зображення, відео або аудіо",
"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": "Ці хештеґи зараз набирають популярності серед людей на цьому та інших серверах децентралізованої мережі.",
@ -401,9 +574,10 @@
"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": "Увійдіть, щоб стежити за профілями чи хештеґами, додавати до обраного, ділитися дописами та відповідати на них.",
"tip_no_account": "Якщо у вас ще немає аккаунту Mastodon, {0}.", "tip_no_account": "Якщо у вас ще немає аккаунту Mastodon, {0}.",
"tip_register_account": "оберіть сервер і зареєструйтесь" "tip_register_account": "оберіть сервер і зареєструйтесь"
}, },

View File

@ -95,7 +95,7 @@
"activate": "Kích hoạt", "activate": "Kích hoạt",
"complete": "Hoàn thành", "complete": "Hoàn thành",
"compose_desc": "Soạn tút mới", "compose_desc": "Soạn tút mới",
"n_people_in_the_past_n_days": "{0} người nhắc đến trong {1} ngày gần đây", "n_people_in_the_past_n_days": "{0} người dùng trong {1} ngày qua",
"select_lang": "Chọn ngôn ngữ", "select_lang": "Chọn ngôn ngữ",
"sign_in_desc": "Thêm một tài khoản khác", "sign_in_desc": "Thêm một tài khoản khác",
"switch_account": "Chuyển sang {0}", "switch_account": "Chuyển sang {0}",
@ -149,7 +149,12 @@
"mute_account": { "mute_account": {
"cancel": "Hủy bỏ", "cancel": "Hủy bỏ",
"confirm": "Ẩn", "confirm": "Ẩn",
"days": "ngày|ngày|ngày",
"description": "Bạn có chắc muốn ẩn {0}?", "description": "Bạn có chắc muốn ẩn {0}?",
"hours": "giờ|giờ|giờ",
"minute": "phút|phút|phút",
"notifications": "Ẩn thông báo",
"specify_duration": "Thời hạn ẩn cụ thể",
"title": "Ẩn người" "title": "Ẩn người"
}, },
"show_reblogs": { "show_reblogs": {
@ -228,14 +233,25 @@
"compose": "Soạn", "compose": "Soạn",
"favourite": "Thích", "favourite": "Thích",
"search": "Tìm kiếm", "search": "Tìm kiếm",
"show_new_items": "Hiện những tút mới",
"title": "Hành động" "title": "Hành động"
}, },
"media": { "media": {
"title": "Media" "title": "Media"
}, },
"navigation": { "navigation": {
"go_to_bookmarks": "Tút đã lưu",
"go_to_conversations": "Nhắn riêng",
"go_to_explore": "Khám phá",
"go_to_favourites": "Lượt thích",
"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_local": "Máy chủ",
"go_to_notifications": "Thông báo", "go_to_notifications": "Thông báo",
"go_to_profile": "Hồ sơ",
"go_to_search": "Tìm kiếm",
"go_to_settings": "Cài đặt",
"next_status": "Tút tiếp theo", "next_status": "Tút tiếp theo",
"previous_status": "Tút trước đó", "previous_status": "Tút trước đó",
"shortcut_help": "Trợ giúp phím tắt", "shortcut_help": "Trợ giúp phím tắt",
@ -264,7 +280,7 @@
"report_account": "Báo cáo {0}", "report_account": "Báo cáo {0}",
"share_account": "Chia sẻ {0}", "share_account": "Chia sẻ {0}",
"share_post": "Chia sẻ tút", "share_post": "Chia sẻ tút",
"show_favourited_and_boosted_by": "Xem lượt thích đăng lại", "show_favourited_and_boosted_by": "Xem lượt thích & đăng lại",
"show_reblogs": "Xem đăng lại từ {0}", "show_reblogs": "Xem đăng lại từ {0}",
"show_untranslated": "Xem bản chưa dịch", "show_untranslated": "Xem bản chưa dịch",
"toggle_theme": { "toggle_theme": {
@ -293,6 +309,7 @@
"explore": "Khám phá", "explore": "Khám phá",
"favourites": "Lượt thích", "favourites": "Lượt thích",
"federated": "Liên hợp", "federated": "Liên hợp",
"hashtags": "Hashtag",
"home": "Trang chủ", "home": "Trang chủ",
"list": "Danh sách", "list": "Danh sách",
"lists": "Danh sách", "lists": "Danh sách",
@ -525,6 +542,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_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ượt trả lời",
"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",
"hide_username_emojis_description": "Ẩn emoji khỏi tên người dùng, emoji vẫn sẽ hiển thị trong mô tả của họ.", "hide_username_emojis_description": "Ẩn emoji khỏi tên người dùng, emoji vẫn sẽ hiển thị trong mô tả của họ.",

View File

@ -4,6 +4,7 @@ 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'
import { currentLocales } from '../../config/i18n' import { currentLocales } from '../../config/i18n'
import { THEME_COLORS } from '../../constants/index'
export type LocalizedWebManifest = Record<string, Partial<ManifestOptions>> export type LocalizedWebManifest = Record<string, Partial<ManifestOptions>>
@ -217,8 +218,8 @@ export async function createI18n(): Promise<LocalizedWebManifest> {
short_name, short_name,
description, description,
dir, dir,
background_color: '#ffffff', background_color: THEME_COLORS.backgroundLight,
theme_color: '#ffffff', theme_color: THEME_COLORS.themeLight,
...manifestEntries, ...manifestEntries,
shortcuts, shortcuts,
screenshots, screenshots,
@ -229,8 +230,8 @@ export async function createI18n(): Promise<LocalizedWebManifest> {
short_name, short_name,
description, description,
dir, dir,
background_color: '#111111', background_color: THEME_COLORS.backgroundDark,
theme_color: '#111111', theme_color: THEME_COLORS.themeDark,
...manifestEntries, ...manifestEntries,
shortcuts, shortcuts,
screenshots, screenshots,

View File

@ -1,8 +1,8 @@
{ {
"name": "@elk-zone/elk", "name": "@elk-zone/elk",
"type": "module", "type": "module",
"version": "0.11.0", "version": "0.13.0",
"packageManager": "pnpm@8.15.3", "packageManager": "pnpm@8.15.5",
"license": "MIT", "license": "MIT",
"homepage": "https://elk.zone/", "homepage": "https://elk.zone/",
"main": "./nuxt.config.ts", "main": "./nuxt.config.ts",
@ -38,9 +38,9 @@
"@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.0.8",
"@nuxt/test-utils": "^3.11.0", "@nuxt/test-utils": "^3.12.0",
"@nuxtjs/color-mode": "^3.3.2", "@nuxtjs/color-mode": "^3.3.2",
"@nuxtjs/i18n": "^8.1.1", "@nuxtjs/i18n": "^8.2.0",
"@pinia/nuxt": "^0.5.1", "@pinia/nuxt": "^0.5.1",
"@tiptap/core": "2.2.4", "@tiptap/core": "2.2.4",
"@tiptap/extension-bold": "2.2.4", "@tiptap/extension-bold": "2.2.4",
@ -60,7 +60,7 @@
"@upstash/redis": "^1.27.1", "@upstash/redis": "^1.27.1",
"@vercel/kv": "^1.0.1", "@vercel/kv": "^1.0.1",
"@vue-macros/nuxt": "^1.6.0", "@vue-macros/nuxt": "^1.6.0",
"@vueuse/core": "^10.8.0", "@vueuse/core": "^10.9.0",
"@vueuse/gesture": "^2.0.0", "@vueuse/gesture": "^2.0.0",
"@vueuse/integrations": "^10.8.0", "@vueuse/integrations": "^10.8.0",
"@vueuse/math": "^10.8.0", "@vueuse/math": "^10.8.0",
@ -82,7 +82,7 @@
"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": "^10.0.0",
"masto": "^6.5.2", "masto": "^6.7.0",
"node-emoji": "^2.1.3", "node-emoji": "^2.1.3",
"nuxt-security": "^0.13.1", "nuxt-security": "^0.13.1",
"page-lifecycle": "^0.1.2", "page-lifecycle": "^0.1.2",
@ -101,7 +101,7 @@
"theme-vitesse": "^0.7.2", "theme-vitesse": "^0.7.2",
"tiny-decode": "^0.1.3", "tiny-decode": "^0.1.3",
"tippy.js": "^6.3.7", "tippy.js": "^6.3.7",
"ufo": "^1.4.0", "ufo": "^1.5.2",
"ultrahtml": "^1.5.3", "ultrahtml": "^1.5.3",
"unimport": "^3.7.1", "unimport": "^3.7.1",
"vite-plugin-pwa": "^0.19.2", "vite-plugin-pwa": "^0.19.2",
@ -112,48 +112,47 @@
"ws": "^8.15.1" "ws": "^8.15.1"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^2.8.0", "@antfu/eslint-config": "^2.9.0",
"@antfu/ni": "^0.21.12", "@antfu/ni": "^0.21.12",
"@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/flat": "^5.0.5",
"@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": "^2.7.3", "@types/prettier": "^3.0.0",
"@types/wicg-file-system-access": "^2020.9.8", "@types/wicg-file-system-access": "^2023.10.5",
"@types/ws": "^8.5.10", "@types/ws": "^8.5.10",
"@unlazy/nuxt": "^0.11.1", "@unlazy/nuxt": "^0.11.2",
"@unocss/eslint-config": "^0.58.5", "@unocss/eslint-config": "^0.58.6",
"@vue/test-utils": "^2.4.4", "@vue/test-utils": "2.4.5",
"bumpp": "^9.4.0", "bumpp": "^9.4.0",
"consola": "^3.2.3", "consola": "^3.2.3",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-plugin-format": "^0.1.0", "eslint-plugin-format": "^0.1.0",
"flat": "^5.0.2", "flat": "^6.0.1",
"fs-extra": "^11.2.0", "fs-extra": "^11.2.0",
"lint-staged": "^14.0.1", "lint-staged": "^15.2.2",
"nuxt": "^3.10.3", "nuxt": "^3.11.1",
"prettier": "^3.0.3", "prettier": "^3.2.5",
"sharp": "^0.33.2", "sharp": "^0.33.3",
"sharp-ico": "^0.1.5", "sharp-ico": "^0.1.5",
"simple-git-hooks": "^2.10.0", "simple-git-hooks": "^2.11.1",
"tsx": "^4.7.1", "tsx": "^4.7.1",
"typescript": "^5.3.3", "typescript": "^5.4.2",
"vitest": "1.3.1", "vitest": "1.4.0",
"vue-tsc": "^1.8.27" "vue-tsc": "^2.0.6"
}, },
"pnpm": { "pnpm": {
"overrides": { "overrides": {
"unstorage": "^1.10.1" "unstorage": "^1.10.2"
}, },
"patchedDependencies": { "patchedDependencies": {
"nuxt-security@0.13.1": "patches/nuxt-security@0.13.1.patch" "nuxt-security@0.13.1": "patches/nuxt-security@0.13.1.patch"
} }
}, },
"resolutions": { "resolutions": {
"vitest": "1.3.1", "vitest": "1.4.0",
"vue": "^3.4.19" "vue": "^3.4.21"
}, },
"simple-git-hooks": { "simple-git-hooks": {
"pre-commit": "pnpm lint-staged" "pre-commit": "pnpm lint-staged"

View File

@ -21,7 +21,7 @@ const { data: status, pending, refresh: refreshStatus } = useAsyncData(
) )
const { client } = useMasto() const { client } = useMasto()
const { data: context, pending: pendingContext, refresh: refreshContext } = useAsyncData( const { data: context, pending: pendingContext, refresh: refreshContext } = useAsyncData(
`context:${id}`, `context:${id.value}`,
async () => client.value.v1.statuses.$select(id.value).context.fetch(), async () => client.value.v1.statuses.$select(id.value).context.fetch(),
{ watch: [isHydrated], immediate: isHydrated.value, lazy: true, default: () => shallowRef() }, { watch: [isHydrated], immediate: isHydrated.value, lazy: true, default: () => shallowRef() },
) )

View File

@ -1,7 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { STORAGE_KEY_HIDE_EXPLORE_POSTS_TIPS } from '~~/constants' import { STORAGE_KEY_HIDE_EXPLORE_POSTS_TIPS, STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE } from '~~/constants'
const { t } = useI18n() const { t } = useI18n()
const route = useRoute()
const paginator = useMastoClient().v1.trends.statuses.list() const paginator = useMastoClient().v1.trends.statuses.list()
@ -10,6 +11,13 @@ const hideNewsTips = useLocalStorage(STORAGE_KEY_HIDE_EXPLORE_POSTS_TIPS, false)
useHydratedHead({ useHydratedHead({
title: () => `${t('tab.posts')} | ${t('nav.explore')}`, title: () => `${t('tab.posts')} | ${t('nav.explore')}`,
}) })
const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '')
lastAccessedExploreRoute.value = route.path.replace(/(.*\/explore\/?)/, '')
onActivated(() => {
lastAccessedExploreRoute.value = route.path.replace(/(.*\/explore\/?)/, '')
})
</script> </script>
<template> <template>

View File

@ -1,7 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { STORAGE_KEY_HIDE_EXPLORE_NEWS_TIPS } from '~~/constants' import { STORAGE_KEY_HIDE_EXPLORE_NEWS_TIPS, STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE } from '~~/constants'
const { t } = useI18n() const { t } = useI18n()
const route = useRoute()
const paginator = useMastoClient().v1.trends.links.list() const paginator = useMastoClient().v1.trends.links.list()
@ -10,6 +11,13 @@ const hideNewsTips = useLocalStorage(STORAGE_KEY_HIDE_EXPLORE_NEWS_TIPS, false)
useHydratedHead({ useHydratedHead({
title: () => `${t('tab.news')} | ${t('nav.explore')}`, title: () => `${t('tab.news')} | ${t('nav.explore')}`,
}) })
const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '')
lastAccessedExploreRoute.value = route.path.replace(/(.*\/explore\/?)/, '')
onActivated(() => {
lastAccessedExploreRoute.value = route.path.replace(/(.*\/explore\/?)/, '')
})
</script> </script>
<template> <template>

View File

@ -1,9 +1,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { STORAGE_KEY_HIDE_EXPLORE_TAGS_TIPS } from '~~/constants' import { STORAGE_KEY_HIDE_EXPLORE_TAGS_TIPS, STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE } from '~~/constants'
const { t } = useI18n() const { t } = useI18n()
const route = useRoute()
const { client } = useMasto() const { client } = useMasto()
const paginator = client.value.v1.trends.tags.list({ const paginator = client.value.v1.trends.tags.list({
limit: 20, limit: 20,
}) })
@ -13,6 +14,13 @@ const hideTagsTips = useLocalStorage(STORAGE_KEY_HIDE_EXPLORE_TAGS_TIPS, false)
useHydratedHead({ useHydratedHead({
title: () => `${t('tab.hashtags')} | ${t('nav.explore')}`, title: () => `${t('tab.hashtags')} | ${t('nav.explore')}`,
}) })
const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '')
lastAccessedExploreRoute.value = route.path.replace(/(.*\/explore\/?)/, '')
onActivated(() => {
lastAccessedExploreRoute.value = route.path.replace(/(.*\/explore\/?)/, '')
})
</script> </script>
<template> <template>

View File

@ -1,5 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE } from '~/constants'
const { t } = useI18n() const { t } = useI18n()
const route = useRoute()
// limit: 20 is the default configuration of the official client // limit: 20 is the default configuration of the official client
const paginator = useMastoClient().v2.suggestions.list({ limit: 20 }) const paginator = useMastoClient().v2.suggestions.list({ limit: 20 })
@ -7,6 +10,13 @@ const paginator = useMastoClient().v2.suggestions.list({ limit: 20 })
useHydratedHead({ useHydratedHead({
title: () => `${t('tab.for_you')} | ${t('nav.explore')}`, title: () => `${t('tab.for_you')} | ${t('nav.explore')}`,
}) })
const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '')
lastAccessedExploreRoute.value = route.path.replace(/(.*\/explore\/?)/, '')
onActivated(() => {
lastAccessedExploreRoute.value = route.path.replace(/(.*\/explore\/?)/, '')
})
</script> </script>
<template> <template>

View File

@ -32,6 +32,8 @@ const filter = computed<mastodon.v1.NotificationType | undefined>(() => {
const actualFilter = Array.isArray(rawFilter) ? rawFilter[0] : rawFilter const actualFilter = Array.isArray(rawFilter) ? rawFilter[0] : rawFilter
if (isNotificationFilter(actualFilter)) if (isNotificationFilter(actualFilter))
return actualFilter return actualFilter
return undefined
}) })
const filterIconMap: Record<mastodon.v1.NotificationType, string> = { const filterIconMap: Record<mastodon.v1.NotificationType, string> = {

View File

@ -12,6 +12,8 @@ const filter = computed<mastodon.v1.NotificationType | undefined>(() => {
const actualFilter = Array.isArray(rawFilter) ? rawFilter[0] : rawFilter const actualFilter = Array.isArray(rawFilter) ? rawFilter[0] : rawFilter
if (isNotification(actualFilter)) if (isNotification(actualFilter))
return actualFilter return actualFilter
return undefined
}) })
useHydratedHead({ useHydratedHead({

View File

@ -1,10 +1,12 @@
import { THEME_COLORS } from '~/constants'
export default defineNuxtPlugin(() => { export default defineNuxtPlugin(() => {
const colorMode = useColorMode() const colorMode = useColorMode()
useHead({ useHead({
meta: [{ meta: [{
id: 'theme-color', id: 'theme-color',
name: 'theme-color', name: 'theme-color',
content: () => colorMode.value === 'dark' ? '#111111' : '#fafafa', content: () => colorMode.value === 'dark' ? THEME_COLORS.themeDark : THEME_COLORS.themeLight,
}], }],
}) })
}) })

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
import { Buffer } from 'node:buffer' import { Buffer } from 'node:buffer'
import flatten from 'flat' import { flatten, unflatten } from 'flat'
import { createResolver } from '@nuxt/kit' import { createResolver } from '@nuxt/kit'
import fs from 'fs-extra' import fs from 'fs-extra'
import { currentLocales } from '../config/i18n' import { currentLocales } from '../config/i18n'
@ -51,7 +51,7 @@ async function removeOutdatedTranslations() {
delete targetTranslations[key] delete targetTranslations[key]
} }
const unflattened = flatten.unflatten(targetTranslations) const unflattened = unflatten(targetTranslations)
await fs.writeFile( await fs.writeFile(
path, path,

View File

@ -1,5 +1,5 @@
import { Buffer } from 'node:buffer' import { Buffer } from 'node:buffer'
import flatten from 'flat' import { flatten } from 'flat'
import { createResolver } from '@nuxt/kit' import { createResolver } from '@nuxt/kit'
import fs from 'fs-extra' import fs from 'fs-extra'
import { countryLocaleVariants, currentLocales } from '../config/i18n' import { countryLocaleVariants, currentLocales } from '../config/i18n'

View File

@ -60,6 +60,8 @@ export function createNotificationOptions(
icon, icon,
lang: preferred_locale, lang: preferred_locale,
tag: notification_id, tag: notification_id,
// eslint-disable-next-line ts/prefer-ts-expect-error
// @ts-ignore error missing type, just ignore
timestamp: new Date().getTime(), timestamp: new Date().getTime(),
} }
@ -70,8 +72,11 @@ export function createNotificationOptions(
if (notification.account.avatar_static) if (notification.account.avatar_static)
notificationOptions.icon = notification.account.avatar_static notificationOptions.icon = notification.account.avatar_static
*/ */
if (notification.created_at) if (notification.created_at) {
// eslint-disable-next-line ts/prefer-ts-expect-error
// @ts-ignore error missing type, just ignore
notificationOptions.timestamp = new Date(notification.created_at).getTime() notificationOptions.timestamp = new Date(notification.created_at).getTime()
}
/* TODO: add spolier when actions available, checking also notification type /* TODO: add spolier when actions available, checking also notification type
if (notification.status && (notification.status.spoilerText || notification.status.sensitive)) { if (notification.status && (notification.status.spoilerText || notification.status.sensitive)) {
@ -83,8 +88,11 @@ export function createNotificationOptions(
*/ */
if (notification.status) { if (notification.status) {
// notificationOptions.body = htmlToPlainText(notification.status.content) // notificationOptions.body = htmlToPlainText(notification.status.content)
if (notification.status.media_attachments && notification.status.media_attachments.length > 0 && notification.status.media_attachments[0].preview_url) if (notification.status.media_attachments && notification.status.media_attachments.length > 0 && notification.status.media_attachments[0].preview_url) {
// eslint-disable-next-line ts/prefer-ts-expect-error
// @ts-ignore error missing type, just ignore
notificationOptions.image = notification.status.media_attachments[0].preview_url notificationOptions.image = notification.status.media_attachments[0].preview_url
}
if (notification.type === 'favourite' || notification.type === 'reblog' || notification.type === 'mention') if (notification.type === 'favourite' || notification.type === 'reblog' || notification.type === 'mention')
notificationOptions.data.url = `${user.server}/@${user.account.username}/${notification.status.id}` notificationOptions.data.url = `${user.server}/@${user.account.username}/${notification.status.id}`

View File

@ -85,6 +85,9 @@ em-emoji-picker {
p:last-child { p:last-child {
--at-apply: mb-1; --at-apply: mb-1;
} }
pre {
--at-apply: whitespace-pre-wrap;
}
code { code {
--at-apply: bg-code text-code px1 py0.5 rounded text-0.875em leading-0.8em; --at-apply: bg-code text-code px1 py0.5 rounded text-0.875em leading-0.8em;
} }

View File

@ -56,13 +56,22 @@ export interface Draft {
export type DraftMap = Record<string, Draft> export type DraftMap = Record<string, Draft>
export interface ConfirmDialogLabel { export interface ConfirmDialogOptions {
title: string title: string
description?: string description?: string
confirm?: string confirm?: string
cancel?: string cancel?: string
extraOptionType?: 'mute'
}
export interface ConfirmDialogChoice {
choice: 'confirm' | 'cancel'
extraOptions?: {
mute: {
duration: number
notifications: boolean
}
}
} }
export type ConfirmDialogChoice = 'confirm' | 'cancel'
export interface CommonRouteTabOption { export interface CommonRouteTabOption {
to: RouteLocationRaw to: RouteLocationRaw