diff --git a/.env.example b/.env.example
index 9b0ba49ac3..db9ca41195 100644
--- a/.env.example
+++ b/.env.example
@@ -8,7 +8,7 @@ NUXT_CLOUDFLARE_ACCOUNT_ID=
NUXT_CLOUDFLARE_NAMESPACE_ID=
NUXT_CLOUDFLARE_API_TOKEN=
-# 'cloudflare' | 'fs'
+# 'cloudflare' | 'vercel' | 'fs'
NUXT_STORAGE_DRIVER=
NUXT_STORAGE_FS_BASE=
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index dfb53d373c..601ec79f10 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -17,17 +17,17 @@ jobs:
uses: actions/checkout@v4
- name: Docker meta
id: metal
- uses: docker/metadata-action@v4
+ uses: docker/metadata-action@v5
with:
images: |
ghcr.io/${{ github.repository }}
- name: Set up QEMU
- uses: docker/setup-qemu-action@v2
+ uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
+ uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
if: github.event_name != 'pull_request'
- uses: docker/login-action@v2
+ uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 4b6c677a74..beffb480fe 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -6,7 +6,7 @@
"unstorage"
],
"editor.codeActionsOnSave": {
- "source.fixAll.eslint": true
+ "source.fixAll.eslint": "explicit"
},
"editor.formatOnSave": false,
"files.associations": {
diff --git a/README.md b/README.md
index 4e36aadd9d..5076d2ae81 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,42 @@ If you want to contribute to the parent project, check out [its repo](https://gi
The crab team maintains a deployment at:
-- 🦀 Production: [elk.bumscode.com](https://elk.bumscode.com)
+- 🦀 Production: [crab.bumscode.com](https://crab.bumscode.com)
+
+### Self-Host Docker Deployment
+
+In order to host Elk yourself you can use the provided Dockerfile to build a container with elk. Be aware, that Elk only loads properly if the connection is done via SSL/TLS. The Docker container itself does not provide any SSL/TLS handling. You'll have to add this bit yourself.
+One could put Elk behind popular reverse proxies with SSL Handling like Traefik, NGINX etc.
+
+1. checkout source ```git clone https://github.com/elk-zone/elk.git```
+1. got into new source dir: ```cd elk```
+1. build Docker image: ```docker build .```
+1. create local storage directory for settings: ```mkdir elk-storage```
+1. adjust permissions of storage dir: ```sudo chown 911:911 ./elk-storage```
+1. start container: ```docker-compose up -d```
+
+> [!NOTE]
+> The provided Dockerfile creates a container which will eventually run Elk as non-root user and create a persistent named Docker volume upon first start (if that volume does not yet exist). This volume is always created with root permission. Failing to change the permissions of ```/elk/data``` inside this volume to UID:GID 911 (as specified for Elk in the Dockerfile) will prevent Elk from storing it's config for user accounts. You either have to fix the permission in the created named volume, or mount a directory with the correct permission to ```/elk/data``` into the container.
+
+
+### Ecosystem
+
+These are known deployments using Elk as an alternative Web client for Mastodon servers or as a base for other projects in the fediverse:
+
+- [elk.fedified.com](https://elk.fedified.com) - Use Elk to log into any compatible instance
+- [elk.me.uk](https://elk.me.uk) - Use Elk to log into any compatible instance, hosted on Google Cloud Run with no Cloudflare proxy
+- [elk.h4.io](https://elk.h4.io) - Use Elk for the `h4.io` Server
+- [elk.universeodon.com](https://elk.universeodon.com) - Use Elk for the Universeodon Server
+- [elk.vmst.io](https://elk.vmst.io) - Use Elk for the `vmst.io` Server
+- [elk.hostux.social](https://elk.hostux.social) - Use Elk for the `hostux.social` Server
+- [elk.cupoftea.social](https://elk.cupoftea.social) - Use Elk for the `cupoftea.social` Server
+- [elk.aus.social](https://elk.aus.social) - Use Elk for the `aus.social` Server
+- [elk.mstdn.ca](https://elk.mstdn.ca) - Use Elk for the `mstdn.ca` Server
+- [elk.mastodonapp.uk](https://elk.mastodonapp.uk) - Use Elk for the `mastodonapp.uk` Server
+- [elk.bolha.us](https://elk.bolha.us) - Use Elk for the `bolha.us` Server
+
+> **Note**: Community deployments are **NOT** maintained by the Elk team. It may not be synced with Elk's source code. Please do your own research about the host servers before using them.
+
## 💖 Sponsors
diff --git a/app.vue b/app.vue
index 3ce0a9516e..89c1fa0e4d 100644
--- a/app.vue
+++ b/app.vue
@@ -5,9 +5,11 @@ provideGlobalCommands()
const route = useRoute()
if (process.server && !route.path.startsWith('/settings')) {
+ const url = useRequestURL()
+
useHead({
meta: [
- { property: 'og:url', content: `https://elk.zone${route.path}` },
+ { property: 'og:url', content: `${url.origin}${route.path}` },
],
})
}
diff --git a/components/account/AccountFollowButton.vue b/components/account/AccountFollowButton.vue
index bb7cc240d4..36916a7d56 100644
--- a/components/account/AccountFollowButton.vue
+++ b/components/account/AccountFollowButton.vue
@@ -19,7 +19,7 @@ const { client } = $(useMasto())
async function unblock() {
relationship!.blocking = false
try {
- const newRel = await client.v1.accounts.unblock(account.id)
+ const newRel = await client.v1.accounts.$select(account.id).unblock()
Object.assign(relationship!, newRel)
}
catch (err) {
@@ -32,7 +32,7 @@ async function unblock() {
async function unmute() {
relationship!.muting = false
try {
- const newRel = await client.v1.accounts.unmute(account.id)
+ const newRel = await client.v1.accounts.$select(account.id).unmute()
Object.assign(relationship!, newRel)
}
catch (err) {
diff --git a/components/account/AccountFollowRequestButton.vue b/components/account/AccountFollowRequestButton.vue
index 61cab91839..2c60a76084 100644
--- a/components/account/AccountFollowRequestButton.vue
+++ b/components/account/AccountFollowRequestButton.vue
@@ -12,7 +12,7 @@ async function authorizeFollowRequest() {
relationship!.requestedBy = false
relationship!.followedBy = true
try {
- const newRel = await client.v1.followRequests.authorize(account.id)
+ const newRel = await client.v1.followRequests.$select(account.id).authorize()
Object.assign(relationship!, newRel)
}
catch (err) {
@@ -25,7 +25,7 @@ async function authorizeFollowRequest() {
async function rejectFollowRequest() {
relationship!.requestedBy = false
try {
- const newRel = await client.v1.followRequests.reject(account.id)
+ const newRel = await client.v1.followRequests.$select(account.id).reject()
Object.assign(relationship!, newRel)
}
catch (err) {
diff --git a/components/account/AccountHeader.vue b/components/account/AccountHeader.vue
index 85d2cfe5f1..c97cf369ba 100644
--- a/components/account/AccountHeader.vue
+++ b/components/account/AccountHeader.vue
@@ -53,7 +53,7 @@ function previewAvatar() {
async function toggleNotifications() {
relationship!.notifying = !relationship?.notifying
try {
- const newRel = await client.v1.accounts.follow(account.id, { notify: relationship?.notifying })
+ const newRel = await client.v1.accounts.$select(account.id).follow({ notify: relationship?.notifying })
Object.assign(relationship!, newRel)
}
catch {
@@ -97,7 +97,7 @@ async function editNote(event: Event) {
if (relationship.note?.trim() === newNote.trim())
return
- const newNoteApiResult = await client.v1.accounts.createNote(account.id, { comment: newNote })
+ const newNoteApiResult = await client.v1.accounts.$select(account.id).note.create({ comment: newNote })
relationship.note = newNoteApiResult.note
personalNoteDraft.value = relationship.note ?? ''
}
diff --git a/components/account/AccountLockIndicator.vue b/components/account/AccountLockIndicator.vue
index 7384be535e..4d6cb26325 100644
--- a/components/account/AccountLockIndicator.vue
+++ b/components/account/AccountLockIndicator.vue
@@ -2,6 +2,8 @@
defineProps<{
showLabel?: boolean
}>()
+
+const { t } = useI18n()
@@ -15,7 +17,7 @@ defineProps<{
- Lock
+ {{ t('account.lock') }}
diff --git a/components/account/AccountMoreButton.vue b/components/account/AccountMoreButton.vue
index 5c524e9a52..eb78d16e3d 100644
--- a/components/account/AccountMoreButton.vue
+++ b/components/account/AccountMoreButton.vue
@@ -26,14 +26,15 @@ function shareAccount() {
async function toggleReblogs() {
if (!relationship!.showingReblogs && await openConfirmDialog({
- title: t('confirm.show_reblogs.title', [account.acct]),
+ title: t('confirm.show_reblogs.title'),
+ description: t('confirm.show_reblogs.description', [account.acct]),
confirm: t('confirm.show_reblogs.confirm'),
cancel: t('confirm.show_reblogs.cancel'),
}) !== 'confirm')
return
const showingReblogs = !relationship?.showingReblogs
- relationship = await client.v1.accounts.follow(account.id, { reblogs: showingReblogs })
+ relationship = await client.v1.accounts.$select(account.id).follow({ reblogs: showingReblogs })
}
async function addUserNote() {
@@ -44,7 +45,7 @@ async function removeUserNote() {
if (!relationship!.note || relationship!.note.length === 0)
return
- const newNote = await client.v1.accounts.createNote(account.id, { comment: '' })
+ const newNote = await client.v1.accounts.$select(account.id).note.create({ comment: '' })
relationship!.note = newNote.note
emit('removeNote')
}
diff --git a/components/account/AccountPaginator.vue b/components/account/AccountPaginator.vue
index 86bcccb89d..0445439d12 100644
--- a/components/account/AccountPaginator.vue
+++ b/components/account/AccountPaginator.vue
@@ -1,8 +1,8 @@
diff --git a/components/timeline/TimelineDomainBlocks.vue b/components/timeline/TimelineDomainBlocks.vue
index 0763e8ec19..a4dfcf205f 100644
--- a/components/timeline/TimelineDomainBlocks.vue
+++ b/components/timeline/TimelineDomainBlocks.vue
@@ -3,7 +3,7 @@ const { client } = $(useMasto())
const paginator = client.v1.domainBlocks.list()
async function unblock(domain: string) {
- await client.v1.domainBlocks.unblock(domain)
+ await client.v1.domainBlocks.remove({ domain })
}
diff --git a/components/timeline/TimelineHome.vue b/components/timeline/TimelineHome.vue
index 957937948c..905335d347 100644
--- a/components/timeline/TimelineHome.vue
+++ b/components/timeline/TimelineHome.vue
@@ -1,8 +1,8 @@
diff --git a/components/timeline/TimelinePublic.vue b/components/timeline/TimelinePublic.vue
index ec4fac8508..2a110e9a11 100644
--- a/components/timeline/TimelinePublic.vue
+++ b/components/timeline/TimelinePublic.vue
@@ -1,8 +1,8 @@
diff --git a/composables/cache.ts b/composables/cache.ts
index 4a8d122f5a..68b2e0023a 100644
--- a/composables/cache.ts
+++ b/composables/cache.ts
@@ -24,7 +24,7 @@ export function fetchStatus(id: string, force = false): Promise {
cacheStatus(status)
return status
@@ -44,7 +44,7 @@ export function fetchAccountById(id?: string | null): Promise {
if (r.acct && !r.acct.includes('@') && domain)
r.acct = `${r.acct}@${domain}`
@@ -74,7 +74,7 @@ export async function fetchAccountByHandle(acct: string): Promise = {}) {
const tree = parseMastodonHTML(html, {
diff --git a/composables/content-render.ts b/composables/content-render.ts
index bded37679e..6206bd2bb1 100644
--- a/composables/content-render.ts
+++ b/composables/content-render.ts
@@ -1,5 +1,5 @@
-import { TEXT_NODE } from 'ultrahtml'
-import type { Node } from 'ultrahtml'
+import { ELEMENT_NODE, TEXT_NODE } from 'ultrahtml'
+import type { ElementNode, Node } from 'ultrahtml'
import { Fragment, h, isVNode } from 'vue'
import type { VNode } from 'vue'
import { RouterLink } from 'vue-router'
@@ -98,6 +98,23 @@ function treeToVNode(
return null
}
+function addBdiNode(node: Node) {
+ if (node.children.length === 1 && node.children[0].type === ELEMENT_NODE && node.children[0].name === 'bdi')
+ return
+
+ const children = node.children.splice(0, node.children.length)
+ const bdi = {
+ name: 'bdi',
+ parent: node,
+ loc: node.loc,
+ type: ELEMENT_NODE,
+ attributes: {},
+ children,
+ } satisfies ElementNode
+ children.forEach((n: Node) => n.parent = bdi)
+ node.children.push(bdi)
+}
+
function handleMention(el: Node) {
// Redirect mentions to the user page
if (el.name === 'a' && el.attributes.class?.includes('mention')) {
@@ -108,11 +125,13 @@ function handleMention(el: Node) {
const [, server, username] = matchUser
const handle = `${username}@${server.replace(/(.+\.)(.+\..+)/, '$2')}`
el.attributes.href = `/${server}/@${username}`
+ addBdiNode(el)
return h(AccountHoverWrapper, { handle, class: 'inline-block' }, () => nodeToVNode(el))
}
const matchTag = href.match(TagLinkRE)
if (matchTag) {
const [, , name] = matchTag
+ addBdiNode(el)
el.attributes.href = `/${currentServer.value}/tags/${name}`
}
}
diff --git a/composables/masto/icons.ts b/composables/masto/icons.ts
index 6c68351c30..ce07895deb 100644
--- a/composables/masto/icons.ts
+++ b/composables/masto/icons.ts
@@ -4,11 +4,13 @@ export const accountFieldIcons: Record = Object.fromEntries(Obje
Bilibili: 'i-ri:bilibili-line',
Birth: 'i-ri:calendar-line',
Blog: 'i-ri:newspaper-line',
+ Bluesky: 'i-ri:bluesky-line',
City: 'i-ri:map-pin-2-line',
Dingding: 'i-ri:dingding-line',
Discord: 'i-ri:discord-line',
Douban: 'i-ri:douban-line',
Facebook: 'i-ri:facebook-line',
+ Friendica: 'i-ri:friendica-line',
GitHub: 'i-ri:github-line',
GitLab: 'i-ri:gitlab-line',
GPG: 'i-ri:key-2-line',
@@ -40,6 +42,7 @@ export const accountFieldIcons: Record = Object.fromEntries(Obje
Switch: 'i-ri:switch-line',
Telegram: 'i-ri:telegram-line',
Threads: 'i-ri:threads-line',
+ TikTok: 'i-ri:tiktok-line',
Tumblr: 'i-ri:tumblr-line',
Twitch: 'i-ri:twitch-line',
Twitter: 'i-ri:twitter-line',
diff --git a/composables/masto/masto.ts b/composables/masto/masto.ts
index 2e073c34a5..2aa11fa80b 100644
--- a/composables/masto/masto.ts
+++ b/composables/masto/masto.ts
@@ -1,27 +1,14 @@
import type { Pausable } from '@vueuse/core'
-import type { CreateClientParams, WsEvents, mastodon } from 'masto'
-import { createClient, fetchV1Instance } from 'masto'
+import type { mastodon } from 'masto'
+import { createRestAPIClient, createStreamingAPIClient } from 'masto'
import type { Ref } from 'vue'
import type { ElkInstance } from '../users'
-import type { Mutable } from '~/types/utils'
import type { UserLogin } from '~/types'
export function createMasto() {
- let client = $shallowRef(undefined as never)
- let params = $ref>()
- const canStreaming = $computed(() => !!params?.streamingApiUrl)
-
- const setParams = (newParams: Partial) => {
- const p = { ...params, ...newParams } as CreateClientParams
- client = createClient(p)
- params = p
- }
-
return {
- client: $$(client),
- params: readonly($$(params)),
- canStreaming: $$(canStreaming),
- setParams,
+ client: shallowRef(undefined as never),
+ streamingClient: shallowRef(),
}
}
export type ElkMasto = ReturnType
@@ -34,23 +21,25 @@ export function useMastoClient() {
}
export function mastoLogin(masto: ElkMasto, user: Pick) {
- const { setParams } = $(masto)
-
const server = user.server
const url = `https://${server}`
const instance: ElkInstance = reactive(getInstanceCache(server) || { uri: server, accountDomain: server })
- setParams({
- url,
- accessToken: user?.token,
- disableVersionCheck: true,
- streamingApiUrl: instance?.urls?.streamingApi,
- })
+ const accessToken = user.token
- fetchV1Instance({ url }).then((newInstance) => {
+ const createStreamingClient = (streamingApiUrl: string | undefined) => {
+ return streamingApiUrl ? createStreamingAPIClient({ streamingApiUrl, accessToken, implementation: globalThis.WebSocket }) : undefined
+ }
+
+ const streamingApiUrl = instance?.urls?.streamingApi
+ masto.client.value = createRestAPIClient({ url, accessToken })
+ masto.streamingClient.value = createStreamingClient(streamingApiUrl)
+
+ // Refetch instance info in the background on login
+ masto.client.value.v1.instance.fetch().then((newInstance) => {
Object.assign(instance, newInstance)
- setParams({
- streamingApiUrl: newInstance.urls.streamingApi,
- })
+ if (newInstance.urls.streamingApi !== streamingApiUrl)
+ masto.streamingClient.value = createStreamingClient(newInstance.urls.streamingApi)
+
instanceStorage.value[server] = newInstance
})
@@ -73,21 +62,21 @@ interface UseStreamingOptions {
}
export function useStreaming(
- cb: (client: mastodon.Client) => Promise,
+ cb: (client: mastodon.streaming.Client) => mastodon.streaming.Subscription,
options: UseStreamingOptions,
-): { stream: Ref | undefined> } & Pausable
+): { stream: Ref } & Pausable
export function useStreaming(
- cb: (client: mastodon.Client) => Promise,
+ cb: (client: mastodon.streaming.Client) => mastodon.streaming.Subscription,
options?: UseStreamingOptions,
-): Ref | undefined>
+): Ref
export function useStreaming(
- cb: (client: mastodon.Client) => Promise,
+ cb: (client: mastodon.streaming.Client) => mastodon.streaming.Subscription,
{ immediate = true, controls }: UseStreamingOptions = {},
-): ({ stream: Ref | undefined> } & Pausable) | Ref | undefined> {
- const { canStreaming, client } = useMasto()
+): ({ stream: Ref } & Pausable) | Ref {
+ const { streamingClient } = useMasto()
const isActive = ref(immediate)
- const stream = ref>()
+ const stream = ref()
function pause() {
isActive.value = false
@@ -99,15 +88,15 @@ export function useStreaming(
function cleanup() {
if (stream.value) {
- stream.value.then(s => s.disconnect()).catch(() => Promise.resolve())
+ stream.value.unsubscribe()
stream.value = undefined
}
}
watchEffect(() => {
cleanup()
- if (canStreaming.value && isActive.value)
- stream.value = cb(client.value)
+ if (streamingClient.value && isActive.value)
+ stream.value = cb(streamingClient.value)
})
if (process.client && !process.test)
diff --git a/composables/masto/notification.ts b/composables/masto/notification.ts
index 65df56bc20..8577b25213 100644
--- a/composables/masto/notification.ts
+++ b/composables/masto/notification.ts
@@ -1,11 +1,11 @@
-import type { WsEvents } from 'masto'
+import type { mastodon } from 'masto'
-const notifications = reactive, string[]]>>({})
+const notifications = reactive, string[]]>>({})
export function useNotifications() {
const id = currentUser.value?.account.id
- const { client, canStreaming } = $(useMasto())
+ const { client, streamingClient } = $(useMasto())
async function clearNotifications() {
if (!id || !notifications[id])
@@ -19,21 +19,27 @@ export function useNotifications() {
}
}
+ async function processNotifications(stream: mastodon.streaming.Subscription, id: string) {
+ for await (const entry of stream) {
+ if (entry.event === 'notification' && notifications[id])
+ notifications[id]![1].unshift(entry.payload.id)
+ }
+ }
+
async function connect(): Promise {
- if (!isHydrated.value || !id || notifications[id] || !currentUser.value?.token)
+ if (!isHydrated.value || !id || notifications[id] !== undefined || !currentUser.value?.token)
return
let resolveStream
- const stream = new Promise(resolve => resolveStream = resolve)
- notifications[id] = [stream, []]
+ const streamPromise = new Promise(resolve => resolveStream = resolve)
+ notifications[id] = [streamPromise, []]
+
+ await until($$(streamingClient)).toBe(true)
- await until($$(canStreaming)).toBe(true)
+ const stream = streamingClient!.user.subscribe()
+ resolveStream!(stream)
- client.v1.stream.streamUser().then(resolveStream)
- stream.then(s => s.on('notification', (n) => {
- if (notifications[id])
- notifications[id]![1].unshift(n.id)
- }))
+ processNotifications(stream, id)
const position = await client.v1.markers.fetch({ timeline: ['notifications'] })
const paginator = client.v1.notifications.list({ limit: 30 })
@@ -55,7 +61,7 @@ export function useNotifications() {
function disconnect(): void {
if (!id || !notifications[id])
return
- notifications[id]![0].then(stream => stream.disconnect())
+ notifications[id]![0].then(stream => stream.unsubscribe())
notifications[id] = undefined
}
@@ -67,7 +73,6 @@ export function useNotifications() {
return {
notifications: computed(() => id ? notifications[id]?.[1].length ?? 0 : 0),
- disconnect,
clearNotifications,
}
}
diff --git a/composables/masto/publish.ts b/composables/masto/publish.ts
index 9c5ed276c2..5d70383fa5 100644
--- a/composables/masto/publish.ts
+++ b/composables/masto/publish.ts
@@ -93,7 +93,7 @@ export function usePublish(options: {
language: draft.params.language || preferredLanguage,
poll,
...(isGlitchEdition.value ? { 'content-type': 'text/markdown' } : {}),
- } as mastodon.v1.CreateStatusParams
+ } as mastodon.rest.v1.CreateStatusParams
if (process.dev) {
// eslint-disable-next-line no-console
@@ -116,14 +116,13 @@ export function usePublish(options: {
}
else {
- const updatePayload = {
+ status = await client.v1.statuses.$select(draft.editingStatus.id).update({
...payload,
mediaAttributes: draft.attachments.map(media => ({
id: media.id,
description: media.description,
})),
- } as mastodon.v1.UpdateStatusParams
- status = await client.v1.statuses.update(draft.editingStatus.id, updatePayload)
+ })
}
if (draft.params.inReplyToId)
navigateToStatus({ status })
@@ -232,7 +231,7 @@ export function useUploadMediaAttachment(draftRef: Ref) {
if (draft.attachments.length < limit) {
isExceedingAttachmentLimit = false
try {
- const attachment = await client.v1.mediaAttachments.create({
+ const attachment = await client.v1.media.create({
file: await processFile(file),
})
draft.attachments.push(attachment)
@@ -266,7 +265,7 @@ export function useUploadMediaAttachment(draftRef: Ref) {
async function setDescription(att: mastodon.v1.MediaAttachment, description: string) {
att.description = description
if (!draft.editingStatus)
- await client.v1.mediaAttachments.update(att.id, { description: att.description })
+ await client.v1.media.$select(att.id).update({ description: att.description })
}
function removeAttachment(index: number) {
diff --git a/composables/masto/relationship.ts b/composables/masto/relationship.ts
index 00f3cf721e..85e99cddf0 100644
--- a/composables/masto/relationship.ts
+++ b/composables/masto/relationship.ts
@@ -27,7 +27,7 @@ export function useRelationship(account: mastodon.v1.Account): Ref !r.value)
- const relationships = await useMastoClient().v1.accounts.fetchRelationships(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++)
requested[i][1].value = relationships[i]
}
@@ -41,6 +41,7 @@ export async function toggleFollowAccount(relationship: mastodon.v1.Relationship
if (unfollow) {
if (await openConfirmDialog({
title: i18n.t('confirm.unfollow.title'),
+ description: i18n.t('confirm.unfollow.description', [`@${account.acct}`]),
confirm: i18n.t('confirm.unfollow.confirm'),
cancel: i18n.t('confirm.unfollow.cancel'),
}) !== 'confirm')
@@ -58,7 +59,7 @@ export async function toggleFollowAccount(relationship: mastodon.v1.Relationship
relationship!.following = true
}
- relationship = await client.v1.accounts[unfollow ? 'unfollow' : 'follow'](account.id)
+ relationship = await client.v1.accounts.$select(account.id)[unfollow ? 'unfollow' : 'follow']()
}
export async function toggleMuteAccount(relationship: mastodon.v1.Relationship, account: mastodon.v1.Account) {
@@ -66,7 +67,8 @@ export async function toggleMuteAccount(relationship: mastodon.v1.Relationship,
const i18n = useNuxtApp().$i18n
if (!relationship!.muting && await openConfirmDialog({
- title: i18n.t('confirm.mute_account.title', [account.acct]),
+ title: i18n.t('confirm.mute_account.title'),
+ description: i18n.t('confirm.mute_account.description', [account.acct]),
confirm: i18n.t('confirm.mute_account.confirm'),
cancel: i18n.t('confirm.mute_account.cancel'),
}) !== 'confirm')
@@ -74,10 +76,10 @@ export async function toggleMuteAccount(relationship: mastodon.v1.Relationship,
relationship!.muting = !relationship!.muting
relationship = relationship!.muting
- ? await client.v1.accounts.mute(account.id, {
+ ? await client.v1.accounts.$select(account.id).mute({
// TODO support more options
})
- : await client.v1.accounts.unmute(account.id)
+ : await client.v1.accounts.$select(account.id).unmute()
}
export async function toggleBlockAccount(relationship: mastodon.v1.Relationship, account: mastodon.v1.Account) {
@@ -85,14 +87,15 @@ export async function toggleBlockAccount(relationship: mastodon.v1.Relationship,
const i18n = useNuxtApp().$i18n
if (!relationship!.blocking && await openConfirmDialog({
- title: i18n.t('confirm.block_account.title', [account.acct]),
+ title: i18n.t('confirm.block_account.title'),
+ description: i18n.t('confirm.block_account.description', [account.acct]),
confirm: i18n.t('confirm.block_account.confirm'),
cancel: i18n.t('confirm.block_account.cancel'),
}) !== 'confirm')
return
relationship!.blocking = !relationship!.blocking
- relationship = await client.v1.accounts[relationship!.blocking ? 'block' : 'unblock'](account.id)
+ relationship = await client.v1.accounts.$select(account.id)[relationship!.blocking ? 'block' : 'unblock']()
}
export async function toggleBlockDomain(relationship: mastodon.v1.Relationship, account: mastodon.v1.Account) {
@@ -100,12 +103,13 @@ export async function toggleBlockDomain(relationship: mastodon.v1.Relationship,
const i18n = useNuxtApp().$i18n
if (!relationship!.domainBlocking && await openConfirmDialog({
- title: i18n.t('confirm.block_domain.title', [getServerName(account)]),
+ title: i18n.t('confirm.block_domain.title'),
+ description: i18n.t('confirm.block_domain.description', [getServerName(account)]),
confirm: i18n.t('confirm.block_domain.confirm'),
cancel: i18n.t('confirm.block_domain.cancel'),
}) !== 'confirm')
return
relationship!.domainBlocking = !relationship!.domainBlocking
- await client.v1.domainBlocks[relationship!.domainBlocking ? 'block' : 'unblock'](getServerName(account))
+ await client.v1.domainBlocks[relationship!.domainBlocking ? 'create' : 'remove']({ domain: getServerName(account) })
}
diff --git a/composables/masto/search.ts b/composables/masto/search.ts
index 3e337cf74e..b672a87be2 100644
--- a/composables/masto/search.ts
+++ b/composables/masto/search.ts
@@ -1,9 +1,9 @@
import type { MaybeRefOrGetter } from '@vueuse/core'
-import type { Paginator, mastodon } from 'masto'
+import type { mastodon } from 'masto'
import type { RouteLocation } from 'vue-router'
export type UseSearchOptions = MaybeRefOrGetter<
- Partial>
+ Partial>
>
export interface BuildSearchResult {
@@ -30,7 +30,7 @@ export function useSearch(query: MaybeRefOrGetter, options: UseSearchOpt
const q = $computed(() => resolveUnref(query).trim())
- let paginator: Paginator | undefined
+ let paginator: mastodon.Paginator | undefined
const appendResults = (results: mastodon.v2.Search, empty = false) => {
if (empty) {
@@ -72,7 +72,7 @@ export function useSearch(query: MaybeRefOrGetter, options: UseSearchOpt
* Based on the source it seems like modifying the params when calling next would result in a new search,
* but that doesn't seem to be the case. So instead we just create a new paginator with the new params.
*/
- paginator = client.v2.search({
+ paginator = client.v2.search.list({
q,
...resolveUnref(options),
resolve: !!currentUser.value,
diff --git a/composables/masto/status.ts b/composables/masto/status.ts
index 5dc6ee879d..5120837f9c 100644
--- a/composables/masto/status.ts
+++ b/composables/masto/status.ts
@@ -61,7 +61,7 @@ export function useStatusActions(props: StatusActionsProps) {
const toggleReblog = () => toggleStatusAction(
'reblogged',
- () => client.v1.statuses[status.reblogged ? 'unreblog' : 'reblog'](status.id).then((res) => {
+ () => client.v1.statuses.$select(status.id)[status.reblogged ? 'unreblog' : 'reblog']().then((res) => {
if (status.reblogged)
// returns the original status
return res.reblog!
@@ -72,23 +72,23 @@ export function useStatusActions(props: StatusActionsProps) {
const toggleFavourite = () => toggleStatusAction(
'favourited',
- () => client.v1.statuses[status.favourited ? 'unfavourite' : 'favourite'](status.id),
+ () => client.v1.statuses.$select(status.id)[status.favourited ? 'unfavourite' : 'favourite'](),
'favouritesCount',
)
const toggleBookmark = () => toggleStatusAction(
'bookmarked',
- () => client.v1.statuses[status.bookmarked ? 'unbookmark' : 'bookmark'](status.id),
+ () => client.v1.statuses.$select(status.id)[status.bookmarked ? 'unbookmark' : 'bookmark'](),
)
const togglePin = async () => toggleStatusAction(
'pinned',
- () => client.v1.statuses[status.pinned ? 'unpin' : 'pin'](status.id),
+ () => client.v1.statuses.$select(status.id)[status.pinned ? 'unpin' : 'pin'](),
)
const toggleMute = async () => toggleStatusAction(
'muted',
- () => client.v1.statuses[status.muted ? 'unmute' : 'mute'](status.id),
+ () => client.v1.statuses.$select(status.id)[status.muted ? 'unmute' : 'mute'](),
)
return {
diff --git a/composables/masto/statusDrafts.ts b/composables/masto/statusDrafts.ts
index 82a273078b..34b429bb35 100644
--- a/composables/masto/statusDrafts.ts
+++ b/composables/masto/statusDrafts.ts
@@ -25,7 +25,7 @@ function getDefaultVisibility(currentVisibility: mastodon.v1.StatusVisibility) {
: preferredVisibility
}
-export function getDefaultDraft(options: Partial & Omit> = {}): Draft {
+export function getDefaultDraft(options: Partial & Omit> = {}): Draft {
const {
attachments = [],
initialText = '',
diff --git a/composables/paginator.ts b/composables/paginator.ts
index 4ef496675d..9724297af9 100644
--- a/composables/paginator.ts
+++ b/composables/paginator.ts
@@ -1,11 +1,10 @@
-import type { Paginator, WsEvents, mastodon } from 'masto'
+import type { mastodon } from 'masto'
import type { Ref } from 'vue'
import type { PaginatorState } from '~/types'
export function usePaginator(
- _paginator: Paginator,
- stream: Ref | undefined>,
- eventType: 'notification' | 'update' = 'update',
+ _paginator: mastodon.Paginator,
+ stream: Ref,
preprocess: (items: (T | U)[]) => U[] = items => items as unknown as U[],
buffer = 10,
) {
@@ -30,10 +29,15 @@ export function usePaginator(
prevItems.value = []
}
- watch(stream, (stream) => {
- stream?.then((s) => {
- s.on(eventType, (status) => {
- if ('uri' in status)
+ watch(stream, async (stream) => {
+ if (!stream)
+ return
+
+ for await (const entry of stream) {
+ if (entry.event === 'update') {
+ const status = entry.payload
+
+ if ('uri' in entry)
cacheStatus(status, undefined, true)
const index = prevItems.value.findIndex((i: any) => i.id === status.id)
@@ -41,27 +45,27 @@ export function usePaginator(
prevItems.value.splice(index, 1)
prevItems.value.unshift(status as any)
- })
-
- // TODO: update statuses
- s.on('status.update', (status) => {
+ }
+ else if (entry.event === 'status.update') {
+ const status = entry.payload
cacheStatus(status, undefined, true)
const data = items.value as mastodon.v1.Status[]
const index = data.findIndex(s => s.id === status.id)
if (index >= 0)
data[index] = status
- })
+ }
- s.on('delete', (id) => {
+ else if (entry.event === 'delete') {
+ const id = entry.payload
removeCachedStatus(id)
const data = items.value as mastodon.v1.Status[]
const index = data.findIndex(s => s.id === id)
if (index >= 0)
data.splice(index, 1)
- })
- })
+ }
+ }
}, { immediate: true })
async function loadNext() {
diff --git a/composables/push-notifications/createPushSubscription.ts b/composables/push-notifications/createPushSubscription.ts
index fd3d260f88..4368a40bb7 100644
--- a/composables/push-notifications/createPushSubscription.ts
+++ b/composables/push-notifications/createPushSubscription.ts
@@ -8,7 +8,7 @@ import { PushSubscriptionError } from '~/composables/push-notifications/types'
export async function createPushSubscription(user: RequiredUserLogin,
notificationData: CreatePushNotification,
- policy: mastodon.v1.SubscriptionPolicy = 'all',
+ policy: mastodon.v1.WebPushSubscriptionPolicy = 'all',
force = false): Promise {
const { server: serverEndpoint, vapidKey } = user
@@ -115,10 +115,10 @@ async function removePushNotificationDataOnError(e: Error) {
async function sendSubscriptionToBackend(
subscription: PushSubscription,
data: CreatePushNotification,
- policy: mastodon.v1.SubscriptionPolicy,
+ policy: mastodon.v1.WebPushSubscriptionPolicy,
): Promise {
const { endpoint, keys } = subscription.toJSON()
- const params: mastodon.v1.CreateWebPushSubscriptionParams = {
+ return await useMastoClient().v1.push.subscription.create({
policy,
subscription: {
endpoint: endpoint!,
@@ -128,7 +128,5 @@ async function sendSubscriptionToBackend(
},
},
data,
- }
-
- return await useMastoClient().v1.webPushSubscriptions.create(params)
+ })
}
diff --git a/composables/push-notifications/types.ts b/composables/push-notifications/types.ts
index 979c766961..5c344b8274 100644
--- a/composables/push-notifications/types.ts
+++ b/composables/push-notifications/types.ts
@@ -14,11 +14,11 @@ export interface RequiredUserLogin extends Required | null
- policy?: mastodon.v1.SubscriptionPolicy
+ policy?: mastodon.v1.WebPushSubscriptionPolicy
}
export type PushNotificationRequest = Record
-export type PushNotificationPolicy = Record
+export type PushNotificationPolicy = Record
export interface CustomEmojisInfo {
lastUpdate: number
diff --git a/composables/push-notifications/usePushManager.ts b/composables/push-notifications/usePushManager.ts
index 09f987579c..b092bd316b 100644
--- a/composables/push-notifications/usePushManager.ts
+++ b/composables/push-notifications/usePushManager.ts
@@ -61,7 +61,7 @@ export function usePushManager() {
const subscribe = async (
notificationData?: CreatePushNotification,
- policy?: mastodon.v1.SubscriptionPolicy,
+ policy?: mastodon.v1.WebPushSubscriptionPolicy,
force?: boolean,
): Promise => {
if (!isSupported)
@@ -116,7 +116,7 @@ export function usePushManager() {
await removePushNotificationData(currentUser.value)
}
- const saveSettings = async (policy?: mastodon.v1.SubscriptionPolicy) => {
+ const saveSettings = async (policy?: mastodon.v1.WebPushSubscriptionPolicy) => {
if (policy)
pushNotificationData.value.policy = policy
@@ -173,7 +173,7 @@ export function usePushManager() {
if (policyChanged)
await subscribe(data, policy, true)
else
- currentUser.value.pushSubscription = await client.v1.webPushSubscriptions.update({ data })
+ currentUser.value.pushSubscription = await client.v1.push.subscription.update({ data })
policyChanged && await nextTick()
@@ -198,7 +198,7 @@ export function usePushManager() {
function createRawSettings(
pushSubscription?: mastodon.v1.WebPushSubscription,
- subscriptionPolicy?: mastodon.v1.SubscriptionPolicy,
+ subscriptionPolicy?: mastodon.v1.WebPushSubscriptionPolicy,
) {
return {
follow: pushSubscription?.alerts.follow ?? true,
diff --git a/composables/settings/definition.ts b/composables/settings/definition.ts
index c918910910..5c9ca28486 100644
--- a/composables/settings/definition.ts
+++ b/composables/settings/definition.ts
@@ -19,6 +19,7 @@ export interface PreferencesSettings {
hideNews: boolean
grayscaleMode: boolean
enableAutoplay: boolean
+ optimizeForLowPerformanceDevice: boolean
enableDataSaving: boolean
enablePinchToZoom: boolean
useStarFavoriteIcon: boolean
@@ -72,6 +73,7 @@ export const DEFAULT__PREFERENCES_SETTINGS: PreferencesSettings = {
hideNews: false,
grayscaleMode: false,
enableAutoplay: true,
+ optimizeForLowPerformanceDevice: false,
enableDataSaving: false,
enablePinchToZoom: false,
useStarFavoriteIcon: false,
diff --git a/composables/shikiji.ts b/composables/shikiji.ts
index 6a2476d553..be620e4fe9 100644
--- a/composables/shikiji.ts
+++ b/composables/shikiji.ts
@@ -5,7 +5,7 @@ const highlighter = ref()
const registeredLang = ref(new Map())
let shikijiImport: Promise | undefined
-export function useHighlighter(lang: Lang) {
+export function useHighlighter(lang: Lang): { promise?: Promise; highlighter?: Highlighter } {
if (!shikijiImport) {
shikijiImport = import('shikiji')
.then(async ({ getHighlighter }) => {
@@ -21,13 +21,15 @@ export function useHighlighter(lang: Lang) {
],
})
})
+
+ return { promise: shikijiImport }
}
if (!highlighter.value)
- return undefined
+ return { promise: shikijiImport }
if (!registeredLang.value.get(lang)) {
- highlighter.value.loadLanguage(lang)
+ const promise = highlighter.value.loadLanguage(lang)
.then(() => {
registeredLang.value.set(lang, true)
})
@@ -37,10 +39,10 @@ export function useHighlighter(lang: Lang) {
registeredLang.value.set(fallbackLang, true)
})
})
- return undefined
+ return { promise }
}
- return highlighter.value
+ return { highlighter: highlighter.value }
}
function useShikijiTheme() {
@@ -60,7 +62,7 @@ function escapeHtml(text: string) {
}
export function highlightCode(code: string, lang: Lang) {
- const highlighter = useHighlighter(lang)
+ const { highlighter } = useHighlighter(lang)
if (!highlighter)
return escapeHtml(code)
diff --git a/composables/tiptap.ts b/composables/tiptap.ts
index 557b27fd48..dd629937e4 100644
--- a/composables/tiptap.ts
+++ b/composables/tiptap.ts
@@ -110,6 +110,9 @@ export function useTiptap(options: UseTiptapOptions) {
class: 'content-editor content-rich',
},
},
+ parseOptions: {
+ preserveWhitespace: 'full',
+ },
autofocus,
editable: true,
})
diff --git a/composables/tiptap/shikiji-parser.ts b/composables/tiptap/shikiji-parser.ts
index 1072d0cc34..8aa488089d 100644
--- a/composables/tiptap/shikiji-parser.ts
+++ b/composables/tiptap/shikiji-parser.ts
@@ -7,11 +7,13 @@ export const shikijiParser: Parser = (options) => {
const lang = options.language ?? 'text'
// Register the language if it's not yet registered
- const highlighter = useHighlighter(lang as BuiltinLanguage)
+ const { highlighter, promise } = useHighlighter(lang as BuiltinLanguage)
- // If the language is not loaded, we return an empty set of decorations
+ // If the highlighter or the language is not available, return a promise that
+ // will resolve when it's ready. When the promise resolves, the editor will
+ // re-parse the code block.
if (!highlighter)
- return []
+ return promise ?? []
if (!parser)
parser = createParser(highlighter)
diff --git a/composables/tiptap/suggestion.ts b/composables/tiptap/suggestion.ts
index eb648e8c2c..0add4f01c4 100644
--- a/composables/tiptap/suggestion.ts
+++ b/composables/tiptap/suggestion.ts
@@ -27,8 +27,8 @@ export const TiptapMentionSuggestion: Partial = process.serve
if (query.length === 0)
return []
- const results = await useMastoClient().v2.search({ q: query, type: 'accounts', limit: 25, resolve: true })
- return results.accounts
+ const paginator = useMastoClient().v2.search.list({ q: query, type: 'accounts', limit: 25, resolve: true })
+ return (await paginator.next()).value?.accounts ?? []
},
render: createSuggestionRenderer(TiptapMentionList),
}
@@ -40,14 +40,14 @@ export const TiptapHashtagSuggestion: Partial = {
if (query.length === 0)
return []
- const results = await useMastoClient().v2.search({
+ const paginator = useMastoClient().v2.search.list({
q: query,
type: 'hashtags',
limit: 25,
resolve: false,
excludeUnreviewed: true,
})
- return results.hashtags
+ return (await paginator.next()).value?.hashtags ?? []
},
render: createSuggestionRenderer(TiptapHashtagList),
}
diff --git a/composables/users.ts b/composables/users.ts
index 5bdc33b7fa..00fbf0fc9d 100644
--- a/composables/users.ts
+++ b/composables/users.ts
@@ -149,7 +149,7 @@ export async function loginTo(masto: ElkMasto, user: Overwrite Promise.resolve(undefined))
+ ? client.v1.push.subscription.fetch().catch(() => Promise.resolve(undefined))
: Promise.resolve(undefined),
])
@@ -172,6 +172,7 @@ export async function loginTo(masto: ElkMasto, user: Overwrite>()
/**
+ * @param account
* @returns `true` when user ticked the preference to always expand posts with content warnings
*/
export function getExpandSpoilersByDefault(account: mastodon.v1.AccountCredentials) {
@@ -179,6 +180,7 @@ export function getExpandSpoilersByDefault(account: mastodon.v1.AccountCredentia
}
/**
+ * @param account
* @returns `true` when user selected "Always show media" as Media Display preference
*/
export function getExpandMediaByDefault(account: mastodon.v1.AccountCredentials) {
@@ -186,13 +188,14 @@ export function getExpandMediaByDefault(account: mastodon.v1.AccountCredentials)
}
/**
+ * @param account
* @returns `true` when user selected "Always hide media" as Media Display preference
*/
export function getHideMediaByDefault(account: mastodon.v1.AccountCredentials) {
return accountPreferencesMap.get(account.acct)?.['reading:expand:media'] === 'hide_all' ?? false
}
-export async function fetchAccountInfo(client: mastodon.Client, server: string) {
+export async function fetchAccountInfo(client: mastodon.rest.Client, server: string) {
// Try to fetch user preferences if the backend supports it.
const fetchPrefs = async (): Promise> => {
try {
@@ -267,7 +270,7 @@ export async function removePushNotifications(user: UserLogin) {
return
// unsubscribe push notifications
- await useMastoClient().v1.webPushSubscriptions.remove().catch(() => Promise.resolve())
+ await useMastoClient().v1.push.subscription.remove().catch(() => Promise.resolve())
}
export async function switchUser(user: UserLogin) {
@@ -336,6 +339,8 @@ interface UseUserLocalStorageCache {
/**
* Create reactive storage for the current user
+ * @param key
+ * @param initial
*/
export function useUserLocalStorage(key: string, initial: () => T): Ref {
if (process.server || process.test)
@@ -382,6 +387,7 @@ export function useUserLocalStorage(key: string, initial: () =
/**
* Clear all storages for the given account
+ * @param account
*/
export function clearUserLocalStorage(account?: mastodon.v1.Account) {
if (!account)
diff --git a/composables/vue.ts b/composables/vue.ts
index a73a3994c4..10b7e21221 100644
--- a/composables/vue.ts
+++ b/composables/vue.ts
@@ -26,6 +26,9 @@ export function useDeactivated() {
* ### When the component is restored from the background
*
* for handling problems caused by the keepalive function
+ *
+ * @param hook
+ * @param target
*/
export function onReactivated(hook: () => void, target?: ComponentInternalInstance | null): void {
const initial = ref(true)
diff --git a/locales/ar.json b/locales/ar.json
index c2dc32bc33..e920084bef 100644
--- a/locales/ar.json
+++ b/locales/ar.json
@@ -15,6 +15,7 @@
"blocked_users": "المستخدمون المحظورون",
"blocking": "محظور",
"bot": "حساب آلي",
+ "copy_account_name": "انسخ اسم الحساب",
"favourites": "المفضلة",
"follow": "إتبع",
"follow_back": "إعادة متابعة",
@@ -119,12 +120,12 @@
"block_account": {
"cancel": "إلغاء",
"confirm": "حظر",
- "title": "هل أنت متأكد أنك تريد حظر {0}؟"
+ "description": "هل أنت متأكد أنك تريد حظر {0}؟"
},
"block_domain": {
"cancel": "إلغاء",
"confirm": "حظر",
- "title": "هل أنت متأكد أنك تريد حظر {0}؟"
+ "description": "هل أنت متأكد أنك تريد حظر {0}؟"
},
"common": {
"cancel": "لا",
@@ -133,27 +134,27 @@
"delete_list": {
"cancel": "إلغاء",
"confirm": "حذف",
- "title": "هل أنت متأكد أنك تريد حذف القائمة \"{0}\"؟"
+ "description": "هل أنت متأكد أنك تريد حذف القائمة \"{0}\"؟"
},
"delete_posts": {
"cancel": "إلغاء",
"confirm": "حذف",
- "title": "هل أنت متأكد أنك تريد حذف هذا المنشور؟"
+ "description": "هل أنت متأكد أنك تريد حذف هذا المنشور؟"
},
"mute_account": {
"cancel": "إلغاء",
"confirm": "كتم",
- "title": "هل أنت متأكد أنك تريد كتم {0}؟"
+ "description": "هل أنت متأكد أنك تريد كتم {0}؟"
},
"show_reblogs": {
"cancel": "إلغاء",
"confirm": "اعرض",
- "title": "هل أنت متأكد أنك تريد إظهار إعادة المدونات من {0}؟"
+ "description": "هل أنت متأكد أنك تريد إظهار إعادة المدونات من {0}؟"
},
"unfollow": {
"cancel": "إلغاء",
"confirm": "إلغاء المتابعة",
- "title": "هل أنت متأكد أنك تريد إلغاء المتابعة؟"
+ "description": "هل أنت متأكد أنك تريد إلغاء المتابعة؟"
}
},
"conversation": {
diff --git a/locales/ca-valencia.json b/locales/ca-valencia.json
index 4dfb7d1420..9906f6515e 100644
--- a/locales/ca-valencia.json
+++ b/locales/ca-valencia.json
@@ -58,36 +58,36 @@
"block_account": {
"cancel": "Cancel·la",
"confirm": "Bloqueja",
- "title": "Segur que vols bloquejar {0}?"
+ "description": "Segur que vols bloquejar {0}?"
},
"block_domain": {
"cancel": "Cancel·la",
"confirm": "Bloqueja",
- "title": "Segur que vols bloquejar {0}?"
+ "description": "Segur que vols bloquejar {0}?"
},
"delete_list": {
"cancel": "Cancel·la",
"confirm": "Elimina",
- "title": "Segur que vols eliminar la llista «{0}»?"
+ "description": "Segur que vols eliminar la llista «{0}»?"
},
"delete_posts": {
"cancel": "Cancel·la",
"confirm": "Elimina",
- "title": "Segur que vols eliminar la publicació?"
+ "description": "Segur que vols eliminar la publicació?"
},
"mute_account": {
"cancel": "Cancel·la",
"confirm": "Silencia",
- "title": "Segur que vols silenciar {0}?"
+ "description": "Segur que vols silenciar {0}?"
},
"show_reblogs": {
"cancel": "Cancel·la",
"confirm": "Mostra",
- "title": "Segur que vols mostrar els impulsos de: {0}?"
+ "description": "Segur que vols mostrar els impulsos de: {0}?"
},
"unfollow": {
"cancel": "Cancel·la",
- "title": "Segur que vols deixar de seguir-lo?"
+ "description": "Segur que vols deixar de seguir-lo?"
}
},
"custom_cards": {
diff --git a/locales/ca.json b/locales/ca.json
index 5d48e254e5..d3626ea3ec 100644
--- a/locales/ca.json
+++ b/locales/ca.json
@@ -13,6 +13,7 @@
"blocked_users": "Usuaris bloquejats",
"blocking": "Bloquejat",
"bot": "BOT",
+ "copy_account_name": "Copia el nom del compte",
"favourites": "Preferits",
"follow": "Segueix",
"follow_back": "Segueix de tornada",
@@ -108,12 +109,12 @@
"block_account": {
"cancel": "Cancel·lar",
"confirm": "Bloc",
- "title": "Confirmes que vols bloquejar {0}?"
+ "description": "Confirmes que vols bloquejar {0}?"
},
"block_domain": {
"cancel": "Cancel·lar",
"confirm": "Bloc",
- "title": "Confirmes que vols bloquejar {0}?"
+ "description": "Confirmes que vols bloquejar {0}?"
},
"common": {
"cancel": "No",
@@ -122,27 +123,27 @@
"delete_list": {
"cancel": "Cancel·lar",
"confirm": "Suprimeix",
- "title": "Esteu segur que voleu suprimir la llista \"{0}\"?"
+ "description": "Esteu segur que voleu suprimir la llista \"{0}\"?"
},
"delete_posts": {
"cancel": "Cancel·lar",
"confirm": "Suprimeix",
- "title": "Esteu segur que voleu suprimir aquesta publicació?"
+ "description": "Esteu segur que voleu suprimir aquesta publicació?"
},
"mute_account": {
"cancel": "Cancel·lar",
"confirm": "Silenciar",
- "title": "Confirmes que vols silenciar {0}?"
+ "description": "Confirmes que vols silenciar {0}?"
},
"show_reblogs": {
"cancel": "Cancel·lar",
"confirm": "Espectacle",
- "title": "Confirmes que vols mostrar els augments de {0}?"
+ "description": "Confirmes que vols mostrar els augments de {0}?"
},
"unfollow": {
"cancel": "Cancel·lar",
"confirm": "Deixa de seguir",
- "title": "Estàs segur que vols deixar de seguir?"
+ "description": "Estàs segur que vols deixar de seguir?"
}
},
"conversation": {
diff --git a/locales/cs-CZ.json b/locales/cs-CZ.json
index b7610d502f..eff1d65401 100644
--- a/locales/cs-CZ.json
+++ b/locales/cs-CZ.json
@@ -5,6 +5,7 @@
"blocked_domains": "Zablokované domény",
"blocked_users": "Zablokovaní uživatelé",
"bot": "ROBOT",
+ "copy_account_name": "Zkopírovat název účtu",
"favourites": "Oblíbené",
"follow": "Sledovat",
"follow_back": "Taky sledovat",
diff --git a/locales/de-DE.json b/locales/de-DE.json
index 49ceaa032c..13e50d1339 100644
--- a/locales/de-DE.json
+++ b/locales/de-DE.json
@@ -13,6 +13,7 @@
"blocked_users": "Gesperrte Accounts",
"blocking": "Blockiert",
"bot": "BOT",
+ "copy_account_name": "Kontonamen kopieren",
"favourites": "Favoriten",
"follow": "Folgen",
"follow_back": "Zurück folgen",
@@ -112,12 +113,12 @@
"block_account": {
"cancel": "Abbrechen",
"confirm": "Blockieren",
- "title": "Bist du sicher, dass du {0} blockieren möchtest?"
+ "description": "Bist du sicher, dass du {0} blockieren möchtest?"
},
"block_domain": {
"cancel": "Abbrechen",
"confirm": "Blockieren",
- "title": "Bist du sicher, dass du {0} blockieren möchtest?"
+ "description": "Bist du sicher, dass du {0} blockieren möchtest?"
},
"common": {
"cancel": "Abbrechen",
@@ -126,27 +127,27 @@
"delete_list": {
"cancel": "Abbrechen",
"confirm": "Löschen",
- "title": "Bist du sicher, dass du die Liste \"{0}\" löschen möchtest?"
+ "description": "Bist du sicher, dass du die Liste \"{0}\" löschen möchtest?"
},
"delete_posts": {
"cancel": "Abbrechen",
"confirm": "Löschen",
- "title": "Möchtest du diesen Beitrag wirklich löschen?"
+ "description": "Möchtest du diesen Beitrag wirklich löschen?"
},
"mute_account": {
"cancel": "Abbrechen",
"confirm": "Stummschalten",
- "title": "Bist du sicher, dass du {0} stummschalten möchtest?"
+ "description": "Bist du sicher, dass du {0} stummschalten möchtest?"
},
"show_reblogs": {
"cancel": "Abbrechen",
"confirm": "Anzeigen",
- "title": "Bist du sicher, dass du Weiterleitungen von {0} anzeigen möchtest?"
+ "description": "Bist du sicher, dass du Weiterleitungen von {0} anzeigen möchtest?"
},
"unfollow": {
"cancel": "Abbrechen",
"confirm": "Entfolgen",
- "title": "Bist du sicher, dass du entfolgen möchtest?"
+ "description": "Bist du sicher, dass du entfolgen möchtest?"
}
},
"conversation": {
diff --git a/locales/en.json b/locales/en.json
index af8aa3753f..4f08ae9074 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -27,6 +27,7 @@
"follows_you": "Follows you",
"go_to_profile": "Go to profile",
"joined": "Joined",
+ "lock": "Lock",
"moved_title": "has indicated that their new account is now:",
"muted_users": "Muted users",
"muting": "Muted",
@@ -120,12 +121,14 @@
"block_account": {
"cancel": "Cancel",
"confirm": "Block",
- "title": "Are you sure you want to block {0}?"
+ "description": "Are you sure you want to block {0}?",
+ "title": "Block account"
},
"block_domain": {
"cancel": "Cancel",
"confirm": "Block",
- "title": "Are you sure you want to block {0}?"
+ "description": "Are you sure you want to block {0}?",
+ "title": "Block domain"
},
"common": {
"cancel": "No",
@@ -134,27 +137,32 @@
"delete_list": {
"cancel": "Cancel",
"confirm": "Delete",
- "title": "Are you sure you want to delete the \"{0}\" list?"
+ "description": "Are you sure you want to delete the \"{0}\" list?",
+ "title": "Delete list"
},
"delete_posts": {
"cancel": "Cancel",
"confirm": "Delete",
- "title": "Are you sure you want to delete this post?"
+ "description": "Are you sure you want to delete this post?",
+ "title": "Delete post"
},
"mute_account": {
"cancel": "Cancel",
"confirm": "Mute",
- "title": "Are you sure you want to mute {0}?"
+ "description": "Are you sure you want to mute {0}?",
+ "title": "Mute account"
},
"show_reblogs": {
"cancel": "Cancel",
"confirm": "Show",
- "title": "Are you sure you want to show boosts from {0}?"
+ "description": "Are you sure you want to show boosts from {0}?",
+ "title": "Show boosts"
},
"unfollow": {
"cancel": "Cancel",
"confirm": "Unfollow",
- "title": "Are you sure you want to unfollow?"
+ "description": "Are you sure you want to unfollow {0}?",
+ "title": "Unfollow"
}
},
"conversation": {
@@ -521,6 +529,7 @@
"hide_username_emojis": "Hide username emojis",
"hide_username_emojis_description": "Hides emojis from usernames in timelines. Emojis will still be visible in their profiles.",
"label": "Preferences",
+ "optimize_for_low_performance_device": "Optimize for low performance device",
"title": "Experimental Features",
"use_star_favorite_icon": "Use star favorite icon",
"user_picker": "User Picker",
@@ -624,7 +633,7 @@
"notifications_favourite": "Favourite",
"notifications_follow": "Follow",
"notifications_follow_request": "Follow request",
- "notifications_mention": "Mention",
+ "notifications_mention": "Mentions",
"notifications_more_tooltip": "Filter notifications by type",
"notifications_poll": "Poll",
"notifications_reblog": "Boost",
diff --git a/locales/es-419.json b/locales/es-419.json
index 222db2cb57..55b7f7c164 100644
--- a/locales/es-419.json
+++ b/locales/es-419.json
@@ -18,6 +18,7 @@
"profile_description": "Imagen de portada de {0}",
"reject": "Omitir seguimiento",
"rejected": "Omitiste la petición",
+ "requested": "{0} quiere seguirte",
"unmute": "Quitar silencio",
"withdraw_follow_request": "Quitar solicitud de seguimiento"
},
@@ -46,26 +47,26 @@
"block_account": {
"cancel": "No",
"confirm": "Sí, bloquear",
- "title": "¿De verdad quieres bloquear a {0}?"
+ "description": "¿De verdad quieres bloquear a {0}?"
},
"block_domain": {
"cancel": "No",
- "confirm": "Sí ocultar",
- "title": "¿De verdad quieres ocultar a {0}?"
+ "confirm": "Sí, ocultar",
+ "description": "¿De verdad quieres ocultar a {0}?"
},
"delete_posts": {
- "title": "¿De verdad quieres eliminar esta publicación?"
+ "description": "¿De verdad quieres eliminar esta publicación?"
},
"mute_account": {
- "title": "¿De verdad quieres silenciar a {0}?"
+ "description": "¿De verdad quieres silenciar a {0}?"
},
"show_reblogs": {
"cancel": "No",
"confirm": "Sí, ver",
- "title": "¿De verdad quieres ver los retoots de {0}"
+ "description": "¿De verdad quieres ver los retoots de {0}"
},
"unfollow": {
- "title": "¿De verdad quieres dejar de seguir?"
+ "description": "¿De verdad quieres dejar de seguir?"
}
},
"error": {
diff --git a/locales/es.json b/locales/es.json
index c7ab59a858..399174cb1d 100644
--- a/locales/es.json
+++ b/locales/es.json
@@ -8,13 +8,14 @@
},
"account": {
"authorize": "Autorizar seguimiento",
- "authorized": "Has autorizado la petición",
+ "authorized": "Has autorizado la solicitud",
"avatar_description": "avatar de {0}",
"blocked_by": "Has sido bloqueado por este usuario.",
"blocked_domains": "Dominios bloqueados",
"blocked_users": "Usuarios bloqueados",
"blocking": "Bloqueado",
"bot": "BOT",
+ "copy_account_name": "Copiar nombre de cuenta",
"favourites": "Favoritas",
"follow": "Seguir",
"follow_back": "Seguir de vuelta",
@@ -26,11 +27,12 @@
"follows_you": "Te sigue",
"go_to_profile": "Ir al perfil",
"joined": "Se unió",
+ "lock": "Cuenta privada",
"moved_title": "ha indicado que su nueva cuenta ahora es:",
"muted_users": "Usuarios silenciados",
"muting": "Silenciado",
"mutuals": "Mutuo",
- "notifications_on_post_disable": "Parar notificaciones cuando {username} publique",
+ "notifications_on_post_disable": "Detener notificaciones cuando {username} publique",
"notifications_on_post_enable": "Notificarme cuando {username} publique",
"pinned": "Publicaciones fijadas",
"posts": "Publicaciones",
@@ -39,8 +41,9 @@
"profile_personal_note": "Nota Personal",
"profile_unavailable": "Perfil no disponible",
"reject": "Descartar seguimiento",
- "rejected": "Has descartado la petición",
+ "rejected": "Has descartado la solicitud",
"request_follow": "Solicitar seguirle",
+ "requested": "{0} ha solicitado seguirte",
"unblock": "Desbloquear",
"unfollow": "Dejar de seguir",
"unmute": "Dejar de silenciar",
@@ -118,12 +121,14 @@
"block_account": {
"cancel": "Cancelar",
"confirm": "Bloquear",
- "title": "¿Estás seguro que quieres bloquear a {0}?"
+ "description": "¿Estás seguro que quieres bloquear a {0}?",
+ "title": "Bloquear cuenta"
},
"block_domain": {
"cancel": "Cancelar",
"confirm": "Bloquear",
- "title": "¿Estás seguro que quieres bloquear a {0}?"
+ "description": "¿Estás seguro que quieres bloquear a {0}?",
+ "title": "Bloquear dominio"
},
"common": {
"cancel": "No",
@@ -132,27 +137,32 @@
"delete_list": {
"cancel": "Cancelar",
"confirm": "Eliminar",
- "title": "¿Está seguro de querer eliminar la lista \"{0}\"?"
+ "description": "¿Está seguro de querer eliminar la lista \"{0}\"?",
+ "title": "Eliminar lista"
},
"delete_posts": {
"cancel": "Cancelar",
"confirm": "Eliminar",
- "title": "¿Estás seguro que quieres eliminar esta publicación?"
+ "description": "¿Estás seguro que quieres eliminar esta publicación?",
+ "title": "Eliminar publicación"
},
"mute_account": {
"cancel": "Cancelar",
"confirm": "Silenciar",
- "title": "¿Estás seguro que quieres silenciar a {0}?"
+ "description": "¿Estás seguro que quieres silenciar a {0}?",
+ "title": "Silenciar cuenta"
},
"show_reblogs": {
"cancel": "Cancelar",
"confirm": "Mostrar",
- "title": "¿Estás seguro que quieres mostrar los retoots de {0}?"
+ "description": "¿Estás seguro que quieres mostrar los retoots de {0}?",
+ "title": "Mostrar retoots"
},
"unfollow": {
"cancel": "Cancelar",
"confirm": "Dejar de seguir",
- "title": "¿Estás seguro que quieres dejar de seguir?"
+ "description": "¿Estás seguro que quieres dejar de seguir?",
+ "title": "Dejar de seguir"
}
},
"conversation": {
@@ -519,6 +529,7 @@
"hide_username_emojis": "Ocultar emojis en el nombre de usuario",
"hide_username_emojis_description": "Oculta los emojis de los nombres de usuarios en la línea de tiempo. Los emojis permanecerán visibles en sus perfiles.",
"label": "Preferencias",
+ "optimize_for_low_performance_device": "Optimizar para dispositivos de bajo rendimiento",
"title": "Funcionalidades experimentales",
"use_star_favorite_icon": "Utilizar icono de estrella para favoritos",
"user_picker": "Selector de usuarios",
diff --git a/locales/eu-ES.json b/locales/eu-ES.json
index 98d9213c2d..1b7932f4de 100644
--- a/locales/eu-ES.json
+++ b/locales/eu-ES.json
@@ -120,12 +120,12 @@
"block_account": {
"cancel": "Utzi",
"confirm": "Blokeatu",
- "title": "Ziur {0} blokeatu nahi duzula?"
+ "description": "Ziur {0} blokeatu nahi duzula?"
},
"block_domain": {
"cancel": "Utzi",
"confirm": "Blokeatu",
- "title": "Ziur {0} domeinua blokeatu nahi duzula?"
+ "description": "Ziur {0} domeinua blokeatu nahi duzula?"
},
"common": {
"cancel": "Ez",
@@ -134,27 +134,27 @@
"delete_list": {
"cancel": "Utzi",
"confirm": "Ezabatu",
- "title": "Ziur \"{0}\" zerrenda ezabatu nahi duzula?"
+ "description": "Ziur \"{0}\" zerrenda ezabatu nahi duzula?"
},
"delete_posts": {
"cancel": "Utzi",
"confirm": "Ezabatu",
- "title": "Ziur bidalketa hau ezabatu nahi duzula?"
+ "description": "Ziur bidalketa hau ezabatu nahi duzula?"
},
"mute_account": {
"cancel": "Utzi",
"confirm": "Mututu",
- "title": "Ziur {0} mututu nahi duzula?"
+ "description": "Ziur {0} mututu nahi duzula?"
},
"show_reblogs": {
"cancel": "Utzi",
"confirm": "Erakutsi",
- "title": "Ziur {0}(r)en bultzadak ikusi nahi dituzula?"
+ "description": "Ziur {0}(r)en bultzadak ikusi nahi dituzula?"
},
"unfollow": {
"cancel": "Utzi",
"confirm": "Utzi jarraitzeari",
- "title": "Ziur jarraitzeari utzi nahi diozula?"
+ "description": "Ziur jarraitzeari utzi nahi diozula?"
}
},
"conversation": {
diff --git a/locales/fi-FI.json b/locales/fi-FI.json
index 82dba5f41e..42c948a8cd 100644
--- a/locales/fi-FI.json
+++ b/locales/fi-FI.json
@@ -13,6 +13,7 @@
"blocked_users": "Estetyt käyttäjät",
"blocking": "Estetty",
"bot": "BOTTI",
+ "copy_account_name": "Kopioi tilin nimi",
"favourites": "Suosikit",
"follow": "Seuraa",
"follow_back": "Seuraa takaisin",
@@ -113,12 +114,12 @@
"block_account": {
"cancel": "Peruuta",
"confirm": "Estä",
- "title": "Haluatko varmasti estää käyttäjän {0}?"
+ "description": "Haluatko varmasti estää käyttäjän {0}?"
},
"block_domain": {
"cancel": "Peruuta",
"confirm": "Estä",
- "title": "Haluatko varmasti estää verkkotunnuksen {0}?"
+ "description": "Haluatko varmasti estää verkkotunnuksen {0}?"
},
"common": {
"cancel": "Kyllä",
@@ -127,27 +128,27 @@
"delete_list": {
"cancel": "Peruuta",
"confirm": "Poista",
- "title": "Haluatko varmasti poistaa listan \"{0}\"?"
+ "description": "Haluatko varmasti poistaa listan \"{0}\"?"
},
"delete_posts": {
"cancel": "Peruuta",
"confirm": "Poista",
- "title": "Haluatko varmasti poistaa tämän julkaisun?"
+ "description": "Haluatko varmasti poistaa tämän julkaisun?"
},
"mute_account": {
"cancel": "Peruuta",
"confirm": "Hiljennä",
- "title": "Haluatko varmasti hiljentää käyttäjän {0}?"
+ "description": "Haluatko varmasti hiljentää käyttäjän {0}?"
},
"show_reblogs": {
"cancel": "Peruuta",
"confirm": "Näytä",
- "title": "Haluatko varmasti näyttää tehostukset käyttäjältä {0}?"
+ "description": "Haluatko varmasti näyttää tehostukset käyttäjältä {0}?"
},
"unfollow": {
"cancel": "Peruuta",
"confirm": "Lopeta seuraaminen",
- "title": "Haluatko varmasti lopettaa seuraamisen?"
+ "description": "Haluatko varmasti lopettaa seuraamisen?"
}
},
"conversation": {
diff --git a/locales/fr-FR.json b/locales/fr-FR.json
index de013f9c3c..c7855f436f 100644
--- a/locales/fr-FR.json
+++ b/locales/fr-FR.json
@@ -13,6 +13,7 @@
"blocked_users": "Comptes bloqués",
"blocking": "Bloqué·e",
"bot": "Automatisé",
+ "copy_account_name": "Copier le nom du compte",
"favourites": "Aimés",
"follow": "Suivre",
"follow_back": "Suivre en retour",
@@ -114,12 +115,12 @@
"block_account": {
"cancel": "Annuler",
"confirm": "Bloquer",
- "title": "Voulez-vous vraiment bloquer {0} ?"
+ "description": "Voulez-vous vraiment bloquer {0} ?"
},
"block_domain": {
"cancel": "Annuler",
"confirm": "Bloquer",
- "title": "Voulez-vous vraiment bloquer {0} ?"
+ "description": "Voulez-vous vraiment bloquer {0} ?"
},
"common": {
"cancel": "Non",
@@ -128,27 +129,27 @@
"delete_list": {
"cancel": "Annuler",
"confirm": "Supprimer",
- "title": "Voulez-vous vraiment supprimer la liste \"{0}\" ?"
+ "description": "Voulez-vous vraiment supprimer la liste \"{0}\" ?"
},
"delete_posts": {
"cancel": "Annuler",
"confirm": "Supprimer",
- "title": "Voulez-vous vraiment supprimer ce message ?"
+ "description": "Voulez-vous vraiment supprimer ce message ?"
},
"mute_account": {
"cancel": "Annuler",
"confirm": "Mettre en sourdine",
- "title": "Voulez-vous vraiment mettre en sourdine {0} ?"
+ "description": "Voulez-vous vraiment mettre en sourdine {0} ?"
},
"show_reblogs": {
"cancel": "Annuler",
"confirm": "Afficher",
- "title": "Voulez-vous vraiment afficher les partages de {0} ?"
+ "description": "Voulez-vous vraiment afficher les partages de {0} ?"
},
"unfollow": {
"cancel": "Annuler",
"confirm": "Se désabonner",
- "title": "Voulez-vous vraiment vous désabonner ?"
+ "description": "Voulez-vous vraiment vous désabonner ?"
}
},
"conversation": {
diff --git a/locales/gl-ES.json b/locales/gl-ES.json
index 7de04060ff..f244906e1b 100644
--- a/locales/gl-ES.json
+++ b/locales/gl-ES.json
@@ -7,12 +7,15 @@
"route_loaded": "Cargouse a páxina {0}"
},
"account": {
+ "authorize": "Permitir o seguimento",
+ "authorized": "Aceptaches a solicitude",
"avatar_description": "Avatar de {0}",
"blocked_by": "Esta usuaria bloqueoute.",
"blocked_domains": "Dominios bloqueados",
"blocked_users": "Usuarias bloqueadas",
"blocking": "Bloqueada",
"bot": "BOT",
+ "copy_account_name": "Copiar o nome da conta",
"favourites": "Favoritas",
"follow": "Seguir",
"follow_back": "Seguir tamén",
@@ -34,13 +37,18 @@
"posts": "Publicacións",
"posts_count": "{0} Publicacións|{0} Publicación|{0} Publicacións",
"profile_description": "Cabeceira do perfil de {0}",
+ "profile_personal_note": "Nota persoal",
"profile_unavailable": "Perfil non dispoñible",
+ "reject": "Rexeitar seguimento",
+ "rejected": "Rexeitaches a solicitude",
"request_follow": "Solicitar seguimento",
+ "requested": "{0} solicitou seguirte",
"unblock": "Desbloquear",
"unfollow": "Retirar seguimento",
"unmute": "Reactivar",
"view_other_followers": "É posible que non se mostren as seguidoras desde outras instancias.",
- "view_other_following": "É posible que non se mostren os seguimentos noutras instancias."
+ "view_other_following": "É posible que non se mostren os seguimentos noutras instancias.",
+ "withdraw_follow_request": "Desbotar solicitude de seguimento"
},
"action": {
"apply": "Aplicar",
@@ -50,10 +58,12 @@
"boost_count": "{0}",
"boosted": "Promovida",
"clear_publish_failed": "Limpar erros de publicación",
+ "clear_save_failed": "Limpar error de gardado",
"clear_upload_failed": "Limpar o ficheiro de erros de subida",
"close": "Pechar",
"compose": "Escribir",
"confirm": "Confirmar",
+ "done": "Feito",
"edit": "Editar",
"enter_app": "Entrar na App",
"favourite": "Favorita",
@@ -97,6 +107,8 @@
"error": "ERRO",
"fetching": "Obtendo...",
"in": "en",
+ "no_bookmarks": "Aínda non tes marcadores",
+ "no_favourites": "Aínda non favoreceches ningunha publicación",
"not_found": "404 Non Atopado",
"offline_desc": "Semella que non tes conexión. Comproba a conexión á rede."
},
@@ -108,12 +120,12 @@
"block_account": {
"cancel": "Cancelar",
"confirm": "Bloquear",
- "title": "Tes certeza de querer bloquear a {0}?"
+ "description": "Tes certeza de querer bloquear a {0}?"
},
"block_domain": {
"cancel": "Cancelar",
"confirm": "Bloquear",
- "title": "Tes certeza de querer bloquear {0}?"
+ "description": "Tes certeza de querer bloquear {0}?"
},
"common": {
"cancel": "Non",
@@ -122,27 +134,27 @@
"delete_list": {
"cancel": "Cancelar",
"confirm": "Eliminar",
- "title": "Tes a certeza de querer eliminar a lista \"{0}\"?"
+ "description": "Tes a certeza de querer eliminar a lista \"{0}\"?"
},
"delete_posts": {
"cancel": "Cancelar",
"confirm": "Eliminar",
- "title": "Tes certeza de querer eliminar esta publicación?"
+ "description": "Tes certeza de querer eliminar esta publicación?"
},
"mute_account": {
"cancel": "Cancelar",
"confirm": "Acalar",
- "title": "Tes certeza de querer acalar a {0}?"
+ "description": "Tes certeza de querer acalar a {0}?"
},
"show_reblogs": {
"cancel": "Cancelar",
"confirm": "Mostrar",
- "title": "Tes certeza de querer mostrar as promocións de {0}?"
+ "description": "Tes certeza de querer mostrar as promocións de {0}?"
},
"unfollow": {
"cancel": "Cancelar",
"confirm": "Retirar",
- "title": "Tes certeza de querer retirar o seguimento?"
+ "description": "Tes certeza de querer retirar o seguimento?"
}
},
"conversation": {
@@ -185,7 +197,7 @@
},
"list": {
"add_account": "Engadir conta á lista",
- "cancel_edit": "Cancelar a edición",
+ "cancel_edit": "Desbotar a edición",
"clear_error": "Limpar erro",
"create": "Crear",
"delete": "Elimina esta lista",
@@ -207,8 +219,8 @@
"command_mode": "Modo de ordes",
"compose": "Escribir",
"favourite": "Favorita",
- "title": "Accións",
- "zen_mode": "Modo Cen"
+ "search": "Buscar",
+ "title": "Accións"
},
"media": {
"title": "Multimedia"
@@ -225,6 +237,7 @@
"sequence_then": "e"
},
"menu": {
+ "add_personal_note": "Engadir nota persoal sobre {0}",
"block_account": "Bloquear {0}",
"block_domain": "Bloquear o dominio {0}",
"copy_link_to_post": "Copiar ligazón á publicación",
@@ -239,6 +252,9 @@
"mute_conversation": "Acalar esta publicación",
"open_in_original_site": "Abrir no sitio web orixinal",
"pin_on_profile": "Fixar no perfil",
+ "remove_personal_note": "Eliminar nota persoal sobre {0}",
+ "report_account": "Denunciar a {0}",
+ "share_account": "Compartir {0}",
"share_post": "Compartir esta publicación",
"show_favourited_and_boosted_by": "Mostrar quen favoreceu e promoveu",
"show_reblogs": "Mostrar promocións desde {0}",
@@ -250,6 +266,7 @@
"translate_post": "Traducir publicación",
"unblock_account": "Desbloquear a {0}",
"unblock_domain": "Desbloquear o dominio {0}",
+ "unfollow_account": "Deixar de seguir a {0}",
"unmute_account": "Reactivar {0}",
"unmute_conversation": "Reactivar esta publicación",
"unpin_on_profile": "Desafixar do perfil"
@@ -291,6 +308,7 @@
"followed_you_count": "{0} persoas seguíronte|{0} persoa seguiute|{0} persoas seguíronte",
"missing_type": "FALTA o notification.type:",
"reblogged_post": "promoveu a túa publicación",
+ "reported": "{0} denunciou a {1}",
"request_to_follow": "solicitou seguirte",
"signed_up": "creou a conta",
"update_status": "actualizou a publicación"
@@ -301,10 +319,26 @@
"reply_to_account": "Responder a {0}",
"replying": "Responde aquí"
},
+ "polls": {
+ "allow_multiple": "Permitir selección múltiple",
+ "cancel": "Desbotar",
+ "create": "Crear enquisa",
+ "disallow_multiple": "Desactivar selección múltiple",
+ "expiration": "Caducidade da enquisa",
+ "hide_votes": "Agochar resultados ata o remate",
+ "option_placeholder": "Número de opcións {current}/{max}",
+ "remove_option": "Retirar opción",
+ "settings": "Opcións da enquisa",
+ "show_votes": "Mostrar sempre o total de votos"
+ },
"pwa": {
"dismiss": "Desbotar",
"install": "Instalar",
"install_title": "Instalar Elk",
+ "screenshots": {
+ "dark": "Pantallazo de Elk en modo escuro",
+ "light": "Pantallazo de Elk en modo claro"
+ },
"title": "Dispoñible nova versión de Elk!",
"update": "Actualizar",
"update_available_short": "Actualizar Elk",
@@ -331,6 +365,42 @@
}
}
},
+ "report": {
+ "additional_comments": "Comentario adicional",
+ "another_server": "A conta que denuncias pertence a outro servidor",
+ "anything_else": "Hai algo máis que debamos saber?",
+ "block_desc": "Non vas ver máis publicacións desta conta. Non poderá ver as túas publicacións ou seguirte. Non saberá que a bloqueaches.",
+ "dontlike": "Non me gusta",
+ "dontlike_desc": "É algo que non quero ver",
+ "forward": "Si, informar tamén a {0}",
+ "forward_question": "Queres enviar tamén unha copia anónima da denuncia ao servidor desa conta?",
+ "further_actions": {
+ "limit": {
+ "description": "Aquí tes as opcións para controlar o que ves:",
+ "title": "Non queres ver isto?"
+ },
+ "report": {
+ "description": "Mentras a revisamos, isto é o que podes facer:",
+ "title": "Grazas pola denuncia, investigaremos o asunto."
+ }
+ },
+ "limiting": "Limitar {0}",
+ "mute_desc": "Non verás máis publicacións desta conta. Poderá seguir seguíndote. Non saberá que a silenciaches.",
+ "other": "É por outra problema",
+ "other_desc": "O problema non encaixa noutras categorías",
+ "reporting": "Denunciando a {0}",
+ "select_many": "Elixe todo o que proceda:",
+ "select_one": "Elixe a opción máis axeitada:",
+ "select_posts": "Hai algunha publicación que apoie esta denuncia?",
+ "select_posts_other": "Hai algunha outra publicación para apoiar a denuncia?",
+ "spam": "É spam",
+ "spam_desc": "Ligazóns maliciosas, suplantación, ou respostas repetitivas",
+ "submit": "Enviar Denuncia",
+ "unfollow_desc": "Non vas ver máis mensaxes desta conta na túa cronoloxía. Poderías ver as súas mensaxes noutros sitios.",
+ "violation": "Ofende algunha das regra e termos do servidor",
+ "whats_wrong_account": "Cóntanos cal é o problema con esta conta",
+ "whats_wrong_post": "Cóntanos cal é o problema con esta publicación"
+ },
"search": {
"search_desc": "Buscar persoas e cancelos",
"search_empty": "Non atopamos nada con eses termos de busca"
@@ -359,12 +429,13 @@
"font_size": "Tamaño da letra",
"label": "Interface",
"light_mode": "Claro",
- "system_mode": "Escuro",
+ "system_mode": "Sistema",
"theme_color": "Cor do decorado"
},
"language": {
"display_language": "Idioma da interface",
"label": "Idioma",
+ "post_language": "Idioma de publicación",
"status": "Estado da tradución: {0}/{1} ({2}%)",
"translations": {
"add": "Engadir",
@@ -430,26 +501,35 @@
},
"notifications_settings": "Notificacións",
"preferences": {
+ "embedded_media": "Reprodutor Multimedia incrustado",
+ "embedded_media_description": "Mostrar un reprodutor no lugar dunha tarxeta de vista previa ao despregar as ligazóns de fluxos multimedia compartidos.",
"enable_autoplay": "Activar reprodución auto.",
"enable_data_saving": "Activar aforro de datos",
"enable_data_saving_description": "Aforra datos evitando a carga automática de adxuntos.",
"enable_pinch_to_zoom": "Activar belisco para aumentar",
"github_cards": "GitHub Cards",
+ "github_cards_description": "Ao compartir unha ligazón a GitHub móstrase unha tarxeta HTML accesible usando os metadatos no lugar dunha simple imaxe",
"grayscale_mode": "Modo en escala de grises",
"hide_account_hover_card": "Non mostrar tarxetas emerxentes",
"hide_alt_indi_on_posts": "Agochar indicador ALT nas publicacións",
"hide_boost_count": "Agochar conta de promocións",
"hide_favorite_count": "Agochar conta de favoritos",
"hide_follower_count": "Agochar conta de seguimentos",
+ "hide_news": "Agochar as novas",
"hide_reply_count": "Agochar conta de respostas",
"hide_translation": "Agochar tradución",
"hide_username_emojis": "Agochar emojis nos nomes",
"hide_username_emojis_description": "Agocha nas cronoloxías os emojis nos nomes de usuaria. Emojis seguirán visibles na páxina de perfil da usuaria.",
"label": "Preferencias",
"title": "Características experimentais",
+ "use_star_favorite_icon": "Usar icona da estrela para favoritas",
"user_picker": "Selector de conta",
+ "user_picker_description": "Mostra abaixo á esquerda todos os avatares das contas conectadas para poder cambiar rápidamente entre elas",
"virtual_scroll": "Desprazamento virtual",
- "wellbeing": "Benestar"
+ "virtual_scroll_description": "Usar unha lista virtual nas cronoloxías, así pódense mostrar un gran número de elementos de xeito máis eficiente.",
+ "wellbeing": "Benestar",
+ "zen_mode": "Modo Cen",
+ "zen_mode_description": "Agocha os laterais a non se que o punteiro pase sobre eles. Tamén oculta algúns elementos da cronoloxía"
},
"profile": {
"appearance": {
@@ -490,12 +570,18 @@
"loading": "Cargando...",
"publish_failed": "Fallou a publicación",
"publishing": "Publicando",
+ "save_failed": "Fallou o gardado",
"upload_failed": "Fallou a subida",
"uploading": "Subindo..."
},
"status": {
+ "account": {
+ "suspended_message": "A conta desta publicación foi suspendida.",
+ "suspended_show": "Queres vela igualmente?"
+ },
"boosted_by": "Promovida por",
"edited": "Editada por {0}",
+ "embedded_warning": "Ao reproducir poderías revelar o teu enderezo IP.",
"favourited_by": "Favorecida por",
"filter_hidden_phrase": "Filtrada por",
"filter_show_anyway": "Mostrar igualmente",
@@ -513,6 +599,7 @@
"replying_to": "En resposta a {0}",
"show_full_thread": "Mostrar conversa completa",
"someone": "alguén",
+ "spoiler_media_hidden": "Medios ocultos",
"spoiler_show_less": "Mostrar menos",
"spoiler_show_more": "Mostrar máis",
"thread": "Fío",
@@ -529,10 +616,22 @@
"list": "Lista",
"media": "Multimedia",
"news": "Novas",
+ "notifications_admin": {
+ "report": "Denuncia",
+ "sign_up": "Rexistro"
+ },
"notifications_all": "Todo",
+ "notifications_favourite": "Favorita",
+ "notifications_follow": "Seguimento",
+ "notifications_follow_request": "Solicitude de seguimento",
"notifications_mention": "Mención",
+ "notifications_more_tooltip": "Filtrar notificacións por tipo",
+ "notifications_poll": "Enquisa",
+ "notifications_reblog": "Promoción",
+ "notifications_status": "Estado",
+ "notifications_update": "Actualización",
"posts": "Publicacións",
- "posts_with_replies": "Publicacións & Respostas"
+ "posts_with_replies": "Publicacións e Respostas"
},
"tag": {
"follow": "Seguir",
diff --git a/locales/hu-HU.json b/locales/hu-HU.json
index 7ef2db1c2b..a021fbbfbb 100644
--- a/locales/hu-HU.json
+++ b/locales/hu-HU.json
@@ -120,12 +120,12 @@
"block_account": {
"cancel": "Mégsem",
"confirm": "Blokkol",
- "title": "Biztosan blokkolja? {0}"
+ "description": "Biztosan blokkolja? {0}"
},
"block_domain": {
"cancel": "Mégsem",
"confirm": "Blokkol",
- "title": "Biztosan blokkolja? {0}"
+ "description": "Biztosan blokkolja? {0}"
},
"common": {
"cancel": "Mégsem",
@@ -134,27 +134,27 @@
"delete_list": {
"cancel": "Mégsem",
"confirm": "Töröl",
- "title": "Biztosan törli a listát? \"{0}\""
+ "description": "Biztosan törli a listát? \"{0}\""
},
"delete_posts": {
"cancel": "Mégsem",
"confirm": "Töröl",
- "title": "Biztosan törli a bejegyzést?"
+ "description": "Biztosan törli a bejegyzést?"
},
"mute_account": {
"cancel": "Mégsem",
"confirm": "Némít",
- "title": "Biztosan némítja? {0}"
+ "description": "Biztosan némítja? {0}"
},
"show_reblogs": {
"cancel": "Mégsem",
"confirm": "Mutat",
- "title": "Biztosan megjeleníti a Turbót tőle? {0}"
+ "description": "Biztosan megjeleníti a Turbót tőle? {0}"
},
"unfollow": {
"cancel": "Mégsem",
"confirm": "Követés leállítása",
- "title": "Biztosan leállítja a követését?"
+ "description": "Biztosan leállítja a követését?"
}
},
"conversation": {
diff --git a/locales/id-ID.json b/locales/id-ID.json
index b635075671..260cac260c 100644
--- a/locales/id-ID.json
+++ b/locales/id-ID.json
@@ -15,6 +15,7 @@
"blocked_users": "Pengguna diblokir",
"blocking": "Diblokir",
"bot": "BOT",
+ "copy_account_name": "Salin nama akun",
"favourites": "Favorit",
"follow": "Ikuti",
"follow_back": "Ikuti kembali",
@@ -119,12 +120,12 @@
"block_account": {
"cancel": "Batalkan",
"confirm": "Blokir",
- "title": "Yakin ingin memblokir {0}?"
+ "description": "Yakin ingin memblokir {0}?"
},
"block_domain": {
"cancel": "Batalkan",
"confirm": "Blokir",
- "title": "Yakin ingin memblokir {0}?"
+ "description": "Yakin ingin memblokir {0}?"
},
"common": {
"cancel": "Tidak",
@@ -133,27 +134,27 @@
"delete_list": {
"cancel": "Batalkan",
"confirm": "Hapus",
- "title": "Apakah Anda yakin ingin menghapus daftar \"{0}\"?"
+ "description": "Apakah Anda yakin ingin menghapus daftar \"{0}\"?"
},
"delete_posts": {
"cancel": "Batalkan",
"confirm": "Hapus",
- "title": "Yakin ingin menghapus postingan ini?"
+ "description": "Yakin ingin menghapus postingan ini?"
},
"mute_account": {
"cancel": "Batalkan",
"confirm": "Bisukan",
- "title": "Yakin ingin membisukan {0}?"
+ "description": "Yakin ingin membisukan {0}?"
},
"show_reblogs": {
"cancel": "Batalkan",
"confirm": "Tampilkan",
- "title": "Yakin ingin menampilkan dukungan dari {0}?"
+ "description": "Yakin ingin menampilkan dukungan dari {0}?"
},
"unfollow": {
"cancel": "Batalkan",
"confirm": "Berhenti mengikuti",
- "title": "Anda yakin ingin berhenti mengikuti?"
+ "description": "Anda yakin ingin berhenti mengikuti?"
}
},
"conversation": {
diff --git a/locales/it-IT.json b/locales/it-IT.json
index 237f507ad2..63cc4160be 100644
--- a/locales/it-IT.json
+++ b/locales/it-IT.json
@@ -27,6 +27,7 @@
"follows_you": "Ti segue",
"go_to_profile": "Vai al profilo",
"joined": "Iscritto",
+ "lock": "Privato",
"moved_title": "ha indicato che il suo nuovo account è:",
"muted_users": "Utenti silenziati",
"muting": "Silenziato",
@@ -120,12 +121,14 @@
"block_account": {
"cancel": "Annulla",
"confirm": "Blocca",
- "title": "Confermi di voler bloccare {0}?"
+ "description": "Confermi di voler bloccare {0}?",
+ "title": "Blocca account"
},
"block_domain": {
"cancel": "Annulla",
"confirm": "Blocca",
- "title": "Confermi di voler bloccare {0}?"
+ "description": "Confermi di voler bloccare {0}?",
+ "title": "Blocca dominio"
},
"common": {
"cancel": "Annulla",
@@ -134,27 +137,32 @@
"delete_list": {
"cancel": "Annulla",
"confirm": "Elimina",
- "title": "Confermi di voler eliminare la lista \"{0}\"?"
+ "description": "Confermi di voler eliminare la lista \"{0}\"?",
+ "title": "Elimina lista"
},
"delete_posts": {
"cancel": "Annulla",
"confirm": "Elimina",
- "title": "Confermi di voler eliminare questo post?"
+ "description": "Confermi di voler eliminare questo post?",
+ "title": "Elimina post"
},
"mute_account": {
"cancel": "Annulla",
"confirm": "Silenzia",
- "title": "Confermi di voler silenziare {0}?"
+ "description": "Confermi di voler silenziare {0}?",
+ "title": "Silenzia account"
},
"show_reblogs": {
"cancel": "Annulla",
"confirm": "Mostra",
- "title": "Confermi di voler mostrare i post potenziati da {0}?"
+ "description": "Confermi di voler mostrare i post potenziati da {0}?",
+ "title": "Mostra potenziamenti"
},
"unfollow": {
"cancel": "Annulla",
"confirm": "Smetti di seguire",
- "title": "Confermi di voler smettere di seguire?"
+ "description": "Confermi di voler smettere di seguire?",
+ "title": "Smetti di seguire"
}
},
"conversation": {
@@ -510,7 +518,7 @@
"github_cards": "GitHub Cards",
"github_cards_description": "Quando viene pubblicato un link GitHub, viene mostrato un riquadro HTML accessibile usando i metadati del grafico sociale invece dell'immmagine.",
"grayscale_mode": "Modalità scala di grigi",
- "hide_account_hover_card": "Nascondi anteprima account al passaggio del mouse",
+ "hide_account_hover_card": "Nascondi anteprima profilo al passaggio del mouse",
"hide_alt_indi_on_posts": "Nascondi indicatori testo alternativo sui post",
"hide_boost_count": "Nascondi contatore potenziamenti",
"hide_favorite_count": "Nascondi contatore apprezzamenti",
@@ -521,6 +529,7 @@
"hide_username_emojis": "Nascondi emoji dai nomi utente",
"hide_username_emojis_description": "Nasconde le emoji all'interno dei nomi utente nella cronologia. Le emoji saranno comunque visibili nelle pagine dei profili.",
"label": "Preferenze",
+ "optimize_for_low_performance_device": "Ottimizza per dispositivi a basse prestazioni",
"title": "Funzionalità sperimentali",
"use_star_favorite_icon": "Usa icona stella per apprezzamenti",
"user_picker": "Selettore utente",
@@ -624,10 +633,10 @@
"notifications_favourite": "Apprezzamento",
"notifications_follow": "Nuovo seguace",
"notifications_follow_request": "Richiesta di seguire",
- "notifications_mention": "Menzione",
+ "notifications_mention": "Menzioni",
"notifications_more_tooltip": "Filtra notifiche per tipo",
"notifications_poll": "Sondaggio",
- "notifications_reblog": "Apprezzamento",
+ "notifications_reblog": "Potenziamento",
"notifications_status": "Stato",
"notifications_update": "Aggiornamento",
"posts": "Post",
diff --git a/locales/ja-JP.json b/locales/ja-JP.json
index 7416d0f025..0195b598d4 100644
--- a/locales/ja-JP.json
+++ b/locales/ja-JP.json
@@ -115,12 +115,12 @@
"block_account": {
"cancel": "キャンセル",
"confirm": "ブロック",
- "title": "{0}さんを本当にミュートしたいですか?"
+ "description": "{0}さんを本当にミュートしたいですか?"
},
"block_domain": {
"cancel": "キャンセル",
"confirm": "ブロック",
- "title": "{0}さんを本当にブロックしたいですか?"
+ "description": "{0}さんを本当にブロックしたいですか?"
},
"common": {
"cancel": "いいえ",
@@ -129,27 +129,27 @@
"delete_list": {
"cancel": "キャンセル",
"confirm": "削除",
- "title": "リスト \"{0}\" を本当に削除したいですか?"
+ "description": "リスト \"{0}\" を本当に削除したいですか?"
},
"delete_posts": {
"cancel": "キャンセル",
"confirm": "削除",
- "title": "この投稿を本当に削除したいですか?"
+ "description": "この投稿を本当に削除したいですか?"
},
"mute_account": {
"cancel": "キャンセル",
"confirm": "ミュート",
- "title": "{0}さんを本当にミュートしたいですか?"
+ "description": "{0}さんを本当にミュートしたいですか?"
},
"show_reblogs": {
"cancel": "キャンセル",
"confirm": "表示",
- "title": "{0}さんのブーストを本当に表示したいですか?"
+ "description": "{0}さんのブーストを本当に表示したいですか?"
},
"unfollow": {
"cancel": "キャンセル",
"confirm": "フォロー解除",
- "title": "本当にフォロー解除したいですか?"
+ "description": "本当にフォロー解除したいですか?"
}
},
"conversation": {
diff --git a/locales/ko-KR.json b/locales/ko-KR.json
index e6c964ae44..3a63dfb1bd 100644
--- a/locales/ko-KR.json
+++ b/locales/ko-KR.json
@@ -13,6 +13,7 @@
"blocked_users": "차단한 유저",
"blocking": "차단",
"bot": "봇",
+ "copy_account_name": "계정 이름 복사",
"favourites": "좋아요",
"follow": "팔로우",
"follow_back": "맞팔로우",
@@ -86,12 +87,12 @@
"block_account": {
"cancel": "취소",
"confirm": "차단",
- "title": "정말로 {0}을/를 차단할까요?"
+ "description": "정말로 {0}을/를 차단할까요?"
},
"block_domain": {
"cancel": "취소",
"confirm": "차단",
- "title": "정말로 {0}을/를 차단할까요?"
+ "description": "정말로 {0}을/를 차단할까요?"
},
"common": {
"cancel": "아니오",
@@ -100,27 +101,27 @@
"delete_list": {
"cancel": "취소",
"confirm": "삭제",
- "title": "정말로 \"{0}\" 리스트를 삭제할까요?"
+ "description": "정말로 \"{0}\" 리스트를 삭제할까요?"
},
"delete_posts": {
"cancel": "취소",
"confirm": "삭제",
- "title": "정말로 이 게시물을 삭제할까요?"
+ "description": "정말로 이 게시물을 삭제할까요?"
},
"mute_account": {
"cancel": "취소",
"confirm": "뮤트",
- "title": "정말로 {0}을/를 뮤트하시겠어요?"
+ "description": "정말로 {0}을/를 뮤트하시겠어요?"
},
"show_reblogs": {
"cancel": "취소",
"confirm": "보기",
- "title": "정말로 {0}이/가 부스트한 게시물을 표시할까요?"
+ "description": "정말로 {0}이/가 부스트한 게시물을 표시할까요?"
},
"unfollow": {
"cancel": "취소",
"confirm": "언팔로우",
- "title": "정말로 언팔로우를 하시겠어요?"
+ "description": "정말로 언팔로우를 하시겠어요?"
}
},
"conversation": {
diff --git a/locales/nl-NL.json b/locales/nl-NL.json
index ed04438579..6fb6dbc81a 100644
--- a/locales/nl-NL.json
+++ b/locales/nl-NL.json
@@ -13,6 +13,7 @@
"blocked_users": "Geblokkeerde gebruikers",
"blocking": "Geblokkeerd",
"bot": "BOT",
+ "copy_account_name": "Kopieer accountnaam",
"favourites": "Favorieten",
"follow": "Volg",
"follow_back": "Volg terug",
diff --git a/locales/pl-PL.json b/locales/pl-PL.json
index 9927931d14..219ec6b022 100644
--- a/locales/pl-PL.json
+++ b/locales/pl-PL.json
@@ -13,6 +13,7 @@
"blocked_users": "Zablokowani użytkownicy",
"blocking": "Zablokowany",
"bot": "BOT",
+ "copy_account_name": "Skopiuj nazwę konta",
"favourites": "Ulubione",
"follow": "Obserwuj",
"follow_back": "Przestań obserwować",
@@ -111,12 +112,12 @@
"block_account": {
"cancel": "Anuluj",
"confirm": "Blokuj",
- "title": "Czy na pewno chcesz zablokować {0}?"
+ "description": "Czy na pewno chcesz zablokować {0}?"
},
"block_domain": {
"cancel": "Anuluj",
"confirm": "Blokuj",
- "title": "Czy na pewno chcesz zablokować {0}?"
+ "description": "Czy na pewno chcesz zablokować {0}?"
},
"common": {
"cancel": "Nie",
@@ -125,27 +126,27 @@
"delete_list": {
"cancel": "Anuluj",
"confirm": "Usuń",
- "title": "Czy na pewno chcesz usunąć listę „{0}”?"
+ "description": "Czy na pewno chcesz usunąć listę „{0}”?"
},
"delete_posts": {
"cancel": "Anuluj",
"confirm": "Usuń",
- "title": "Czy na pewno chcesz usunąć ten post?"
+ "description": "Czy na pewno chcesz usunąć ten post?"
},
"mute_account": {
"cancel": "Anuluj",
"confirm": "Wycisz",
- "title": "Czy na pewno chcesz wyciszyć {0}?"
+ "description": "Czy na pewno chcesz wyciszyć {0}?"
},
"show_reblogs": {
"cancel": "Anuluj",
"confirm": "Pokaż",
- "title": "Czy na pewno chcesz pokazać podbicia od {0}?"
+ "description": "Czy na pewno chcesz pokazać podbicia od {0}?"
},
"unfollow": {
"cancel": "Anuluj",
"confirm": "Przestań obserwować",
- "title": "Czy na pewno chcesz przestać obserwować?"
+ "description": "Czy na pewno chcesz przestać obserwować?"
}
},
"conversation": {
diff --git a/locales/pt-BR.json b/locales/pt-BR.json
index cb91a638a8..ce7d3761b4 100644
--- a/locales/pt-BR.json
+++ b/locales/pt-BR.json
@@ -40,27 +40,27 @@
},
"confirm": {
"block_account": {
- "title": "Tem certeza que quer bloquear {0}?"
+ "description": "Tem certeza que quer bloquear {0}?"
},
"block_domain": {
- "title": "Tem certeza que quer bloquear {0}?"
+ "description": "Tem certeza que quer bloquear {0}?"
},
"delete_list": {
"confirm": "Apagar",
- "title": "Tem certeza que quer apagar a lista \"{0}\"?"
+ "description": "Tem certeza que quer apagar a lista \"{0}\"?"
},
"delete_posts": {
"confirm": "Apagar",
- "title": "Tem certeza que quer apagar esse post?"
+ "description": "Tem certeza que quer apagar esse post?"
},
"mute_account": {
- "title": "Tem certeza que quer silenciar {0}?"
+ "description": "Tem certeza que quer silenciar {0}?"
},
"show_reblogs": {
- "title": "Tem certeza que quer mostrar os compartilhamentos de {0}?"
+ "description": "Tem certeza que quer mostrar os compartilhamentos de {0}?"
},
"unfollow": {
- "title": "Tem certeza que quer deixar de seguir?"
+ "description": "Tem certeza que quer deixar de seguir?"
}
},
"error": {
diff --git a/locales/pt.json b/locales/pt.json
index afd70f9e1b..8cf04e999f 100644
--- a/locales/pt.json
+++ b/locales/pt.json
@@ -120,12 +120,14 @@
"block_account": {
"cancel": "Cancelar",
"confirm": "Bloquear",
- "title": "Tem a certeza que pretende bloquear {0}?"
+ "description": "Tem a certeza que pretende bloquear {0}?",
+ "title": "Bloquear conta"
},
"block_domain": {
"cancel": "Cancelar",
"confirm": "Bloquear",
- "title": "Tem a certeza que pretende bloquear {0}?"
+ "description": "Tem a certeza que pretende bloquear {0}?",
+ "title": "Bloquear domínio"
},
"common": {
"cancel": "Não",
@@ -134,27 +136,32 @@
"delete_list": {
"cancel": "Cancelar",
"confirm": "Eliminar",
- "title": "Tem a certeza que pretende elimnar a lista \"{0}\"?"
+ "description": "Tem a certeza que pretende eliminar a lista \"{0}\"?",
+ "title": "Eliminar lista"
},
"delete_posts": {
"cancel": "Cancelar",
"confirm": "Eliminar",
- "title": "Tem a certeza que pretende eliminar esta publicação?"
+ "description": "Tem a certeza que pretende eliminar esta publicação?",
+ "title": "Eliminar publicação"
},
"mute_account": {
"cancel": "Cancelar",
"confirm": "Silenciar",
- "title": "Tem a certeza que pretende silenciar {0}?"
+ "description": "Tem a certeza que pretende silenciar {0}?",
+ "title": "Silenciar conta"
},
"show_reblogs": {
"cancel": "Cancelar",
"confirm": "Mostrar",
- "title": "Tem a certeza que pretende mostrar partilhas de {0}?"
+ "description": "Tem a certeza que pretende mostrar partilhas de {0}?",
+ "title": "Mostrar partilhas"
},
"unfollow": {
"cancel": "Cancelar",
"confirm": "Deixar de seguir",
- "title": "Tem a certeza que pretende deixar de seguir?"
+ "description": "Tem a certeza que pretende deixar de seguir?",
+ "title": "Deixar de seguir"
}
},
"conversation": {
diff --git a/locales/ru-RU.json b/locales/ru-RU.json
index bc63604dce..07fb92fafd 100644
--- a/locales/ru-RU.json
+++ b/locales/ru-RU.json
@@ -13,6 +13,7 @@
"blocked_users": "Заблокированные пользователи",
"blocking": "Заблокирован",
"bot": "БОТ",
+ "copy_account_name": "Скопировать имя учетной записи",
"favourites": "Избранное",
"follow": "Читать",
"follow_back": "Читать",
@@ -112,12 +113,12 @@
"block_account": {
"cancel": "Отмена",
"confirm": "Заблокировать",
- "title": "Вы уверены, что хотите заблокировать {0}?"
+ "description": "Вы уверены, что хотите заблокировать {0}?"
},
"block_domain": {
"cancel": "Отмена",
"confirm": "Заблокировать",
- "title": "Вы уверены, что хотите заблокировать {0}?"
+ "description": "Вы уверены, что хотите заблокировать {0}?"
},
"common": {
"cancel": "Нет",
@@ -126,27 +127,27 @@
"delete_list": {
"cancel": "Отмена",
"confirm": "Удалить",
- "title": "Вы уверены, что хотите удалить список \"{0}\"?"
+ "description": "Вы уверены, что хотите удалить список \"{0}\"?"
},
"delete_posts": {
"cancel": "Отмена",
"confirm": "Удалить",
- "title": "Вы уверены, что хотите удалить этот пост?"
+ "description": "Вы уверены, что хотите удалить этот пост?"
},
"mute_account": {
"cancel": "Отмена",
"confirm": "Скрыть",
- "title": "Вы уверены, что хотите скрыть {0}?"
+ "description": "Вы уверены, что хотите скрыть {0}?"
},
"show_reblogs": {
"cancel": "Нет",
"confirm": "Да",
- "title": "Вы уверены, что хотите снова видеть репосты от {0}?"
+ "description": "Вы уверены, что хотите снова видеть репосты от {0}?"
},
"unfollow": {
"cancel": "Нет",
"confirm": "Да",
- "title": "Вы уверены, что хотите перестать читать этого пользователя?"
+ "description": "Вы уверены, что хотите перестать читать этого пользователя?"
}
},
"conversation": {
diff --git a/locales/th-TH.json b/locales/th-TH.json
index 3642d2f140..66b0e086cd 100644
--- a/locales/th-TH.json
+++ b/locales/th-TH.json
@@ -13,6 +13,7 @@
"blocked_users": "ผู้ใช้ที่ถูกปิดกั้น",
"blocking": "ปิดกั้น",
"bot": "บอท",
+ "copy_account_name": "คัดลอกชื่อบัญชี",
"favourites": "รายการโปรด",
"follow": "ติดตาม",
"follow_back": "ติดตามกลับ",
@@ -111,12 +112,12 @@
"block_account": {
"cancel": "ยกเลิก",
"confirm": "ปิดกั้น",
- "title": "แน่ใจว่าต้องการปิดกั้น {0}?"
+ "description": "แน่ใจว่าต้องการปิดกั้น {0}?"
},
"block_domain": {
"cancel": "ยกเลิก",
"confirm": "ปิดกั้น",
- "title": "แน่ใจว่าต้องการปิดกั้น {0}?"
+ "description": "แน่ใจว่าต้องการปิดกั้น {0}?"
},
"common": {
"cancel": "ยกเลิก",
@@ -125,27 +126,27 @@
"delete_list": {
"cancel": "ยกเลิก",
"confirm": "ลบ",
- "title": "แน่ใจว่าต้องการลบรายการ \"{0}\"?"
+ "description": "แน่ใจว่าต้องการลบรายการ \"{0}\"?"
},
"delete_posts": {
"cancel": "ยกเลิก",
"confirm": "ลบ",
- "title": "แน่ใจว่าต้องการลบโพสต์นี้?"
+ "description": "แน่ใจว่าต้องการลบโพสต์นี้?"
},
"mute_account": {
"cancel": "ยกเลิก",
"confirm": "ปิดเสียง",
- "title": "แน่ใจว่าต้องการปิดเสียง {0}?"
+ "description": "แน่ใจว่าต้องการปิดเสียง {0}?"
},
"show_reblogs": {
"cancel": "ยกเลิก",
"confirm": "แสดง",
- "title": "แน่ใจว่าต้องการดัน {0}?"
+ "description": "แน่ใจว่าต้องการดัน {0}?"
},
"unfollow": {
"cancel": "ยกเลิก",
"confirm": "เลิกติดตาม",
- "title": "แน่ใจว่าต้องการเลิกติดตาม?"
+ "description": "แน่ใจว่าต้องการเลิกติดตาม?"
}
},
"conversation": {
diff --git a/locales/tl-PH.json b/locales/tl-PH.json
index 09f31131e8..eb3e14e092 100644
--- a/locales/tl-PH.json
+++ b/locales/tl-PH.json
@@ -13,6 +13,7 @@
"blocked_users": "Mga naka-block na user",
"blocking": "Naka-block",
"bot": "BOT",
+ "copy_account_name": "Kopyahin ang pangalan ng account",
"favourites": "Mga paborito",
"follow": "Sundan",
"follow_back": "Sundan pabalik",
@@ -109,12 +110,12 @@
"block_account": {
"cancel": "Kanselahin",
"confirm": "I-block",
- "title": "Sigurado ka bang gusto mong i-block si {0}?"
+ "description": "Sigurado ka bang gusto mong i-block si {0}?"
},
"block_domain": {
"cancel": "Kanselahin",
"confirm": "I-block",
- "title": "Sigurado ka bang gusto mong i-block ang {0}?"
+ "description": "Sigurado ka bang gusto mong i-block ang {0}?"
},
"common": {
"cancel": "Hindi",
@@ -123,27 +124,27 @@
"delete_list": {
"cancel": "Kanselahin",
"confirm": "Burahin",
- "title": "Sigurado ka bang gusto mong burahin ang listahan na \"{0}\"?"
+ "description": "Sigurado ka bang gusto mong burahin ang listahan na \"{0}\"?"
},
"delete_posts": {
"cancel": "Kanselahin",
"confirm": "Burahin",
- "title": "Sigurado ka bang gusto mong burahin ang post na ito?"
+ "description": "Sigurado ka bang gusto mong burahin ang post na ito?"
},
"mute_account": {
"cancel": "Kanselahin",
"confirm": "I-mute",
- "title": "Sigurado ka bang gusto mong i-mute si {0}?"
+ "description": "Sigurado ka bang gusto mong i-mute si {0}?"
},
"show_reblogs": {
"cancel": "Kanselahin",
"confirm": "Ipakita",
- "title": "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}?"
},
"unfollow": {
"cancel": "Kanselahin",
"confirm": "Huminto sa pagsunod",
- "title": "Sigurado ka bang gusto mong huminto sa pagsunod?"
+ "description": "Sigurado ka bang gusto mong huminto sa pagsunod?"
}
},
"conversation": {
diff --git a/locales/tr-TR.json b/locales/tr-TR.json
index 287be43d79..10dcf900c6 100644
--- a/locales/tr-TR.json
+++ b/locales/tr-TR.json
@@ -13,6 +13,7 @@
"blocked_users": "Engellenen kullanıcılar",
"blocking": "Engelli",
"bot": "BOT",
+ "copy_account_name": "Hesap adını kopyala",
"favourites": "Favoriler",
"follow": "Takip et",
"follow_back": "Geri takip et",
@@ -111,12 +112,12 @@
"block_account": {
"cancel": "İptal et",
"confirm": "Engelle",
- "title": "{0}'i engellemek istediğinizden emin misiniz?"
+ "description": "{0}'i engellemek istediğinizden emin misiniz?"
},
"block_domain": {
"cancel": "İptal et",
"confirm": "Engelle",
- "title": "{0}'i engellemek istediğinizden emin misiniz?"
+ "description": "{0}'i engellemek istediğinizden emin misiniz?"
},
"common": {
"cancel": "Hayır",
@@ -125,27 +126,27 @@
"delete_list": {
"cancel": "İptal et",
"confirm": "Sil",
- "title": "\"{0}\" listesini silmek istediğinizden emin misiniz?"
+ "description": "\"{0}\" listesini silmek istediğinizden emin misiniz?"
},
"delete_posts": {
"cancel": "İptal et",
"confirm": "Sil",
- "title": "Bu gönderiyi silmek istediğinizden emin misiniz?"
+ "description": "Bu gönderiyi silmek istediğinizden emin misiniz?"
},
"mute_account": {
"cancel": "İptal et",
"confirm": "Sessize al",
- "title": "{0} sessize almak istediğinizden emin misiniz?"
+ "description": "{0} sessize almak istediğinizden emin misiniz?"
},
"show_reblogs": {
"cancel": "İptal et",
"confirm": "Göster",
- "title": "{0} tarafından yapılan desteklemeleri göstermek istediğinizden emin misiniz?"
+ "description": "{0} tarafından yapılan desteklemeleri göstermek istediğinizden emin misiniz?"
},
"unfollow": {
"cancel": "İptal et",
"confirm": "Takibi bırak",
- "title": "Takibi bırakmak istediğinizden emin misiniz?"
+ "description": "Takibi bırakmak istediğinizden emin misiniz?"
}
},
"conversation": {
diff --git a/locales/uk-UA.json b/locales/uk-UA.json
index 20f09a1c2f..fb132ab9f9 100644
--- a/locales/uk-UA.json
+++ b/locales/uk-UA.json
@@ -13,6 +13,7 @@
"blocked_users": "Заблоковані користувачі",
"blocking": "Заблоковані",
"bot": "БОТ",
+ "copy_account_name": "Скопіюйте назву облікового запису",
"favourites": "Улюблені",
"follow": "Підписатися",
"follow_back": "Підписатися",
@@ -104,7 +105,7 @@
"delete_posts": {
"cancel": "Скасувати",
"confirm": "Видалити",
- "title": "Ви впевнені, що хочете видалити цей допис?"
+ "description": "Ви впевнені, що хочете видалити цей допис?"
}
},
"conversation": {
diff --git a/locales/vi-VN.json b/locales/vi-VN.json
index 4fa196087f..023ec96982 100644
--- a/locales/vi-VN.json
+++ b/locales/vi-VN.json
@@ -15,6 +15,7 @@
"blocked_users": "Người đã chặn",
"blocking": "Đã chặn",
"bot": "BOT",
+ "copy_account_name": "Sao chép tên tài khoản",
"favourites": "Lượt thích",
"follow": "Theo dõi",
"follow_back": "Theo dõi lại",
@@ -26,6 +27,7 @@
"follows_you": "Đang theo dõi bạn",
"go_to_profile": "Xem hồ sơ",
"joined": "Đã tham gia",
+ "lock": "KHÓA",
"moved_title": "cho hay địa chỉ mới của họ bây giờ là:",
"muted_users": "Người đã ẩn",
"muting": "Đã ẩn",
@@ -35,7 +37,7 @@
"pinned": "Đã ghim",
"posts": "Tút",
"posts_count": "{0} Tút|{0} Tút|{0} Tút",
- "profile_description": "Ảnh bìa của {0}",
+ "profile_description": "Ảnh bìa {0}",
"profile_personal_note": "Ghi chú về người này",
"profile_unavailable": "Hồ sơ không khả dụng",
"reject": "Từ chối theo dõi",
@@ -93,7 +95,7 @@
"activate": "Kích hoạt",
"complete": "Hoàn thành",
"compose_desc": "Soạn tút mới",
- "n_people_in_the_past_n_days": "{0} người trong {1} ngày gần đây",
+ "n_people_in_the_past_n_days": "{0} người nhắc đến trong {1} ngày gần đây",
"select_lang": "Chọn ngôn ngữ",
"sign_in_desc": "Thêm một tài khoản khác",
"switch_account": "Chuyển sang {0}",
@@ -119,12 +121,14 @@
"block_account": {
"cancel": "Hủy bỏ",
"confirm": "Chặn",
- "title": "Bạn có chắc muốn chặn {0}?"
+ "description": "Bạn có chắc muốn chặn {0}?",
+ "title": "Chặn người"
},
"block_domain": {
"cancel": "Hủy bỏ",
"confirm": "Chặn",
- "title": "Bạn có chắc muốn chặn {0}?"
+ "description": "Bạn có chắc muốn chặn {0}?",
+ "title": "Chặn máy chủ"
},
"common": {
"cancel": "Không",
@@ -133,27 +137,32 @@
"delete_list": {
"cancel": "Hủy bỏ",
"confirm": "Xóa",
- "title": "Bạn có chắc muốn xóa \"{0}\"?"
+ "description": "Bạn có chắc muốn xóa \"{0}\"?",
+ "title": "Xóa danh sách"
},
"delete_posts": {
"cancel": "Hủy bỏ",
"confirm": "Xóa",
- "title": "Bạn có chắc muốn xóa tút này?"
+ "description": "Bạn có chắc muốn xóa tút này?",
+ "title": "Xóa tút"
},
"mute_account": {
"cancel": "Hủy bỏ",
"confirm": "Ẩn",
- "title": "Bạn có chắc muốn ẩn {0}?"
+ "description": "Bạn có chắc muốn ẩn {0}?",
+ "title": "Ẩn người"
},
"show_reblogs": {
"cancel": "Hủy bỏ",
- "confirm": "Hiện",
- "title": "Bạn có chắc muốn hiện lượt đăng lại từ {0}?"
+ "confirm": "Xem",
+ "description": "Bạn có chắc muốn xem lượt đăng lại từ {0}?",
+ "title": "Xem lượt đăng lại"
},
"unfollow": {
"cancel": "Hủy bỏ",
"confirm": "Bỏ theo dõi",
- "title": "Bạn có chắc muốn bỏ theo dõi?"
+ "description": "Bạn có chắc muốn bỏ theo dõi?",
+ "title": "Bỏ theo dõi"
}
},
"conversation": {
@@ -216,7 +225,7 @@
"actions": {
"boost": "Đăng lại",
"command_mode": "Chế độ dòng lệnh",
- "compose": "Viết",
+ "compose": "Soạn",
"favourite": "Thích",
"search": "Tìm kiếm",
"title": "Hành động"
@@ -225,7 +234,7 @@
"title": "Media"
},
"navigation": {
- "go_to_home": "Trang chính",
+ "go_to_home": "Trang chủ",
"go_to_notifications": "Thông báo",
"next_status": "Tút tiếp theo",
"previous_status": "Tút trước đó",
@@ -233,7 +242,7 @@
"title": "Điều hướng"
}
},
- "sequence_then": "sau"
+ "sequence_then": "rồi"
},
"menu": {
"add_personal_note": "Thêm ghi chú về {0}",
@@ -255,9 +264,9 @@
"report_account": "Báo cáo {0}",
"share_account": "Chia sẻ {0}",
"share_post": "Chia sẻ tút",
- "show_favourited_and_boosted_by": "Hiện lượt thích và đăng lại",
- "show_reblogs": "Hiện đăng lại từ {0}",
- "show_untranslated": "Hiện bản chưa dịch",
+ "show_favourited_and_boosted_by": "Xem lượt thích và đăng lại",
+ "show_reblogs": "Xem đăng lại từ {0}",
+ "show_untranslated": "Xem bản chưa dịch",
"toggle_theme": {
"dark": "Chế độ Tối",
"light": "Chế độ Sáng"
@@ -280,11 +289,11 @@
"bookmarks": "Tút đã lưu",
"built_at": "Bản dựng {0}",
"compose": "Soạn tút",
- "conversations": "Thảo luận",
+ "conversations": "Nhắn riêng",
"explore": "Khám phá",
"favourites": "Lượt thích",
"federated": "Liên hợp",
- "home": "Trang chính",
+ "home": "Trang chủ",
"list": "Danh sách",
"lists": "Danh sách",
"local": "Máy chủ",
@@ -432,7 +441,7 @@
"theme_color": "Màu"
},
"language": {
- "display_language": "Ngôn ngữ hiển thị",
+ "display_language": "Ngôn ngữ giao diện",
"label": "Ngôn ngữ",
"post_language": "Ngôn ngữ đăng tút",
"status": "Tình trạng dịch: {0}/{1} ({2}%)",
@@ -486,10 +495,10 @@
"unsupported": "Trình duyệt của bạn không hỗ trợ thông báo đẩy.",
"warning": {
"enable_close": "Đóng",
- "enable_description": "Để nhận thông báo khi Elk không mở, hãy bật thông báo đẩy. Bạn có thể kiểm soát chính xác loại tương tác nào sẽ tạo thông báo đẩy thông qua nút \"@:settings.notifications.show_btn{'\"'} ở trên sau khi đã bật.",
- "enable_description_desktop": "Để nhận thông báo khi Elk không mở, hãy bật thông báo đẩy. Bạn có thể kiểm soát chính xác loại tương tác nào sẽ tạo thông báo đẩy trong \"Cài đặt > Thông báo > Thông báo đẩy\" sau khi đã bật.",
- "enable_description_mobile": "Bạn cũng có thể truy cập cài đặt bằng menu điều hướng \"Cài đặt > Thông báo > Thông báo đẩy\".",
- "enable_description_settings": "Để nhận thông báo khi Elk không mở, hãy bật thông báo đẩy. Bạn sẽ có thể kiểm soát chính xác loại tương tác nào sẽ tạo thông báo đẩy trên cùng màn hình này sau khi bạn bật chúng.",
+ "enable_description": "Để nhận thông báo khi không mở Elk, hãy bật thông báo đẩy. Bạn có thể kiểm soát chính xác loại tương tác nào sẽ tạo thông báo đẩy thông qua nút \"@:settings.notifications.show_btn{'\"'} ở trên sau khi đã bật.",
+ "enable_description_desktop": "Để nhận thông báo khi không mở Elk, hãy bật thông báo đẩy. Bạn có thể kiểm soát chính xác loại tương tác nào sẽ tạo thông báo đẩy trong \"Cài đặt > Thông báo > Thông báo đẩy\" sau khi đã bật.",
+ "enable_description_mobile": "Bạn cũng có thể truy cập menu điều hướng \"Cài đặt > Thông báo > Thông báo đẩy\".",
+ "enable_description_settings": "Để nhận thông báo khi không mở Elk, hãy bật thông báo đẩy. Bạn sẽ có thể kiểm soát chính xác loại tương tác nào sẽ tạo thông báo đẩy trên cùng màn hình này sau khi đã bật.",
"enable_desktop": "Bật thông báo đẩy",
"enable_title": "Không bỏ lỡ bất cứ điều gì",
"re_auth": "Hình như máy chủ của bạn không hỗ trợ thông báo đẩy. Hãy thử đăng xuất và đăng nhập lại, nếu thông báo này vẫn xuất hiện, hãy liên hệ với quản trị viên máy chủ của bạn."
@@ -500,10 +509,12 @@
},
"notifications_settings": "Thông báo",
"preferences": {
- "enable_autoplay": "Bật tự động phát",
- "enable_data_saving": "Bật chế độ tiết kiệm dữ liệu mạng",
- "enable_data_saving_description": "Tiết kiệm dữ liệu bằng cách không cho tự động tải file đính kèm.",
- "enable_pinch_to_zoom": "Bật chụm để thu phóng",
+ "embedded_media": "Trình Phát Media Dạng Nhúng",
+ "embedded_media_description": "Khi chia sẻ một liên kết media, hiển thị trình phát dạng nhúng thay vì ảnh mặc định.",
+ "enable_autoplay": "Tự động phát",
+ "enable_data_saving": "Tiết kiệm dữ liệu mạng",
+ "enable_data_saving_description": "Không cho tự động tải file đính kèm.",
+ "enable_pinch_to_zoom": "Chụm 2 ngón tay để thu phóng",
"github_cards": "GitHub Cards",
"github_cards_description": "Khi chia sẻ một liên kết GitHub, hiển thị HTML social graph meta thay vì ảnh mặc định.",
"grayscale_mode": "Chế độ xám",
@@ -516,17 +527,18 @@
"hide_reply_count": "Ẩn số lượt trả lời",
"hide_translation": "Ẩn chức năng dịch",
"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 trong bảng tin. Emoji sẽ vẫn hiển thị trong hồ sơ 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ọ.",
"label": "Thiết lập",
+ "optimize_for_low_performance_device": "Tối ưu cho thiết bị yếu",
"title": "Tính năng thử nghiệm",
"use_star_favorite_icon": "Dùng biểu tượng thích ngôi sao",
- "user_picker": "Chọn người dùng",
- "user_picker_description": "Hiển thị hình đại diện của các tài khoản đã đăng nhập ở phía dưới bên trái để bạn có thể nhanh chóng chuyển đổi giữa chúng.",
- "virtual_scroll": "Cuộn ảo",
- "virtual_scroll_description": "Sử dụng danh sách ảo trong dòng thời gian để có thể hiển thị số lượng mục lớn hơn một cách hiệu quả.",
+ "user_picker": "Chuyển Đổi Tài Khoản",
+ "user_picker_description": "Hiển thị danh sách tài khoản đã đăng nhập ở góc dưới bên trái để nhanh chóng chuyển đổi qua lại.",
+ "virtual_scroll": "Cuộn Ảo",
+ "virtual_scroll_description": "Dùng một danh sách ảo trong các bảng tin để có thể kết xuất số lượng mục lớn hiệu quả.",
"wellbeing": "Chống nghiện",
"zen_mode": "Tập Trung",
- "zen_mode_description": "Ẩn thanh bên trừ khi con trỏ chuột rê qua. Đồng thời ẩn một số thành phần khỏi bảng tin."
+ "zen_mode_description": "Ẩn thanh bên và một số thành phần trên bảng tin."
},
"profile": {
"appearance": {
@@ -578,6 +590,7 @@
},
"boosted_by": "Đăng lại bởi",
"edited": "Đã sửa {0}",
+ "embedded_warning": "Địa chỉ IP của bạn có thể bị lộ.",
"favourited_by": "Thích bởi",
"filter_hidden_phrase": "Lọc theo",
"filter_show_anyway": "Vẫn cứ hiện",
@@ -593,9 +606,9 @@
"finished": "hết hạn {0}"
},
"replying_to": "Trả lời {0}",
- "show_full_thread": "Chuỗi thảo luận",
+ "show_full_thread": "Chuỗi tút liên quan",
"someone": "ai đó",
- "spoiler_media_hidden": "Ẩn media",
+ "spoiler_media_hidden": "Media ẩn",
"spoiler_show_less": "Thu gọn",
"spoiler_show_more": "Mở rộng",
"thread": "Thảo luận",
diff --git a/locales/zh-CN.json b/locales/zh-CN.json
index b2c2afa8b5..8ebd9d449a 100644
--- a/locales/zh-CN.json
+++ b/locales/zh-CN.json
@@ -15,6 +15,7 @@
"blocked_users": "已拉黑的用户",
"blocking": "已拉黑",
"bot": "机器人",
+ "copy_account_name": "复制账户名",
"favourites": "喜欢的帖文",
"follow": "关注",
"follow_back": "回关",
@@ -118,12 +119,12 @@
"block_account": {
"cancel": "取消",
"confirm": "拉黑",
- "title": "你确定拉黑 {0} 吗?"
+ "description": "你确定拉黑 {0} 吗?"
},
"block_domain": {
"cancel": "取消",
"confirm": "拉黑",
- "title": "你确定拉黑域名 {0} 吗?"
+ "description": "你确定拉黑域名 {0} 吗?"
},
"common": {
"cancel": "否",
@@ -132,27 +133,27 @@
"delete_list": {
"cancel": "取消",
"confirm": "删除",
- "title": "你确定要删除 \"{0}\" 列表吗?"
+ "description": "你确定要删除 \"{0}\" 列表吗?"
},
"delete_posts": {
"cancel": "取消",
"confirm": "删除",
- "title": "你确定要删除这条帖文吗?"
+ "description": "你确定要删除这条帖文吗?"
},
"mute_account": {
"cancel": "取消",
"confirm": "屏蔽",
- "title": "你确定屏蔽 {0} 吗?"
+ "description": "你确定屏蔽 {0} 吗?"
},
"show_reblogs": {
"cancel": "取消",
"confirm": "显示",
- "title": "你确定要显示来自 {0} 的转发吗?"
+ "description": "你确定要显示来自 {0} 的转发吗?"
},
"unfollow": {
"cancel": "取消",
"confirm": "取消关注",
- "title": "你确定要取消关注吗?"
+ "description": "你确定要取消关注吗?"
}
},
"conversation": {
diff --git a/locales/zh-TW.json b/locales/zh-TW.json
index 2be7e9b009..804b5e0785 100644
--- a/locales/zh-TW.json
+++ b/locales/zh-TW.json
@@ -13,6 +13,7 @@
"blocked_users": "已封鎖的使用者",
"blocking": "已封鎖",
"bot": "機器人",
+ "copy_account_name": "複製帳戶名",
"favourites": "喜歡的貼文",
"follow": "追蹤",
"follow_back": "回追",
@@ -106,37 +107,37 @@
"block_account": {
"cancel": "取消",
"confirm": "封鎖",
- "title": "你確定要封鎖 {0} 嗎?"
+ "description": "你確定要封鎖 {0} 嗎?"
},
"block_domain": {
"cancel": "取消",
"confirm": "封鎖",
- "title": "你確定要封鎖 {0} 域名嗎?"
+ "description": "你確定要封鎖 {0} 域名嗎?"
},
"delete_list": {
"cancel": "取消",
"confirm": "確認",
- "title": "你確定要刪除 \"{0}\" 列表嗎?"
+ "description": "你確定要刪除 \"{0}\" 列表嗎?"
},
"delete_posts": {
"cancel": "取消",
"confirm": "刪除",
- "title": "你確定要刪除這則貼文嗎?"
+ "description": "你確定要刪除這則貼文嗎?"
},
"mute_account": {
"cancel": "取消",
"confirm": "靜音",
- "title": "你確定要靜音 {0} 嗎?"
+ "description": "你確定要靜音 {0} 嗎?"
},
"show_reblogs": {
"cancel": "取消",
"confirm": "顯示",
- "title": "你確定要顯示來自 {0} 的轉發嗎?"
+ "description": "你確定要顯示來自 {0} 的轉發嗎?"
},
"unfollow": {
"cancel": "取消",
"confirm": "取消追蹤",
- "title": "你確定要取消追蹤嗎?"
+ "description": "你確定要取消追蹤嗎?"
}
},
"conversation": {
diff --git a/middleware/1.permalink.global.ts b/middleware/1.permalink.global.ts
index c6aa8901ec..e27f5fdc72 100644
--- a/middleware/1.permalink.global.ts
+++ b/middleware/1.permalink.global.ts
@@ -43,7 +43,9 @@ export default defineNuxtRouteMiddleware(async (to, from) => {
}
// If we're logged in, search for the local id the account or status corresponds to
- const { accounts, statuses } = await masto.client.value.v2.search({ q: `https:/${to.fullPath}`, resolve: true, limit: 1 })
+ const paginator = masto.client.value.v2.search.list({ q: `https:/${to.fullPath}`, resolve: true, limit: 1 })
+ const { accounts, statuses } = (await paginator.next()).value ?? { accounts: [], statuses: [] }
+
if (statuses[0])
return getStatusRoute(statuses[0])
diff --git a/nuxt.config.ts b/nuxt.config.ts
index 7b4d97b5c0..ee3bfc5a25 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -102,6 +102,12 @@ export default defineNuxtConfig({
namespaceId: '',
apiToken: '',
},
+ vercel: {
+ url: '',
+ token: '',
+ env: '',
+ base: '',
+ },
public: {
privacyPolicyUrl: '',
// We use LibreTranslate (https://github.com/LibreTranslate/LibreTranslate) as
diff --git a/package.json b/package.json
index eddbc7544c..ae6011b4cb 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
"@emoji-mart/data": "^1.1.2",
"@fnando/sparkline": "^0.3.10",
"@iconify-emoji/twemoji": "^1.0.2",
- "@iconify/json": "^2.2.142",
+ "@iconify/json": "^2.2.170",
"@iconify/utils": "^2.1.7",
"@nuxt/devtools": "^1.0.0-beta.1",
"@nuxt/test-utils": "^3.9.0-alpha.1",
@@ -57,6 +57,8 @@
"@tiptap/suggestion": "2.1.8",
"@tiptap/vue-3": "2.1.8",
"@unocss/nuxt": "^0.53.4",
+ "@upstash/redis": "^1.27.1",
+ "@vercel/kv": "^1.0.1",
"@vue-macros/nuxt": "^1.6.0",
"@vueuse/core": "^10.2.1",
"@vueuse/gesture": "2.0.0-beta.1",
@@ -80,13 +82,13 @@
"iso-639-1": "^3.0.0",
"js-yaml": "^4.1.0",
"lru-cache": "^10.0.0",
- "masto": "^5.11.3",
+ "masto": "^6.5.2",
"node-emoji": "^2.1.3",
"nuxt-security": "^0.13.1",
"page-lifecycle": "^0.1.2",
"pinia": "^2.1.4",
"postcss-nested": "^6.0.1",
- "prosemirror-highlight": "^0.3.3",
+ "prosemirror-highlight": "^0.4.0",
"rollup-plugin-node-polyfills": "^0.2.1",
"shikiji": "^0.9.9",
"simple-git": "^3.19.1",
@@ -106,7 +108,8 @@
"vue-advanced-cropper": "^2.8.8",
"vue-virtual-scroller": "2.0.0-beta.8",
"workbox-build": "^7.0.0",
- "workbox-window": "^7.0.0"
+ "workbox-window": "^7.0.0",
+ "ws": "^8.15.1"
},
"devDependencies": {
"@antfu/eslint-config": "^0.41.3",
@@ -119,6 +122,7 @@
"@types/js-yaml": "^4.0.5",
"@types/prettier": "^2.7.3",
"@types/wicg-file-system-access": "^2020.9.6",
+ "@types/ws": "^8.5.10",
"@unlazy/nuxt": "^0.9.3",
"@vue/test-utils": "^2.4.3",
"bumpp": "^9.2.0",
diff --git a/pages/[[server]]/@[account]/[status].vue b/pages/[[server]]/@[account]/[status].vue
index a3aa435057..abf3082ad3 100644
--- a/pages/[[server]]/@[account]/[status].vue
+++ b/pages/[[server]]/@[account]/[status].vue
@@ -22,7 +22,7 @@ const { data: status, pending, refresh: refreshStatus } = useAsyncData(
const { client } = $(useMasto())
const { data: context, pending: pendingContext, refresh: refreshContext } = useAsyncData(
`context:${id}`,
- async () => client.v1.statuses.fetchContext(id),
+ async () => client.v1.statuses.$select(id).context.fetch(),
{ watch: [isHydrated], immediate: isHydrated.value, lazy: true, default: () => shallowRef() },
)
diff --git a/pages/[[server]]/@[account]/index/followers.vue b/pages/[[server]]/@[account]/index/followers.vue
index 691ae2fa3c..08ced164d7 100644
--- a/pages/[[server]]/@[account]/index/followers.vue
+++ b/pages/[[server]]/@[account]/index/followers.vue
@@ -6,7 +6,7 @@ const handle = $(computedEager(() => params.account as string))
definePageMeta({ name: 'account-followers' })
const account = await fetchAccountByHandle(handle)
-const paginator = account ? useMastoClient().v1.accounts.listFollowers(account.id, {}) : null
+const paginator = account ? useMastoClient().v1.accounts.$select(account.id).followers.list() : null
const isSelf = useSelfAccount(account)
diff --git a/pages/[[server]]/@[account]/index/following.vue b/pages/[[server]]/@[account]/index/following.vue
index 173502b975..b0822c6adf 100644
--- a/pages/[[server]]/@[account]/index/following.vue
+++ b/pages/[[server]]/@[account]/index/following.vue
@@ -6,7 +6,7 @@ const handle = $(computedEager(() => params.account as string))
definePageMeta({ name: 'account-following' })
const account = await fetchAccountByHandle(handle)
-const paginator = account ? useMastoClient().v1.accounts.listFollowing(account.id, {}) : null
+const paginator = account ? useMastoClient().v1.accounts.$select(account.id).following.list() : null
const isSelf = useSelfAccount(account)
diff --git a/pages/[[server]]/@[account]/index/index.vue b/pages/[[server]]/@[account]/index/index.vue
index b909ca2de8..4db4c751fb 100644
--- a/pages/[[server]]/@[account]/index/index.vue
+++ b/pages/[[server]]/@[account]/index/index.vue
@@ -14,7 +14,7 @@ function reorderAndFilter(items: mastodon.v1.Status[]) {
return reorderedTimeline(items, 'account')
}
-const paginator = useMastoClient().v1.accounts.listStatuses(account.id, { limit: 30, excludeReplies: true })
+const paginator = useMastoClient().v1.accounts.$select(account.id).statuses.list({ limit: 30, excludeReplies: true })
if (account) {
useHydratedHead({
diff --git a/pages/[[server]]/@[account]/index/media.vue b/pages/[[server]]/@[account]/index/media.vue
index 1ff955acb2..0ca8089cf0 100644
--- a/pages/[[server]]/@[account]/index/media.vue
+++ b/pages/[[server]]/@[account]/index/media.vue
@@ -7,7 +7,7 @@ const handle = $(computedEager(() => params.account as string))
const account = await fetchAccountByHandle(handle)
-const paginator = useMastoClient().v1.accounts.listStatuses(account.id, { onlyMedia: true, excludeReplies: false })
+const paginator = useMastoClient().v1.accounts.$select(account.id).statuses.list({ onlyMedia: true, excludeReplies: false })
if (account) {
useHydratedHead({
diff --git a/pages/[[server]]/@[account]/index/with_replies.vue b/pages/[[server]]/@[account]/index/with_replies.vue
index 189a8d5f7b..d28fd3b9e7 100644
--- a/pages/[[server]]/@[account]/index/with_replies.vue
+++ b/pages/[[server]]/@[account]/index/with_replies.vue
@@ -7,7 +7,7 @@ const handle = $(computedEager(() => params.account as string))
const account = await fetchAccountByHandle(handle)
-const paginator = useMastoClient().v1.accounts.listStatuses(account.id, { excludeReplies: false })
+const paginator = useMastoClient().v1.accounts.$select(account.id).statuses.list({ excludeReplies: false })
if (account) {
useHydratedHead({
diff --git a/pages/[[server]]/explore/index.vue b/pages/[[server]]/explore/index.vue
index 56d825d033..af73137b9f 100644
--- a/pages/[[server]]/explore/index.vue
+++ b/pages/[[server]]/explore/index.vue
@@ -3,7 +3,7 @@ import { STORAGE_KEY_HIDE_EXPLORE_POSTS_TIPS } from '~~/constants'
const { t } = useI18n()
-const paginator = useMastoClient().v1.trends.listStatuses()
+const paginator = useMastoClient().v1.trends.statuses.list()
const hideNewsTips = useLocalStorage(STORAGE_KEY_HIDE_EXPLORE_POSTS_TIPS, false)
diff --git a/pages/[[server]]/explore/links.vue b/pages/[[server]]/explore/links.vue
index bafcfbc2dc..a955e4bb84 100644
--- a/pages/[[server]]/explore/links.vue
+++ b/pages/[[server]]/explore/links.vue
@@ -3,7 +3,7 @@ import { STORAGE_KEY_HIDE_EXPLORE_NEWS_TIPS } from '~~/constants'
const { t } = useI18n()
-const paginator = useMastoClient().v1.trends.listLinks()
+const paginator = useMastoClient().v1.trends.links.list()
const hideNewsTips = useLocalStorage(STORAGE_KEY_HIDE_EXPLORE_NEWS_TIPS, false)
diff --git a/pages/[[server]]/explore/tags.vue b/pages/[[server]]/explore/tags.vue
index d21aeb2ac9..e5d2c661f2 100644
--- a/pages/[[server]]/explore/tags.vue
+++ b/pages/[[server]]/explore/tags.vue
@@ -4,7 +4,7 @@ import { STORAGE_KEY_HIDE_EXPLORE_TAGS_TIPS } from '~~/constants'
const { t } = useI18n()
const { client } = $(useMasto())
-const paginator = client.v1.trends.listTags({
+const paginator = client.v1.trends.tags.list({
limit: 20,
})
diff --git a/pages/[[server]]/list/[list]/index.vue b/pages/[[server]]/list/[list]/index.vue
index 05407553ed..4b1b974192 100644
--- a/pages/[[server]]/list/[list]/index.vue
+++ b/pages/[[server]]/list/[list]/index.vue
@@ -32,7 +32,7 @@ const tabs = $computed(() => [
)
const { client } = $(useMasto())
-const { data: listInfo, refresh } = $(await useAsyncData(() => client.v1.lists.fetch(list), { default: () => shallowRef() }))
+const { data: listInfo, refresh } = $(await useAsyncData(() => client.v1.lists.$select(list).fetch(), { default: () => shallowRef() }))
if (listInfo) {
useHydratedHead({
diff --git a/pages/[[server]]/list/[list]/index/accounts.vue b/pages/[[server]]/list/[list]/index/accounts.vue
index 5bf01f0f82..9e478fa18e 100644
--- a/pages/[[server]]/list/[list]/index/accounts.vue
+++ b/pages/[[server]]/list/[list]/index/accounts.vue
@@ -6,7 +6,7 @@ definePageMeta({
const params = useRoute().params
const listId = $(computedEager(() => params.list as string))
-const paginator = useMastoClient().v1.lists.listAccounts(listId)
+const paginator = useMastoClient().v1.lists.$select(listId).accounts.list()
diff --git a/pages/[[server]]/list/[list]/index/index.vue b/pages/[[server]]/list/[list]/index/index.vue
index 8b41b97f7c..44b6346d3e 100644
--- a/pages/[[server]]/list/[list]/index/index.vue
+++ b/pages/[[server]]/list/[list]/index/index.vue
@@ -8,8 +8,8 @@ const listId = $(computedEager(() => params.list as string))
const client = useMastoClient()
-const paginator = client.v1.timelines.listList(listId)
-const stream = useStreaming(client => client.v1.stream.streamListTimeline(listId))
+const paginator = client.v1.timelines.list.$select(listId).list()
+const stream = useStreaming(client => client.list.subscribe({ list: listId }))
diff --git a/pages/[[server]]/tags/[tag].vue b/pages/[[server]]/tags/[tag].vue
index dfbc0cfee7..c326589f7b 100644
--- a/pages/[[server]]/tags/[tag].vue
+++ b/pages/[[server]]/tags/[tag].vue
@@ -7,10 +7,10 @@ const params = useRoute().params
const tagName = $(computedEager(() => params.tag as string))
const { client } = $(useMasto())
-const { data: tag, refresh } = $(await useAsyncData(() => client.v1.tags.fetch(tagName), { default: () => shallowRef() }))
+const { data: tag, refresh } = $(await useAsyncData(() => client.v1.tags.$select(tagName).fetch(), { default: () => shallowRef() }))
-const paginator = client.v1.timelines.listHashtag(tagName)
-const stream = useStreaming(client => client.v1.stream.streamTagTimeline(tagName))
+const paginator = client.v1.timelines.tag.$select(tagName).list()
+const stream = useStreaming(client => client.hashtag.subscribe({ tag: tagName }))
if (tag) {
useHydratedHead({
@@ -28,7 +28,7 @@ onReactivated(() => {
- #{{ tagName }}
+ #{{ tagName }}
diff --git a/pages/settings/preferences/index.vue b/pages/settings/preferences/index.vue
index e7457149b7..a45a62f1f6 100644
--- a/pages/settings/preferences/index.vue
+++ b/pages/settings/preferences/index.vue
@@ -34,6 +34,12 @@ const userSettings = useUserSettings()
>
{{ $t('settings.preferences.enable_autoplay') }}
+
+ {{ $t('settings.preferences.optimize_for_low_performance_device') }}
+
{
if (!isCanSubmit.value)
return
- const res = await client.v1.accounts.updateCredentials(dirtyFields.value as mastodon.v1.UpdateCredentialsParams)
+ const res = await client.v1.accounts.updateCredentials(dirtyFields.value as mastodon.rest.v1.UpdateCredentialsParams)
.then(account => ({ account }))
.catch((error: Error) => ({ error }))
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 673424e653..547933be9c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -27,14 +27,14 @@ importers:
specifier: ^1.0.2
version: 1.0.2
'@iconify/json':
- specifier: ^2.2.142
- version: 2.2.142
+ specifier: ^2.2.170
+ version: 2.2.170
'@iconify/utils':
specifier: ^2.1.7
version: 2.1.7
'@nuxt/devtools':
specifier: ^1.0.0-beta.1
- version: 1.0.4(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@2.79.1)(vite@4.5.0)
+ version: 1.0.4(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@2.79.1)(vite@4.5.0)
'@nuxt/test-utils':
specifier: ^3.9.0-alpha.1
version: 3.9.0-alpha.1(@vue/test-utils@2.4.3)(h3@1.9.0)(happy-dom@10.5.2)(rollup@2.79.1)(vite@4.5.0)(vitest@1.1.0)(vue-router@4.2.5)(vue@3.3.9)
@@ -92,6 +92,12 @@ importers:
'@unocss/nuxt':
specifier: ^0.53.4
version: 0.53.4(postcss@8.4.32)(rollup@2.79.1)(vite@4.5.0)(webpack@5.89.0)
+ '@upstash/redis':
+ specifier: ^1.27.1
+ version: 1.27.1
+ '@vercel/kv':
+ specifier: ^1.0.1
+ version: 1.0.1
'@vue-macros/nuxt':
specifier: ^1.6.0
version: 1.6.0(@vue-macros/reactivity-transform@0.3.23)(@vueuse/core@10.2.1)(nuxt@3.8.2)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)(vue@3.3.9)(webpack@5.89.0)
@@ -162,8 +168,8 @@ importers:
specifier: ^10.0.0
version: 10.0.1
masto:
- specifier: ^5.11.3
- version: 5.11.3
+ specifier: ^6.5.2
+ version: 6.5.2
node-emoji:
specifier: ^2.1.3
version: 2.1.3
@@ -180,8 +186,8 @@ importers:
specifier: ^6.0.1
version: 6.0.1(postcss@8.4.32)
prosemirror-highlight:
- specifier: ^0.3.3
- version: 0.3.3(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.5)(shikiji@0.9.9)
+ specifier: ^0.4.0
+ version: 0.4.0(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(shikiji@0.9.9)
rollup-plugin-node-polyfills:
specifier: ^0.2.1
version: 0.2.1
@@ -205,10 +211,10 @@ importers:
version: 5.0.1
tauri-plugin-log-api:
specifier: github:tauri-apps/tauri-plugin-log
- version: github.com/tauri-apps/tauri-plugin-log/91dd3fe9dcaa69bae62706e75702a0ce18ce9885
+ version: github.com/tauri-apps/tauri-plugin-log/19f5dcc0425e9127d2c591780e5047b83e77a7c2
tauri-plugin-store-api:
specifier: github:tauri-apps/tauri-plugin-store
- version: github.com/tauri-apps/tauri-plugin-store/3367248b2661abcb73d2a89f30df780c387fb57d
+ version: github.com/tauri-apps/tauri-plugin-store/7d2632996f290b0f18cc5f8a2b2791046400690e
theme-vitesse:
specifier: ^0.7.2
version: 0.7.2
@@ -242,6 +248,9 @@ importers:
workbox-window:
specifier: ^7.0.0
version: 7.0.0
+ ws:
+ specifier: ^8.15.1
+ version: 8.15.1
devDependencies:
'@antfu/eslint-config':
specifier: ^0.41.3
@@ -273,6 +282,9 @@ importers:
'@types/wicg-file-system-access':
specifier: ^2020.9.6
version: 2020.9.6
+ '@types/ws':
+ specifier: ^8.5.10
+ version: 8.5.10
'@unlazy/nuxt':
specifier: ^0.9.3
version: 0.9.3(rollup@2.79.1)
@@ -299,7 +311,7 @@ importers:
version: 14.0.1
nuxt:
specifier: 3.8.2
- version: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ version: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
prettier:
specifier: ^3.0.3
version: 3.0.3
@@ -333,10 +345,10 @@ importers:
devDependencies:
'@nuxt-themes/docus':
specifier: ^1.14.6
- version: 1.14.6(idb-keyval@6.2.1)(nuxt@3.8.2)(postcss@8.4.32)(rollup@3.29.4)(vue@3.3.9)
+ version: 1.14.6(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(nuxt@3.8.2)(postcss@8.4.32)(rollup@3.29.4)(vue@3.3.9)
nuxt:
specifier: ^3.7.0
- version: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ version: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
packages:
@@ -2382,8 +2394,8 @@ packages:
resolution: {integrity: sha512-C4W6ov4BkDXiVU3GzyqyVo8SBbU21KivXnZERgAnrYZEKjuiI3JwPDnu9oVJPsUkNI/Q4SM8iVnXjGW6kxt9DQ==}
dev: false
- /@iconify/json@2.2.142:
- resolution: {integrity: sha512-EfQv1GMGxOySdwaGR3+Diqudkwk4W299cNtcQhg7QAlH9x6FW9851raiYvdOsMZp0ya+Ye+evTTqxyZ4vEh5cw==}
+ /@iconify/json@2.2.170:
+ resolution: {integrity: sha512-KJQ+LPj5KOpBrTknm0vpb2A6+T12ZyIFInubW3kT/58eZRKtiDv5D87QWVXczL5/uyDr2rkRu8rAfOrGr/UFhA==}
dependencies:
'@iconify/types': 2.0.0
pathe: 1.1.1
@@ -2693,18 +2705,6 @@ packages:
- encoding
- supports-color
- /@mastojs/ponyfills@1.0.4:
- resolution: {integrity: sha512-1NaIGmcU7OmyNzx0fk+cYeGTkdXlOJOSdetaC4pStVWsrhht2cdlYSAfe5NDW3FcUmcEm2vVceB9lcClN1RCxw==}
- dependencies:
- '@types/node': 18.16.19
- '@types/node-fetch': 2.6.4
- abort-controller: 3.0.0
- form-data: 4.0.0
- node-fetch: 2.6.12
- transitivePeerDependencies:
- - encoding
- dev: false
-
/@netlify/functions@2.4.0:
resolution: {integrity: sha512-dIqhdj5u4Lu/8qbYwtYpn8NfvIyPHbSTV2lAP4ocL+iwC9As06AXT0wa/xOpO2vRWJa0IMxdZaqCPnkyHlHiyg==}
engines: {node: '>=14.0.0'}
@@ -2804,13 +2804,13 @@ packages:
transitivePeerDependencies:
- supports-color
- /@nuxt-themes/docus@1.14.6(idb-keyval@6.2.1)(nuxt@3.8.2)(postcss@8.4.32)(rollup@3.29.4)(vue@3.3.9):
+ /@nuxt-themes/docus@1.14.6(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(nuxt@3.8.2)(postcss@8.4.32)(rollup@3.29.4)(vue@3.3.9):
resolution: {integrity: sha512-tkSG7j0jhVo53wEpK9V48hIvaK0XEzVU64hXhFfnIMv6LJu99cKOC//boebPbN9qLbJmkBdo4IAIJ0tN5MD0qw==}
dependencies:
'@nuxt-themes/elements': 0.9.4(postcss@8.4.32)(rollup@3.29.4)(vue@3.3.9)
'@nuxt-themes/tokens': 1.9.1(postcss@8.4.32)(rollup@3.29.4)(vue@3.3.9)
'@nuxt-themes/typography': 0.11.0(postcss@8.4.32)(rollup@3.29.4)(vue@3.3.9)
- '@nuxt/content': 2.7.2(idb-keyval@6.2.1)(rollup@3.29.4)
+ '@nuxt/content': 2.7.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(rollup@3.29.4)
'@nuxthq/studio': 0.13.4(rollup@3.29.4)
'@vueuse/integrations': 10.2.1(focus-trap@7.5.2)(fuse.js@6.6.2)(idb-keyval@6.2.1)(vue@3.3.9)
'@vueuse/nuxt': 10.2.1(nuxt@3.8.2)(rollup@3.29.4)(vue@3.3.9)
@@ -2893,7 +2893,7 @@ packages:
- vue
dev: true
- /@nuxt/content@2.7.2(idb-keyval@6.2.1)(rollup@3.29.4):
+ /@nuxt/content@2.7.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(rollup@3.29.4):
resolution: {integrity: sha512-fP0nrnyjtFbluKltKUtC7jSMFc1xAH+bwweZyLwXb3gkIap2EHlVL+e9ptGt39+4HIkRkLgME7TNr/fUO+CHug==}
dependencies:
'@nuxt/kit': 3.8.2(rollup@3.29.4)
@@ -2930,7 +2930,7 @@ packages:
unist-util-position: 5.0.0
unist-util-stringify-position: 4.0.0
unist-util-visit: 5.0.0
- unstorage: 1.9.0(idb-keyval@6.2.1)
+ unstorage: 1.9.0(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)
ws: 8.14.2
transitivePeerDependencies:
- '@azure/app-configuration'
@@ -2962,7 +2962,7 @@ packages:
'@nuxt/kit': 3.8.2(rollup@2.79.1)
'@nuxt/schema': 3.8.2(rollup@2.79.1)
execa: 7.2.0
- nuxt: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ nuxt: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
vite: 4.5.0
transitivePeerDependencies:
- rollup
@@ -2977,7 +2977,7 @@ packages:
'@nuxt/kit': 3.8.2(rollup@3.29.4)
'@nuxt/schema': 3.8.2(rollup@3.29.4)
execa: 7.2.0
- nuxt: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ nuxt: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
vite: 4.5.0
transitivePeerDependencies:
- rollup
@@ -2999,7 +2999,7 @@ packages:
rc9: 2.1.1
semver: 7.5.4
- /@nuxt/devtools@1.0.4(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@2.79.1)(vite@4.5.0):
+ /@nuxt/devtools@1.0.4(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@2.79.1)(vite@4.5.0):
resolution: {integrity: sha512-G1Oo9+TaOYzePIXpNX+Zzalw/rJyIZKZpZmXfzolPlOJSA1i0JKzZX6Z7iQHdqPwNJ8t+HnVaF4PghPIpo1kwg==}
hasBin: true
peerDependencies:
@@ -3025,8 +3025,8 @@ packages:
launch-editor: 2.6.1
local-pkg: 0.5.0
magicast: 0.3.2
- nitropack: 2.8.1(idb-keyval@6.2.1)
- nuxt: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ nitropack: 2.8.1(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)
+ nuxt: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
nypm: 0.3.3
ofetch: 1.3.3
ohash: 1.1.3
@@ -3065,7 +3065,7 @@ packages:
- utf-8-validate
- xml2js
- /@nuxt/devtools@1.0.4(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@3.29.4)(vite@4.5.0):
+ /@nuxt/devtools@1.0.4(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@3.29.4)(vite@4.5.0):
resolution: {integrity: sha512-G1Oo9+TaOYzePIXpNX+Zzalw/rJyIZKZpZmXfzolPlOJSA1i0JKzZX6Z7iQHdqPwNJ8t+HnVaF4PghPIpo1kwg==}
hasBin: true
peerDependencies:
@@ -3091,8 +3091,8 @@ packages:
launch-editor: 2.6.1
local-pkg: 0.5.0
magicast: 0.3.2
- nitropack: 2.8.1(idb-keyval@6.2.1)
- nuxt: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ nitropack: 2.8.1(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)
+ nuxt: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
nypm: 0.3.3
ofetch: 1.3.3
ohash: 1.1.3
@@ -4166,8 +4166,8 @@ packages:
string.prototype.matchall: 4.0.8
dev: false
- /@tauri-apps/api@1.5.1:
- resolution: {integrity: sha512-6unsZDOdlXTmauU3NhWhn+Cx0rODV+rvNvTdvolE5Kls5ybA6cqndQENDt1+FS0tF7ozCP66jwWoH6a5h90BrA==}
+ /@tauri-apps/api@1.5.3:
+ resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==}
engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'}
dev: false
@@ -4403,14 +4403,14 @@ packages:
prosemirror-keymap: 1.2.2
prosemirror-markdown: 1.11.1
prosemirror-menu: 1.2.2
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-schema-basic: 1.2.2
prosemirror-schema-list: 1.3.0
prosemirror-state: 1.4.3
prosemirror-tables: 1.3.4
- prosemirror-trailing-node: 2.0.4(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.5)
+ prosemirror-trailing-node: 2.0.4(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)
prosemirror-transform: 1.7.3
- prosemirror-view: 1.31.5
+ prosemirror-view: 1.32.7
transitivePeerDependencies:
- supports-color
dev: false
@@ -4568,17 +4568,6 @@ packages:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: true
- /@types/node-fetch@2.6.4:
- resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==}
- dependencies:
- '@types/node': 20.8.6
- form-data: 3.0.1
- dev: false
-
- /@types/node@18.16.19:
- resolution: {integrity: sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==}
- dev: false
-
/@types/node@20.8.6:
resolution: {integrity: sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==}
dependencies:
@@ -4644,6 +4633,12 @@ packages:
resolution: {integrity: sha512-6hogE75Hl2Ov/jgp8ZhDaGmIF/q3J07GtXf8nCJCwKTHq7971po5+DId7grft09zG7plBwpF6ZU0yx9Du4/e1A==}
dev: true
+ /@types/ws@8.5.10:
+ resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
+ dependencies:
+ '@types/node': 20.8.6
+ dev: true
+
/@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.1.6):
resolution: {integrity: sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==}
engines: {node: ^16.0.0 || >=18.0.0}
@@ -5123,6 +5118,22 @@ packages:
- rollup
dev: false
+ /@upstash/redis@1.25.1:
+ resolution: {integrity: sha512-ACj0GhJ4qrQyBshwFgPod6XufVEfKX2wcaihsEvSdLYnY+m+pa13kGt1RXm/yTHKf4TQi/Dy2A8z/y6WUEOmlg==}
+ dependencies:
+ crypto-js: 4.2.0
+
+ /@upstash/redis@1.27.1:
+ resolution: {integrity: sha512-K9UgTBypJ4Dx65s2u5auoyf/5YoCQjaN91QtxlkNg+3g0rqXXy4ELtzACstk1v+bTa547Mm3rzTjotDX/s9+Zg==}
+ dependencies:
+ crypto-js: 4.2.0
+
+ /@vercel/kv@1.0.1:
+ resolution: {integrity: sha512-uTKddsqVYS2GRAM/QMNNXCTuw9N742mLoGRXoNDcyECaxEXvIHG0dEY+ZnYISV4Vz534VwJO+64fd9XeSggSKw==}
+ engines: {node: '>=14.6'}
+ dependencies:
+ '@upstash/redis': 1.25.1
+
/@vercel/nft@0.24.3:
resolution: {integrity: sha512-IyBdIxmFAeGZnEfMgt4QrGK7XX4lWazlQj34HEi9dw04/WeDBJ7r1yaOIO5tTf9pbfvwUFodj9b0H+NDGGoOMg==}
engines: {node: '>=16'}
@@ -5618,7 +5629,7 @@ packages:
'@vue-macros/common': 1.7.2(rollup@2.79.1)(vue@3.3.9)
'@vue-macros/short-vmodel': 1.2.15(rollup@2.79.1)(vue@3.3.9)
'@vue-macros/volar': 0.13.3(@vue-macros/reactivity-transform@0.3.23)(rollup@2.79.1)(typescript@5.1.6)(vue-tsc@1.8.8)(vue@3.3.9)
- nuxt: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ nuxt: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
unplugin-vue-macros: 2.4.4(@vueuse/core@10.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue@3.3.9)(webpack@5.89.0)
transitivePeerDependencies:
- '@vue-macros/reactivity-transform'
@@ -6037,7 +6048,7 @@ packages:
'@vueuse/core': 10.2.1(vue@3.3.9)
'@vueuse/metadata': 10.2.1
local-pkg: 0.4.3
- nuxt: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ nuxt: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
vue-demi: 0.14.5(vue@3.3.9)
transitivePeerDependencies:
- '@vue/composition-api'
@@ -6055,7 +6066,7 @@ packages:
'@vueuse/core': 10.2.1(vue@3.3.9)
'@vueuse/metadata': 10.2.1
local-pkg: 0.4.3
- nuxt: 3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
+ nuxt: 3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8)
vue-demi: 0.14.5(vue@3.3.9)
transitivePeerDependencies:
- '@vue/composition-api'
@@ -6198,13 +6209,6 @@ packages:
/abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
- /abort-controller@3.0.0:
- resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
- engines: {node: '>=6.5'}
- dependencies:
- event-target-shim: 5.0.1
- dev: false
-
/acorn-import-assertions@1.9.0(acorn@8.11.2):
resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==}
peerDependencies:
@@ -7185,6 +7189,9 @@ packages:
resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
dev: false
+ /crypto-js@4.2.0:
+ resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
+
/crypto-random-string@2.0.0:
resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
engines: {node: '>=8'}
@@ -8251,13 +8258,13 @@ packages:
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
engines: {node: '>= 0.6'}
- /event-target-shim@5.0.1:
- resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
- engines: {node: '>=6'}
- dev: false
-
/eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+ dev: true
+
+ /events-to-async@2.0.1:
+ resolution: {integrity: sha512-RtnLYrMbXp4JkZIoZu+3VTqV21bNVBlJBZ4NmtwvMNqSE3qouhxv2gvLE4JJDaQc54ioPkrX74V6x+hp/hqjkQ==}
+ dev: false
/events@3.3.0:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
@@ -8451,15 +8458,6 @@ packages:
cross-spawn: 7.0.3
signal-exit: 4.1.0
- /form-data@3.0.1:
- resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
- engines: {node: '>= 6'}
- dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- mime-types: 2.1.35
- dev: false
-
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
@@ -9486,12 +9484,12 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
- /isomorphic-ws@5.0.0(ws@8.14.2):
+ /isomorphic-ws@5.0.0(ws@8.15.1):
resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
peerDependencies:
ws: '*'
dependencies:
- ws: 8.14.2
+ ws: 8.15.1
dev: false
/jackspeak@2.2.1:
@@ -9990,19 +9988,16 @@ packages:
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
dev: true
- /masto@5.11.3:
- resolution: {integrity: sha512-GtSnrqm5fHPaaU0iwag4LCmvpp82rDng6yOZinmOJHHlUfo6Gnq5QY6x3lJCxCnsPIXpTu1yaX42bWrSQyoQPA==}
+ /masto@6.5.2:
+ resolution: {integrity: sha512-JfnG7MSQmhszWnLsvdBuxXc2tcVUyCvlTxnSH/5S+In4dU1tvc1wGhFR87kO+YW8gfDsDw9CHh+AD/z+DbTTfQ==}
dependencies:
- '@mastojs/ponyfills': 1.0.4
change-case: 4.1.2
- eventemitter3: 5.0.1
- isomorphic-ws: 5.0.0(ws@8.14.2)
- qs: 6.11.2
- semver: 7.5.4
- ws: 8.14.2
+ events-to-async: 2.0.1
+ isomorphic-ws: 5.0.0(ws@8.15.1)
+ ts-custom-error: 3.3.1
+ ws: 8.15.1
transitivePeerDependencies:
- bufferutil
- - encoding
- utf-8-validate
dev: false
@@ -10675,7 +10670,7 @@ packages:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
dev: false
- /nitropack@2.8.1(idb-keyval@6.2.1):
+ /nitropack@2.8.1(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1):
resolution: {integrity: sha512-pODv2kEEzZSDQR+1UMXbGyNgMedUDq/qUomtiAnQKQvLy52VGlecXO1xDfH3i0kP1yKEcKTnWsx1TAF5gHM7xQ==}
engines: {node: ^16.11.0 || >=17.0.0}
hasBin: true
@@ -10748,7 +10743,7 @@ packages:
unctx: 2.3.1
unenv: 1.8.0
unimport: 3.6.0(rollup@4.6.0)
- unstorage: 1.9.0(idb-keyval@6.2.1)
+ unstorage: 1.9.0(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -11043,7 +11038,7 @@ packages:
dev: false
patched: true
- /nuxt@3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8):
+ /nuxt@3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@2.79.1)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8):
resolution: {integrity: sha512-HUAyifmqTs2zcQBGvcby3KNs2pBAk+l7ZbLjD1oCNqQQ+wBuZ1qgLC4Ebu++y4g3o3Y8WAWSvpafbKRLQZziPw==}
engines: {node: ^14.18.0 || >=16.10.0}
hasBin: true
@@ -11057,7 +11052,7 @@ packages:
optional: true
dependencies:
'@nuxt/devalue': 2.0.2
- '@nuxt/devtools': 1.0.4(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@2.79.1)(vite@4.5.0)
+ '@nuxt/devtools': 1.0.4(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@2.79.1)(vite@4.5.0)
'@nuxt/kit': 3.8.2(rollup@2.79.1)
'@nuxt/schema': 3.8.2(rollup@2.79.1)
'@nuxt/telemetry': 2.5.2(rollup@2.79.1)
@@ -11086,7 +11081,7 @@ packages:
knitwork: 1.0.0
magic-string: 0.30.5
mlly: 1.4.2
- nitropack: 2.8.1(idb-keyval@6.2.1)
+ nitropack: 2.8.1(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)
nuxi: 3.10.0
nypm: 0.3.3
ofetch: 1.3.3
@@ -11146,7 +11141,7 @@ packages:
- vue-tsc
- xml2js
- /nuxt@3.8.2(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8):
+ /nuxt@3.8.2(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(eslint@8.49.0)(idb-keyval@6.2.1)(rollup@3.29.4)(typescript@5.1.6)(vite@4.5.0)(vue-tsc@1.8.8):
resolution: {integrity: sha512-HUAyifmqTs2zcQBGvcby3KNs2pBAk+l7ZbLjD1oCNqQQ+wBuZ1qgLC4Ebu++y4g3o3Y8WAWSvpafbKRLQZziPw==}
engines: {node: ^14.18.0 || >=16.10.0}
hasBin: true
@@ -11160,7 +11155,7 @@ packages:
optional: true
dependencies:
'@nuxt/devalue': 2.0.2
- '@nuxt/devtools': 1.0.4(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@3.29.4)(vite@4.5.0)
+ '@nuxt/devtools': 1.0.4(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)(nuxt@3.8.2)(rollup@3.29.4)(vite@4.5.0)
'@nuxt/kit': 3.8.2(rollup@3.29.4)
'@nuxt/schema': 3.8.2(rollup@3.29.4)
'@nuxt/telemetry': 2.5.2(rollup@3.29.4)
@@ -11189,7 +11184,7 @@ packages:
knitwork: 1.0.0
magic-string: 0.30.5
mlly: 1.4.2
- nitropack: 2.8.1(idb-keyval@6.2.1)
+ nitropack: 2.8.1(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1)
nuxi: 3.10.0
nypm: 0.3.3
ofetch: 1.3.3
@@ -12096,7 +12091,7 @@ packages:
/prosemirror-commands@1.5.2:
resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==}
dependencies:
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-state: 1.4.3
prosemirror-transform: 1.7.3
dev: false
@@ -12106,20 +12101,20 @@ packages:
dependencies:
prosemirror-state: 1.4.3
prosemirror-transform: 1.7.3
- prosemirror-view: 1.31.5
+ prosemirror-view: 1.32.7
dev: false
/prosemirror-gapcursor@1.3.2:
resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==}
dependencies:
prosemirror-keymap: 1.2.2
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-state: 1.4.3
- prosemirror-view: 1.31.5
+ prosemirror-view: 1.32.7
dev: false
- /prosemirror-highlight@0.3.3(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.5)(shikiji@0.9.9):
- resolution: {integrity: sha512-tOGyPvmRKZ49ubzKmFIwiwS7CNXlU9g/D4zZLaHGzXLVNVnBrmbDOajZ4eP0lylOAWPxZN+vrFZ9DwrtyikuoA==}
+ /prosemirror-highlight@0.4.0(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(shikiji@0.9.9):
+ resolution: {integrity: sha512-RHGi5QjcWnWgn6bMkjbC2+ehv9Piv3D5UN/dNJG2r738NCQCFye0dkFa6c1oURsvUuwpFiQREqp1YYGpGbZOuA==}
peerDependencies:
'@types/hast': ^3.0.0
highlight.js: ^11.9.0
@@ -12129,7 +12124,7 @@ packages:
prosemirror-transform: ^1.8.0
prosemirror-view: ^1.32.4
refractor: ^4.8.1
- shiki: ^0.14.6
+ shiki: ^0.14.0
shikiji: ^0.8.0 || ^0.9.0
peerDependenciesMeta:
'@types/hast':
@@ -12153,9 +12148,9 @@ packages:
shikiji:
optional: true
dependencies:
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-state: 1.4.3
- prosemirror-view: 1.31.5
+ prosemirror-view: 1.32.7
shikiji: 0.9.9
dev: false
@@ -12164,7 +12159,7 @@ packages:
dependencies:
prosemirror-state: 1.4.3
prosemirror-transform: 1.7.3
- prosemirror-view: 1.31.5
+ prosemirror-view: 1.32.7
rope-sequence: 1.3.4
dev: false
@@ -12186,7 +12181,7 @@ packages:
resolution: {integrity: sha512-CLOieKoaSSEusKyYcXIj8v2qHGLW+tnuffci+8678Sen48NEFQE7M3o0Nx0gj9v63iVDj+yLibj2gCe8eb3jIw==}
dependencies:
markdown-it: 13.0.1
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
dev: false
/prosemirror-menu@1.2.2:
@@ -12198,8 +12193,8 @@ packages:
prosemirror-state: 1.4.3
dev: false
- /prosemirror-model@1.19.2:
- resolution: {integrity: sha512-RXl0Waiss4YtJAUY3NzKH0xkJmsZupCIccqcIFoLTIKFlKNbIvFDRl27/kQy1FP8iUAxrjRRfIVvOebnnXJgqQ==}
+ /prosemirror-model@1.19.4:
+ resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==}
dependencies:
orderedmap: 2.1.1
dev: false
@@ -12207,13 +12202,13 @@ packages:
/prosemirror-schema-basic@1.2.2:
resolution: {integrity: sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==}
dependencies:
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
dev: false
/prosemirror-schema-list@1.3.0:
resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==}
dependencies:
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-state: 1.4.3
prosemirror-transform: 1.7.3
dev: false
@@ -12221,22 +12216,22 @@ packages:
/prosemirror-state@1.4.3:
resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==}
dependencies:
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-transform: 1.7.3
- prosemirror-view: 1.31.5
+ prosemirror-view: 1.32.7
dev: false
/prosemirror-tables@1.3.4:
resolution: {integrity: sha512-z6uLSQ1BLC3rgbGwZmpfb+xkdvD7W/UOsURDfognZFYaTtc0gsk7u/t71Yijp2eLflVpffMk6X0u0+u+MMDvIw==}
dependencies:
prosemirror-keymap: 1.2.2
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-state: 1.4.3
prosemirror-transform: 1.7.3
- prosemirror-view: 1.31.5
+ prosemirror-view: 1.32.7
dev: false
- /prosemirror-trailing-node@2.0.4(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.5):
+ /prosemirror-trailing-node@2.0.4(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7):
resolution: {integrity: sha512-0Yl9w7IdHkaCdqR+NE3FOucePME4OmiGcybnF1iasarEILP5U8+4xTnl53yafULjmwcg1SrSG65Hg7Zk2H2v3g==}
peerDependencies:
prosemirror-model: ^1.19.0
@@ -12247,9 +12242,9 @@ packages:
'@remirror/core-constants': 2.0.1
'@remirror/core-helpers': 2.0.3
escape-string-regexp: 4.0.0
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-state: 1.4.3
- prosemirror-view: 1.31.5
+ prosemirror-view: 1.32.7
transitivePeerDependencies:
- supports-color
dev: false
@@ -12257,13 +12252,13 @@ packages:
/prosemirror-transform@1.7.3:
resolution: {integrity: sha512-qDapyx5lqYfxVeUWEw0xTGgeP2S8346QtE7DxkalsXlX89lpzkY6GZfulgfHyk1n4tf74sZ7CcXgcaCcGjsUtA==}
dependencies:
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
dev: false
- /prosemirror-view@1.31.5:
- resolution: {integrity: sha512-tobRCDeCp61elR1d97XE/JTL9FDIfswZpWeNs7GKJjAJvWyMGHWYFCq29850p6bbG2bckP+i9n1vT56RifosbA==}
+ /prosemirror-view@1.32.7:
+ resolution: {integrity: sha512-pvxiOoD4shW41X5bYDjRQk3DSG4fMqxh36yPMt7VYgU3dWRmqFzWJM/R6zeo1KtC8nyk717ZbQND3CC9VNeptw==}
dependencies:
- prosemirror-model: 1.19.2
+ prosemirror-model: 1.19.4
prosemirror-state: 1.4.3
prosemirror-transform: 1.7.3
dev: false
@@ -12285,13 +12280,6 @@ packages:
resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
engines: {node: '>=6'}
- /qs@6.11.2:
- resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==}
- engines: {node: '>=0.6'}
- dependencies:
- side-channel: 1.0.4
- dev: false
-
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -13656,6 +13644,11 @@ packages:
typescript: 5.1.6
dev: true
+ /ts-custom-error@3.3.1:
+ resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==}
+ engines: {node: '>=14.0.0'}
+ dev: false
+
/tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: true
@@ -14248,7 +14241,7 @@ packages:
webpack-sources: 3.2.3
webpack-virtual-modules: 0.6.1
- /unstorage@1.9.0(idb-keyval@6.2.1):
+ /unstorage@1.9.0(@upstash/redis@1.27.1)(@vercel/kv@1.0.1)(idb-keyval@6.2.1):
resolution: {integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==}
peerDependencies:
'@azure/app-configuration': ^1.4.1
@@ -14286,6 +14279,8 @@ packages:
idb-keyval:
optional: true
dependencies:
+ '@upstash/redis': 1.27.1
+ '@vercel/kv': 1.0.1
anymatch: 3.1.3
chokidar: 3.5.3
destr: 2.0.2
@@ -15327,6 +15322,19 @@ packages:
utf-8-validate:
optional: true
+ /ws@8.15.1:
+ resolution: {integrity: sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dev: false
+
/xml-name-validator@4.0.0:
resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
engines: {node: '>=12'}
@@ -15426,18 +15434,18 @@ packages:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
dev: true
- github.com/tauri-apps/tauri-plugin-log/91dd3fe9dcaa69bae62706e75702a0ce18ce9885:
- resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-log/tar.gz/91dd3fe9dcaa69bae62706e75702a0ce18ce9885}
+ github.com/tauri-apps/tauri-plugin-log/19f5dcc0425e9127d2c591780e5047b83e77a7c2:
+ resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-log/tar.gz/19f5dcc0425e9127d2c591780e5047b83e77a7c2}
name: tauri-plugin-log-api
version: 0.0.0
dependencies:
- '@tauri-apps/api': 1.5.1
+ '@tauri-apps/api': 1.5.3
dev: false
- github.com/tauri-apps/tauri-plugin-store/3367248b2661abcb73d2a89f30df780c387fb57d:
- resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/3367248b2661abcb73d2a89f30df780c387fb57d}
+ github.com/tauri-apps/tauri-plugin-store/7d2632996f290b0f18cc5f8a2b2791046400690e:
+ resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/7d2632996f290b0f18cc5f8a2b2791046400690e}
name: tauri-plugin-store-api
version: 0.0.0
dependencies:
- '@tauri-apps/api': 1.5.1
+ '@tauri-apps/api': 1.5.3
dev: false
diff --git a/scripts/generate-pwa-icons.ts b/scripts/generate-pwa-icons.ts
index 669112a448..1072354680 100644
--- a/scripts/generate-pwa-icons.ts
+++ b/scripts/generate-pwa-icons.ts
@@ -21,7 +21,7 @@ type IconType = 'transparent' | 'maskable' | 'apple'
*/
interface Icons extends Record {
/**
- * @default: { compressionLevel: 9, quality: 60 }`
+ * @default: `{ compressionLevel: 9, quality: 60 }`
*/
png?: PngOptions
/**
diff --git a/server/utils/shared.ts b/server/utils/shared.ts
index d49c9c6695..83294a36b1 100644
--- a/server/utils/shared.ts
+++ b/server/utils/shared.ts
@@ -1,6 +1,7 @@
import fs from 'unstorage/drivers/fs'
import memory from 'unstorage/drivers/memory'
import kv from 'unstorage/drivers/cloudflare-kv-http'
+import vercelKVDriver from 'unstorage/drivers/vercel-kv'
import { $fetch } from 'ofetch'
@@ -29,6 +30,15 @@ else if (driver === 'cloudflare') {
apiToken: config.cloudflare.apiToken,
})))
}
+else if (driver === 'vercel') {
+ const config = useRuntimeConfig()
+ storage.mount('servers', cached(vercelKVDriver({
+ url: config.vercel.url,
+ token: config.vercel.token,
+ env: config.vercel.env,
+ base: config.vercel.base,
+ })))
+}
else if (driver === 'memory') {
storage.mount('servers', memory())
}
diff --git a/service-worker/types.ts b/service-worker/types.ts
index be53709c18..c51b7a63c4 100644
--- a/service-worker/types.ts
+++ b/service-worker/types.ts
@@ -218,7 +218,7 @@ export interface MastoAccount {
last_status_at: string
/** Indicates that the profile is currently inactive and that its user has moved to a new account. */
moved?: boolean | null
- /** An extra entity returned when an account is suspended. **/
+ /** An extra entity returned when an account is suspended. */
suspended?: boolean | null
/** Additional metadata attached to a profile as name-value pairs. */
fields?: Field[] | null
diff --git a/tests/nuxt/__snapshots__/content-rich.test.ts.snap b/tests/nuxt/__snapshots__/content-rich.test.ts.snap
index 1ef8daf275..3709a43272 100644
--- a/tests/nuxt/__snapshots__/content-rich.test.ts.snap
+++ b/tests/nuxt/__snapshots__/content-rich.test.ts.snap
@@ -44,8 +44,9 @@ exports[`content-rich > code frame 2 1`] = `
class="u-url mention"
rel="nofollow noopener noreferrer"
to="/webtoo.ls/@antfu"
- >
+ >@antfu
Testing
const a = hello
@@ -56,6 +57,62 @@ exports[`content-rich > code frame empty 1`] = `" code frame no lang 1`] = `"hello world
no lang"`;
+exports[`content-rich > collapse mentions 1`] = `
+"
+ @elk
+ @elk
+ content
+ @antfu
+ @daniel
+ @sxzz
+ @patak
+ content
+
+"
+`;
+
exports[`content-rich > custom emoji 1`] = `
"Daniel Roe