Merge branch 'main' into feat/totally-hide-strict-filters

This commit is contained in:
Ayo 2023-01-28 21:18:44 +01:00
commit 0b3d32e821
73 changed files with 4154 additions and 1712 deletions

View file

@ -1,5 +1,6 @@
NUXT_PUBLIC_TRANSLATE_API=
NUXT_PUBLIC_DEFAULT_SERVER=
NUXT_PUBLIC_PRIVACY_POLICY_URL=
# Production only
NUXT_CLOUDFLARE_ACCOUNT_ID=

View file

@ -93,17 +93,17 @@ We are using [vue-i18n](https://vue-i18n.intlify.dev/) via [nuxt-i18n](https://i
1. Add a new file in [locales](./locales) folder with the language code as the filename.
2. Copy [en-US](./locales/en-US.json) and translate the strings.
3. Add the language to the `locales` array in [config/i18n.ts](./config/i18n.ts#L12), below `en` and `ar`:
3. Add the language to the `locales` array in [config/i18n.ts](./config/i18n.ts#L61), below `en` and `ar`:
- If your language have multiple country variants, add the generic one for language only (only if there are a lot of common entries, you can always add it as a new one)
- Add all country variants in [country variants object](./config/i18n.ts#L97)
- Add all country variants in [country variants object](./config/i18n.ts#L12)
- Add all country variants files with empty `messages` object: `{}`
- Translate the strings in the generic language file
- Later, when anyone wants to add the corresponding translations for the country variant, you can override all entries in the corresponding file: check `en` (english variants), and override the entries in all country files, if you omit them, `i18n` module will use the language entry. You will need also copy from base file to the rest of country variants those messages not being shared (the Elk team is working on resolving this, assuming it can be resolved).
- Later, when anyone wants to add the corresponding translations for the country variant, just override any entry in the corresponding file: you can see an example with `en` variants.
- If the generic language already exists:
- If the translation doesn't differ from the generic language, then add the corresponding translations in the corresponding file
- If the translation differs from the generic language, then add the corresponding translations in the corresponding file and remove it from the country variants entry
4. If the language is `right-to-left`, add `dir` option with `rtl` value, for example, for [ar](./config/i18n.ts#L22)
5. If the language requires special pluralization rules, add `pluralRule` callback option, for example, for [ar](./config/i18n.ts#L23)
4. If the language is `right-to-left`, add `dir` option with `rtl` value, for example, for [ar](./config/i18n.ts#L71)
5. If the language requires special pluralization rules, add `pluralRule` callback option, for example, for [ar](./config/i18n.ts#L72)
Check [Pluralization rule callback](https://vue-i18n.intlify.dev/guide/essentials/pluralization.html#custom-pluralization) for more info.

View file

@ -117,6 +117,20 @@ const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
<span v-else i-ri-notification-4-line block text-current />
</button>
</CommonTooltip>
<CommonTooltip :content="$t('list.modify_account')">
<VDropdown v-if="!isSelf && relationship?.following">
<button
:aria-label="$t('list.modify_account')"
rounded-full text-sm p2 border-1 transition-colors
border-base hover:text-primary
>
<span i-ri:play-list-add-fill block text-current />
</button>
<template #popper>
<ListLists :user-id="account.id" />
</template>
</VDropdown>
</CommonTooltip>
<AccountFollowButton :account="account" :command="command" />
<!-- Edit profile -->
<NuxtLink

View file

@ -8,13 +8,15 @@ const props = defineProps<{
}>()
const account = props.account || (props.handle ? useAccountByHandle(props.handle!) : undefined)
const userSettings = useUserSettings()
defineOptions({
inheritAttrs: false,
})
</script>
<template>
<VMenu v-if="!disabled && account" placement="bottom-start" :delay="{ show: 500, hide: 100 }" v-bind="$attrs" :close-on-content-click="false">
<VMenu v-if="!disabled && account && !getPreferences(userSettings, 'hideAccountHoverCard')" placement="bottom-start" :delay="{ show: 500, hide: 100 }" v-bind="$attrs" :close-on-content-click="false">
<slot />
<template #popper>
<AccountHoverCard v-if="account" :account="account" />

View file

@ -1,11 +1,13 @@
<script setup lang="ts">
import type { CommonRouteTabOption } from '../common/CommonRouteTabs.vue'
const { t } = useI18n()
const route = useRoute()
const server = $(computedEager(() => route.params.server as string))
const account = $(computedEager(() => route.params.account as string))
const tabs = $computed(() => [
const tabs = $computed<CommonRouteTabOption[]>(() => [
{
name: 'account-index',
to: {
@ -33,7 +35,7 @@ const tabs = $computed(() => [
display: t('tab.media'),
icon: 'i-ri:camera-2-line',
},
] as const)
])
</script>
<template>

View file

@ -11,6 +11,7 @@ const {
virtualScroller = false,
eventType = 'update',
preprocess,
noEndMessage = false,
} = defineProps<{
paginator: Paginator<T[], O>
keyProp?: keyof T
@ -18,6 +19,7 @@ const {
stream?: Promise<WsEvents>
eventType?: 'notification' | 'update'
preprocess?: (items: (U | T)[]) => U[]
noEndMessage?: boolean
}>()
defineSlots<{
@ -84,7 +86,7 @@ const { items, prevItems, update, state, endAnchor, error } = usePaginator(pagin
<slot v-if="state === 'loading'" name="loading">
<TimelineSkeleton />
</slot>
<slot v-else-if="state === 'done'" name="done">
<slot v-else-if="state === 'done' && !noEndMessage" name="done">
<div p5 text-secondary italic text-center>
{{ t('common.end_of_list') }}
</div>

View file

@ -1,14 +1,15 @@
<script setup lang="ts">
import type { RouteLocationRaw } from 'vue-router'
export interface CommonRouteTabOption {
to: RouteLocationRaw
display: string
disabled?: boolean
name?: string
icon?: string
}
const { options, command, replace, preventScrollTop = false } = $defineProps<{
options: {
to: RouteLocationRaw
display: string
disabled?: boolean
name?: string
icon?: string
}[]
options: CommonRouteTabOption[]
command?: boolean
replace?: boolean
preventScrollTop?: boolean

View file

@ -0,0 +1,44 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
const { account, list } = defineProps<{
account: mastodon.v1.Account
hoverCard?: boolean
list: string
}>()
cacheAccount(account)
const client = useMastoClient()
const isRemoved = ref(false)
async function edit() {
try {
isRemoved.value
? await client.v1.lists.addAccount(list, { accountIds: [account.id] })
: await client.v1.lists.removeAccount(list, { accountIds: [account.id] })
isRemoved.value = !isRemoved.value
}
catch (err) {
console.error(err)
}
}
</script>
<template>
<div flex justify-between hover:bg-active transition-100 items-center>
<AccountInfo
:account="account" hover p1 as="router-link"
:hover-card="hoverCard"
shrink
overflow-hidden
:to="getAccountRoute(account)"
/>
<div>
<CommonTooltip :content="isRemoved ? $t('list.add_account') : $t('list.remove_account')" :hover="isRemoved ? 'text-green' : 'text-red'">
<button :class="isRemoved ? 'i-ri:user-add-line' : 'i-ri:user-unfollow-line'" text-xl @click="edit" />
</CommonTooltip>
</div>
</div>
</template>

49
components/list/Lists.vue Normal file
View file

@ -0,0 +1,49 @@
<script lang="ts" setup>
const { userId } = defineProps<{
userId: string
}>()
const { client } = $(useMasto())
const paginator = client.v1.lists.list()
const listsWithUser = ref((await client.v1.accounts.listLists(userId)).map(list => list.id))
function indexOfUserInList(listId: string) {
return listsWithUser.value.indexOf(listId)
}
async function edit(listId: string) {
try {
const index = indexOfUserInList(listId)
if (index === -1) {
await client.v1.lists.addAccount(listId, { accountIds: [userId] })
listsWithUser.value.push(listId)
}
else {
await client.v1.lists.removeAccount(listId, { accountIds: [userId] })
listsWithUser.value = listsWithUser.value.filter(id => id !== listId)
}
}
catch (err) {
console.error(err)
}
}
</script>
<template>
<CommonPaginator no-end-message :paginator="paginator">
<template #default="{ item }">
<div p4 hover:bg-active block w="100%" flex justify-between items-center gap-4>
<p>{{ item.title }}</p>
<CommonTooltip
:content="indexOfUserInList(item.id) === -1 ? $t('list.add_account') : $t('list.remove_account')"
:hover="indexOfUserInList(item.id) === -1 ? 'text-green' : 'text-red'"
>
<button
:class="indexOfUserInList(item.id) === -1 ? 'i-ri:user-add-line' : 'i-ri:user-unfollow-line'"
text-xl @click="() => edit(item.id)"
/>
</CommonTooltip>
</div>
</template>
</CommonPaginator>
</template>

View file

@ -42,6 +42,7 @@ const wideLayout = computed(() => route.meta.wideLayout ?? false)
<slot name="header" />
</div>
<div :class="{ 'xl:block': $route.name !== 'tag' }" hidden h-6 />
<PwaInstallPrompt lg:hidden />
<div :class="isHydrated && wideLayout ? 'xl:w-full sm:max-w-600px' : 'sm:max-w-600px md:shrink-0'" m-auto>
<slot />
</div>

View file

@ -73,6 +73,12 @@ function toggleDark() {
<NuxtLink cursor-pointer hover:underline to="/settings/about">
{{ $t('settings.about.label') }}
</NuxtLink>
<template v-if="$config.public.privacyPolicyUrl">
&middot;
<NuxtLink cursor-pointer hover:underline :to="$config.public.privacyPolicyUrl">
{{ $t('nav.privacy') }}
</NuxtLink>
</template>
&middot;
<NuxtLink href="/m.webtoo.ls/@elk" target="_blank">
Mastodon

View file

@ -32,6 +32,7 @@ const { notifications } = useNotifications()
<NavSideItem :text="$t('nav.explore')" :to="isHydrated ? `/${currentServer}/explore` : '/explore'" icon="i-ri:hashtag" :command="command" />
<NavSideItem :text="$t('nav.local')" :to="isHydrated ? `/${currentServer}/public/local` : '/public/local'" icon="i-ri:group-2-line " :command="command" />
<NavSideItem :text="$t('nav.federated')" :to="isHydrated ? `/${currentServer}/public` : '/public'" icon="i-ri:earth-line" :command="command" />
<NavSideItem :text="$t('nav.lists')" :to="`/${currentServer}/lists`" icon="i-ri:list-check" :command="command" />
<div shrink hidden sm:block mt-4 />
<NavSideItem :text="$t('nav.settings')" to="/settings" icon="i-ri:settings-3-line" :command="command" />

View file

@ -27,6 +27,10 @@ const groupId = (item: mastodon.v1.Notification): string => {
return JSON.stringify(id)
}
function hasHeader(account: mastodon.v1.Account) {
return !account.header.endsWith('/original/missing.png')
}
function groupItems(items: mastodon.v1.Notification[]): NotificationSlot[] {
const results: NotificationSlot[] = []
@ -44,31 +48,31 @@ function groupItems(items: mastodon.v1.Notification[]): NotificationSlot[] {
// This normally happens when you transfer an account, if not, show
// a big profile card for each follow
if (group[0].type === 'follow') {
let groups: mastodon.v1.Notification[] = []
// Order group by followers count
const processedGroup = [...group]
processedGroup.sort((a, b) => {
const aHasHeader = hasHeader(a.account)
const bHasHeader = hasHeader(b.account)
if (bHasHeader && !aHasHeader)
return 1
if (aHasHeader && !bHasHeader)
return -1
return b.account.followersCount - a.account.followersCount
})
function newGroup() {
if (groups.length > 0) {
results.push({
id: `grouped-${id++}`,
type: 'grouped-follow',
items: groups,
})
groups = []
}
if (processedGroup.length > 0 && hasHeader(processedGroup[0].account))
results.push(processedGroup.shift()!)
if (processedGroup.length === 1 && hasHeader(processedGroup[0].account))
results.push(processedGroup.shift()!)
if (processedGroup.length > 0) {
results.push({
id: `grouped-${id++}`,
type: 'grouped-follow',
items: processedGroup,
})
}
for (const item of group) {
const hasHeader = !item.account.header.endsWith('/original/missing.png')
if (hasHeader && (item.account.followersCount > 250 || (group.length === 1 && item.account.followersCount > 25))) {
newGroup()
results.push(item)
}
else {
groups.push(item)
}
}
newGroup()
return
}

View file

@ -0,0 +1,22 @@
<template>
<div
v-if="$pwa?.showInstallPrompt && !$pwa?.needRefresh"
m-2 p5 bg="primary-fade" relative
rounded-lg of-hidden
flex="~ col gap-3"
v-bind="$attrs"
>
<h2 flex="~ gap-2" items-center>
{{ $t('pwa.install_title') }}
</h2>
<div flex="~ gap-1">
<button type="button" btn-solid px-4 py-1 text-center text-sm @click="$pwa.install()">
{{ $t('pwa.install') }}
</button>
<button type="button" btn-text filter-saturate-0 px-4 py-1 text-center text-sm @click="$pwa.cancelInstall()">
{{ $t('pwa.dismiss') }}
</button>
</div>
<div i-material-symbols:install-desktop-rounded absolute text-6em bottom--2 inset-ie--2 text-primary dark:text-white op10 class="-z-1 rtl-flip" />
</div>
</template>

View file

@ -16,6 +16,6 @@
{{ $t('pwa.dismiss') }}
</button>
</div>
<div i-ri-arrow-down-circle-line absolute text-8em bottom--10 inset-ie--10 text-primary op10 class="-z-1" />
<div i-ri-arrow-down-circle-line absolute text-8em bottom--10 inset-ie--10 text-primary dark:text-white op10 class="-z-1" />
</div>
</template>

View file

@ -19,9 +19,9 @@ const totalTrend = $computed(() =>
<span>
{{ hashtag.name }}
</span>
<CommonTrending :history="hashtag.history" text-xs text-secondary truncate />
<CommonTrending v-if="hashtag.history" :history="hashtag.history" text-xs text-secondary truncate />
</div>
<div v-if="totalTrend" absolute left-15 right-0 top-0 bottom-4 op35 flex place-items-center place-content-center ml-auto>
<div v-if="totalTrend && hashtag.history" absolute left-15 right-0 top-0 bottom-4 op35 flex place-items-center place-content-center ml-auto>
<CommonTrendingCharts
:history="hashtag.history" :width="150" :height="20"
text-xs text-secondary h-full w-full

View file

@ -37,13 +37,13 @@ const reply = () => {
<div flex-1>
<StatusActionButton
:content="$t('action.reply')"
:text="status.repliesCount || ''"
:text="!getPreferences(userSettings, 'hideReplyCount') && status.repliesCount || ''"
color="text-blue" hover="text-blue" group-hover="bg-blue/10"
icon="i-ri:chat-1-line"
:command="command"
@click="reply"
>
<template v-if="status.repliesCount" #text>
<template v-if="status.repliesCount && !getPreferences(userSettings, 'hideReplyCount')" #text>
<CommonLocalizedNumber
keypath="action.reply_count"
:count="status.repliesCount"

View file

@ -114,9 +114,9 @@ const meta = $computed(() => {
<span text-secondary leading-tight>{{ meta.details }}</span>
</NuxtLink>
</div>
<div>
<div shrink-0 w-18 sm:w-30>
<NuxtLink :href="meta.titleUrl" target="_blank" external>
<img w-30 aspect-square width="20" height="20" rounded-2 :src="meta.avatar">
<img w-full aspect-square width="112" height="112" rounded-2 :src="meta.avatar">
</NuxtLink>
</div>
</div>

View file

@ -19,7 +19,7 @@ const toggleFollowTag = async () => {
tag.following = !tag.following
try {
if (tag.following)
if (previousFollowingState)
await client.v1.tags.unfollow(tag.name)
else
await client.v1.tags.follow(tag.name)

View file

@ -42,9 +42,9 @@ function go(evt: MouseEvent | KeyboardEvent) {
<span>#</span>
<span hover:underline>{{ tag.name }}</span>
</h4>
<CommonTrending :history="tag.history" text-sm text-secondary line-clamp-1 ws-pre-wrap break-all />
<CommonTrending v-if="tag.history" :history="tag.history" text-sm text-secondary line-clamp-1 ws-pre-wrap break-all />
</div>
<div flex items-center>
<div v-if="tag.history" flex items-center>
<CommonTrendingCharts :history="tag.history" />
</div>
</div>

View file

@ -42,6 +42,7 @@ const clickUser = (user: UserLogin) => {
is="button"
:text="$t('user.add_existing')"
icon="i-ri:user-add-line"
w-full
@click="openSigninDialog"
/>
<CommonDropdownItem
@ -49,6 +50,7 @@ const clickUser = (user: UserLogin) => {
v-if="isHydrated && currentUser"
:text="$t('user.sign_out_account', [getFullHandle(currentUser.account)])"
icon="i-ri:logout-box-line rtl-flip"
w-full
@click="signout"
/>
</div>

View file

@ -33,7 +33,7 @@ export function getDefaultDraft(options: Partial<Mutable<mastodon.v1.CreateStatu
visibility: visibility || 'public',
sensitive: sensitive ?? false,
spoilerText: spoilerText || '',
language: language || 'en',
language: language || getDefaultLanguage(),
},
mentions,
lastUpdated: Date.now(),
@ -52,6 +52,16 @@ export async function getDraftFromStatus(status: mastodon.v1.Status): Promise<Dr
})
}
function getDefaultLanguage() {
const userSettings = useUserSettings()
const defaultLanguage = userSettings.value.language
if (defaultLanguage)
return defaultLanguage.split('-')[0]
return 'en'
}
function getAccountsToMention(status: mastodon.v1.Status) {
const userId = currentUser.value?.account.id
const accountsToMention = new Set<string>()

View file

@ -9,9 +9,11 @@ export type ColorMode = 'light' | 'dark' | 'system'
export interface PreferencesSettings {
hideBoostCount: boolean
hideReplyCount: boolean
hideFavoriteCount: boolean
hideFollowerCount: boolean
hideTranslation: boolean
hideAccountHoverCard: boolean
grayscaleMode: boolean
enableAutoplay: boolean
experimentalVirtualScroller: boolean
@ -61,9 +63,11 @@ export function getDefaultUserSettings(locales: string[]): UserSettings {
export const DEFAULT__PREFERENCES_SETTINGS: PreferencesSettings = {
hideBoostCount: false,
hideReplyCount: false,
hideFavoriteCount: false,
hideFollowerCount: false,
hideTranslation: false,
hideAccountHoverCard: false,
grayscaleMode: false,
enableAutoplay: true,
experimentalVirtualScroller: true,

View file

@ -17,10 +17,30 @@ export function setupPageHeader() {
dir: () => localeMap[locale.value] ?? 'auto',
},
titleTemplate: (title) => {
let titleTemplate = title ? `${title} | ` : ''
titleTemplate += t('app_name')
let titleTemplate = title ?? ''
if (titleTemplate.match(/&[a-z0-9#]+;/gi)) {
titleTemplate = unescapeTitleTemplate(titleTemplate, [
['"', ['&#34;', '&quot;']],
['&', ['&#38;', '&amp;']],
['\'', ['&#39;', '&apos;']],
['\u003C', ['&#60;', '&lt;']],
['\u003E', ['&#62;', '&gt;']],
])
if (titleTemplate.length > 60)
titleTemplate = `${titleTemplate.slice(0, 60)}...${titleTemplate.endsWith('"') ? '"' : ''}`
if (!titleTemplate.includes('"'))
titleTemplate = `"${titleTemplate}"`
}
else if (titleTemplate.length > 60) {
titleTemplate = `${titleTemplate.slice(0, 60)}...${titleTemplate.endsWith('"') ? '"' : ''}`
}
titleTemplate += ` | ${t('app_name')}`
if (buildInfo.env !== 'release')
titleTemplate += ` (${buildInfo.env})`
return titleTemplate
},
link: process.client && useRuntimeConfig().public.pwaEnabled
@ -32,3 +52,12 @@ export function setupPageHeader() {
: [],
})
}
function unescapeTitleTemplate(titleTemplate: string, replacements: [string, string[]][]) {
let result = titleTemplate
for (const [replacement, entities] of replacements) {
for (const e of entities)
result = result.replaceAll(e, replacement)
}
return result.trim()
}

View file

@ -9,6 +9,55 @@ interface LocaleObjectData extends LocaleObject {
pluralRule?: PluralizationRule
}
const countryLocaleVariants: Record<string, LocaleObjectData[]> = {
ar: [
// { code: 'ar-DZ', name: 'Arabic (Algeria)' },
// { code: 'ar-BH', name: 'Arabic (Bahrain)' },
{ code: 'ar-EG', name: 'العربية' },
// { code: 'ar-EG', name: 'Arabic (Egypt)' },
// { code: 'ar-IQ', name: 'Arabic (Iraq)' },
// { code: 'ar-JO', name: 'Arabic (Jordan)' },
// { code: 'ar-KW', name: 'Arabic (Kuwait)' },
// { code: 'ar-LB', name: 'Arabic (Lebanon)' },
// { code: 'ar-LY', name: 'Arabic (Libya)' },
// { code: 'ar-MA', name: 'Arabic (Morocco)' },
// { code: 'ar-OM', name: 'Arabic (Oman)' },
// { code: 'ar-QA', name: 'Arabic (Qatar)' },
// { code: 'ar-SA', name: 'Arabic (Saudi Arabia)' },
// { code: 'ar-SY', name: 'Arabic (Syria)' },
// { code: 'ar-TN', name: 'Arabic (Tunisia)' },
// { code: 'ar-AE', name: 'Arabic (U.A.E.)' },
// { code: 'ar-YE', name: 'Arabic (Yemen)' },
],
en: [
{ code: 'en-US', name: 'English (US)' },
{ code: 'en-GB', name: 'English (UK)' },
],
es: [
// { code: 'es-AR', name: 'Español (Argentina)' },
// { code: 'es-BO', name: 'Español (Bolivia)' },
// { code: 'es-CL', name: 'Español (Chile)' },
// { code: 'es-CO', name: 'Español (Colombia)' },
// { code: 'es-CR', name: 'Español (Costa Rica)' },
// { code: 'es-DO', name: 'Español (República Dominicana)' },
// { code: 'es-EC', name: 'Español (Ecuador)' },
{ code: 'es-ES', name: 'Español (España)' },
// TODO: Support es-419, if we include spanish country variants remove also fix on utils/language.ts module
{ code: 'es-419', name: 'Español (Latinoamérica)' },
// { code: 'es-GT', name: 'Español (Guatemala)' },
// { code: 'es-HN', name: 'Español (Honduras)' },
// { code: 'es-MX', name: 'Español (México)' },
// { code: 'es-NI', name: 'Español (Nicaragua)' },
// { code: 'es-PA', name: 'Español (Panamá)' },
// { code: 'es-PE', name: 'Español (Perú)' },
// { code: 'es-PR', name: 'Español (Puerto Rico)' },
// { code: 'es-SV', name: 'Español (El Salvador)' },
// { code: 'es-US', name: 'Español (Estados Unidos)' },
// { code: 'es-UY', name: 'Español (Uruguay)' },
// { code: 'es-VE', name: 'Español (Venezuela)' },
],
}
const locales: LocaleObjectData[] = [
{
code: 'en',
@ -60,6 +109,15 @@ const locales: LocaleObjectData[] = [
file: 'fr-FR.json',
name: 'Français',
},
{
code: 'ru-RU',
file: 'ru-RU.json',
name: 'Русский',
pluralRule: (choice: number) => {
const name = new Intl.PluralRules('ru-RU').select(choice)
return { zero: 2 /* not used */, one: 0, two: 1 /* not used */, few: 1, many: 2, other: 3 }[name]
},
},
{
code: 'uk-UA',
file: 'uk-UA.json',
@ -107,58 +165,15 @@ const locales: LocaleObjectData[] = [
{
code: 'fi-FI',
file: 'fi-FI.json',
name: 'Suomea',
name: 'suomeksi',
},
{
code: 'gl-ES',
file: 'gl-ES.json',
name: 'Galego',
},
]
const countryLocaleVariants: Record<string, LocaleObjectData[]> = {
ar: [
// { code: 'ar-DZ', name: 'Arabic (Algeria)' },
// { code: 'ar-BH', name: 'Arabic (Bahrain)' },
{ code: 'ar-EG', name: 'العربية' },
// { code: 'ar-EG', name: 'Arabic (Egypt)' },
// { code: 'ar-IQ', name: 'Arabic (Iraq)' },
// { code: 'ar-JO', name: 'Arabic (Jordan)' },
// { code: 'ar-KW', name: 'Arabic (Kuwait)' },
// { code: 'ar-LB', name: 'Arabic (Lebanon)' },
// { code: 'ar-LY', name: 'Arabic (Libya)' },
// { code: 'ar-MA', name: 'Arabic (Morocco)' },
// { code: 'ar-OM', name: 'Arabic (Oman)' },
// { code: 'ar-QA', name: 'Arabic (Qatar)' },
// { code: 'ar-SA', name: 'Arabic (Saudi Arabia)' },
// { code: 'ar-SY', name: 'Arabic (Syria)' },
// { code: 'ar-TN', name: 'Arabic (Tunisia)' },
// { code: 'ar-AE', name: 'Arabic (U.A.E.)' },
// { code: 'ar-YE', name: 'Arabic (Yemen)' },
],
en: [
{ code: 'en-US', name: 'English (US)' },
{ code: 'en-GB', name: 'English (UK)' },
],
es: [
// { code: 'es-AR', name: 'Español (Argentina)' },
// { code: 'es-BO', name: 'Español (Bolivia)' },
// { code: 'es-CL', name: 'Español (Chile)' },
// { code: 'es-CO', name: 'Español (Colombia)' },
// { code: 'es-CR', name: 'Español (Costa Rica)' },
// { code: 'es-DO', name: 'Español (República Dominicana)' },
// { code: 'es-EC', name: 'Español (Ecuador)' },
{ code: 'es-ES', name: 'Español (España)' },
{ code: 'es-419', name: 'Español (Latinoamérica)' },
// { code: 'es-GT', name: 'Español (Guatemala)' },
// { code: 'es-HN', name: 'Español (Honduras)' },
// { code: 'es-MX', name: 'Español (México)' },
// { code: 'es-NI', name: 'Español (Nicaragua)' },
// { code: 'es-PA', name: 'Español (Panamá)' },
// { code: 'es-PE', name: 'Español (Perú)' },
// { code: 'es-PR', name: 'Español (Puerto Rico)' },
// { code: 'es-SV', name: 'Español (El Salvador)' },
// { code: 'es-US', name: 'Español (Estados Unidos)' },
// { code: 'es-UY', name: 'Español (Uruguay)' },
// { code: 'es-VE', name: 'Español (Venezuela)' },
],
}
const buildLocales = () => {
const useLocales = Object.values(locales).reduce((acc, data) => {
const locales = countryLocaleVariants[data.code]

View file

@ -18,7 +18,6 @@ export const STORAGE_KEY_HIDE_EXPLORE_NEWS_TIPS = 'elk-hide-explore-news-tips'
export const STORAGE_KEY_HIDE_EXPLORE_TAGS_TIPS = 'elk-hide-explore-tags-tips'
export const STORAGE_KEY_NOTIFICATION = 'elk-notification'
export const STORAGE_KEY_NOTIFICATION_POLICY = 'elk-notification-policy'
export const COOKIE_MAX_AGE = 10 * 365 * 24 * 60 * 60 * 1000
export const STORAGE_KEY_PWA_HIDE_INSTALL = 'elk-pwa-hide-install'
export const HANDLED_MASTO_URLS = /^(https?:\/\/)?([\w\d-]+\.)+\w+\/(@[@\w\d-\.]+)(\/objects)?(\/\d+)?$/

View file

@ -45,6 +45,7 @@ There are 5 environment variables to add.
| NUXT_CLOUDFLARE_NAMESPACE_ID | This is your CloudFlare KV Namespace ID. You can find it in "Workers > KV". |
| NUXT_STORAGE_DRIVER | Because we're using CloudFlare, we'll need to set this to `cloudflare`. |
| NUXT_PUBLIC_DEFAULT_SERVER | This is the address of the Mastodon instance that will show up when a user visits your Elk deployment and is not logged in. If you don't make that variable, it will point to `m.webtoo.ls` by default. |
| NUXT_PUBLIC_PRIVACY_POLICY_URL | This is the URL to a web page with information on your privacy policy. |
That's it! All that's left to do is...

38
docs/content/privacy.md Normal file
View file

@ -0,0 +1,38 @@
# Privacy
> Last updated January 27, 2023
This privacy notice for Elk describes how we handle your information when you:
- Visit https://elk.zone, https://main.elk.zone or https://docs.elk.zone.
- Download and use our mobile or desktop application (Elk)
::alert{type=warning}
Elk is [open source](https://github.com/elk-zone/elk) and other websites that link to this privacy notice may not be affiliated with Elk or bound by this policy.
::
## Information
We do not collect or process your personal or sensitive information.
The only information retained by Elk when you use it is the host name of your Mastodon instance, which we need in order to log you in to that instance.
We use two third-party providers to provide server and content delivery network (CDN) capacity. They each have their own privacy policies which you can read: [Cloudflare](https://www.cloudflare.com/privacypolicy/) and [Netlify](https://www.netlify.com/privacy/).
We use aggregated information from these third-party providers to let us know about traffic and visits to Elk.
## Tracking
We do not use tracking technologies (for example, cookies). We store information about your user interface preferences in your local browser storage.
## Updates
We will update this notice as necessary to stay compliant with relevant laws.
When we update this privacy notice, the updated version will be indicated by a new 'Revised' date. The updated version will be effective as soon as it is accessible. If we make material changes to this privacy notice, we may notify you either by prominently posting a notice of such changes or by directly sending you a notification. We encourage you to review this privacy notice frequently to be informed of how we are protecting your information.
## Contact
If you have questions or comments about this notice, you may raise an issue at https://github.com/elk-zone/elk.

View file

@ -9,7 +9,7 @@
"preview": "nuxi preview"
},
"devDependencies": {
"@nuxt-themes/docus": "^1.4.4",
"nuxt": "^3.0.0"
"@nuxt-themes/docus": "^1.4.7",
"nuxt": "^3.1.0"
}
}

View file

@ -65,6 +65,7 @@ const isGrayscale = usePreferences('grayscaleMode')
<div flex-auto />
<PwaPrompt />
<PwaInstallPrompt />
<LazyCommonPreviewPrompt v-if="info.env === 'preview'" />
<NavFooter />
</slot>

View file

@ -1,18 +1 @@
{
"account": {
"favourites": "Favorites"
},
"action": {
"favourite": "Favorite",
"favourited": "Favorited"
},
"nav": {
"favourites": "Favorites"
},
"notification": {
"favourited_post": "favorited your post"
},
"user": {
"sign_in_desc": "Sign in to follow profiles or hashtags, favorite, share and reply to posts, or interact from your account on a different server."
}
}
{}

View file

@ -174,6 +174,11 @@
"language": {
"search": "Search"
},
"list": {
"add_account": "Add account to list",
"modify_account": "Modify lists with account",
"remove_account": "Remove account from list"
},
"menu": {
"block_account": "Block {0}",
"block_domain": "Block domain {0}",
@ -216,9 +221,12 @@
"favourites": "Favorites",
"federated": "Federated",
"home": "Home",
"list": "List",
"lists": "Lists",
"local": "Local",
"muted_users": "Muted users",
"notifications": "Notifications",
"privacy": "Privacy",
"profile": "Profile",
"search": "Search",
"select_feature_flags": "Toggle Feature Flags",
@ -248,6 +256,8 @@
},
"pwa": {
"dismiss": "Dismiss",
"install": "Install",
"install_title": "Install Elk",
"title": "New Elk update available!",
"update": "Update",
"update_available_short": "Update Elk",
@ -362,9 +372,11 @@
"enable_autoplay": "Enable Autoplay",
"github_cards": "GitHub Cards",
"grayscale_mode": "Grayscale mode",
"hide_account_hover_card": "Hide account hover card",
"hide_boost_count": "Hide boost count",
"hide_favorite_count": "Hide favorite count",
"hide_follower_count": "Hide follower count",
"hide_reply_count": "Hide reply count",
"hide_translation": "Hide translation",
"label": "Preferences",
"title": "Experimental Features",
@ -440,8 +452,10 @@
"edited": "edited {0}"
},
"tab": {
"accounts": "Accounts",
"for_you": "For you",
"hashtags": "Hashtags",
"list": "List",
"media": "Media",
"news": "News",
"notifications_all": "All",

View file

@ -28,6 +28,8 @@
"muted_users": "Usuarios silenciados",
"muting": "Silenciado",
"mutuals": "Mutuo",
"notifications_on_post_disable": "Parar notificaciones cuando {username} publique",
"notifications_on_post_enable": "Notificarme cuando {username} publique",
"pinned": "Publicaciones fijadas",
"posts": "Publicaciones",
"posts_count": "{0} Publicaciones|{0} Publicación|{0} Publicaciones",
@ -35,7 +37,9 @@
"profile_unavailable": "Perfil no disponible",
"unblock": "Desbloquear",
"unfollow": "Dejar de seguir",
"unmute": "Dejar de silenciar"
"unmute": "Dejar de silenciar",
"view_other_followers": "Puede que no se muestren los seguidores de otras instancias.",
"view_other_following": "Puede que no se muestren los seguidos de otras instancias."
},
"action": {
"apply": "Aplicar",
@ -44,6 +48,7 @@
"boost": "Retootear",
"boost_count": "{0}",
"boosted": "Retooteado",
"clear_publish_failed": "Limpiar errores de publicación",
"clear_upload_failed": "Limpiar errores de subida de archivos",
"close": "Cerrar",
"compose": "Redactar",
@ -97,20 +102,51 @@
"drafts": "Borradores ({v})"
},
"confirm": {
"block_account": {
"cancel": "Cancelar",
"confirm": "Bloquear",
"title": "¿Estás seguro que quieres bloquear a {0}"
},
"block_domain": {
"cancel": "Cancelar",
"confirm": "Bloquear",
"title": "¿Estás seguro que quieres bloquear a {0}"
},
"common": {
"cancel": "No",
"confirm": "Si",
"title": "¿Estás seguro?"
"confirm": "Si"
},
"delete_posts": {
"cancel": "Cancelar",
"confirm": "Eliminar",
"title": "¿Estás seguro que deseas eliminar esta publicación?"
"title": "¿Estás seguro que quieres eliminar esta publicación?"
},
"mute_account": {
"cancel": "Cancelar",
"confirm": "Silenciar",
"title": "¿Estás seguro que quieres silenciar a {0}"
},
"show_reblogs": {
"cancel": "Cancelar",
"confirm": "Mostrar",
"title": "¿Estás seguro que quieres mostrar los retoots de {0}"
},
"unfollow": {
"cancel": "Cancelar",
"confirm": "Dejar de seguir",
"title": "¿Estás seguro que quieres dejar de seguir?"
}
},
"conversation": {
"with": "con"
},
"custom_cards": {
"stackblitz": {
"lines": "Lineas {0}",
"open": "Abrir",
"snippet_from": "Porción de código de {0}"
}
},
"error": {
"account_not_found": "No se encontró la cuenta {0}",
"explore-list-empty": "No hay tendencias en este momento. ¡Vuelve más tarde!",
@ -120,6 +156,12 @@
"unsupported_file_format": "Tipo de archivo no soportado"
},
"help": {
"build_preview": {
"desc1": "Estás viendo actualmente una versión preliminar de Elk de la comunidad - {0}.",
"desc2": "Puede contener cambios no revisados o incluso maliciosos.",
"desc3": "No inicies sesión con tu cuenta real.",
"title": "Implementación de vista previa"
},
"desc_highlight": "Es normal encontrar algunos errores y características faltantes aquí y allá.",
"desc_para1": "¡Gracias por el interés en probar Elk, nuestro cliente genérico en desarrollo para Mastodon!",
"desc_para2": "Estamos trabajando duro en el desarrollo y mejorándolo constantemente. ¡Y pronto te invitaremos a que te unas una vez que lo hagamos de código abierto!",
@ -132,10 +174,16 @@
"language": {
"search": "Buscar"
},
"list": {
"add_account": "Agregar cuenta a la lista",
"modify_account": "Modificar listas con cuenta",
"remove_account": "Eliminar cuenta de la lista"
},
"menu": {
"block_account": "Bloquear a {0}",
"block_domain": "Bloquear dominio {0}",
"copy_link_to_post": "Copiar enlace",
"copy_original_link_to_post": "Copiar enlace original a esta publicación",
"delete": "Borrar",
"delete_and_redraft": "Borrar y volver a borrador",
"direct_message_account": "Mensaje directo a {0}",
@ -167,14 +215,18 @@
"blocked_users": "Usuarios bloqueados",
"bookmarks": "Marcadores",
"built_at": "Compilado {0}",
"compose": "Redactar",
"conversations": "Conversaciones",
"explore": "Explorar",
"favourites": "Favoritas",
"federated": "Federados",
"home": "Inicio",
"list": "Lista",
"lists": "Listas",
"local": "Local",
"muted_users": "Usuarios silenciados",
"notifications": "Notificaciones",
"privacy": "Privacidad",
"profile": "Perfil",
"search": "Buscar",
"select_feature_flags": "Cambiar marcadores de funcionalidades",
@ -204,6 +256,8 @@
},
"pwa": {
"dismiss": "Descartar",
"install": "Instalar",
"install_title": "Instalar Elk",
"title": "Nueva versión de Elk disponible",
"update": "Actualizar",
"update_available_short": "Actualiza Elk",
@ -243,7 +297,8 @@
"sponsors": "Patrocinadores",
"sponsors_body_1": "Elk es posible gracias al generoso patrocinio y apoyo de:",
"sponsors_body_2": "Y todas las empresas y personas que patrocinan al equipo de Elk y sus miembros.",
"sponsors_body_3": "Si estás disfrutando de la aplicación, considera patrocinarnos:"
"sponsors_body_3": "Si estás disfrutando de la aplicación, considera patrocinarnos:",
"version": "Versión"
},
"account_settings": {
"description": "Edita los ajustes de tu cuenta en la interfaz de Mastodon",
@ -255,7 +310,9 @@
"default": " (por defecto)",
"font_size": "Tamaño de Letra",
"label": "Interfaz",
"light_mode": "Modo claro"
"light_mode": "Modo claro",
"system_mode": "Sistema",
"theme_color": "Color de tema"
},
"language": {
"display_language": "Idioma de pantalla",
@ -312,10 +369,15 @@
},
"notifications_settings": "Notificaciones",
"preferences": {
"enable_autoplay": "Habilitar auto-reproducción",
"github_cards": "Tarjetas GitHub",
"grayscale_mode": "Modo escala de grises",
"hide_account_hover_card": "Ocultar tarjeta flotante de cuenta",
"hide_boost_count": "Ocultar contador de retoots",
"hide_favorite_count": "Ocultar contador de favoritas",
"hide_follower_count": "Ocultar contador de seguidores",
"hide_reply_count": "Ocultar contador de respuestas",
"hide_translation": "Ocultar traducción",
"label": "Preferencias",
"title": "Funcionalidades experimentales",
"user_picker": "Selector de usuarios",
@ -332,8 +394,8 @@
"title": "Editar perfil"
},
"featured_tags": {
"description": "Las personas pueden navegar por tus publicaciones públicas con estos hashtags.",
"label": "Hashtags destacados"
"description": "Las personas pueden navegar por tus publicaciones públicas con estas etiquetas.",
"label": "Etiquetas destacados"
},
"label": "Perfil"
},
@ -355,6 +417,7 @@
"edited": "(Editado)",
"editing": "Editando",
"loading": "Cargando...",
"publish_failed": "Fallo en la publicación",
"publishing": "Publicando",
"upload_failed": "Subida fallida",
"uploading": "Subiendo..."
@ -389,8 +452,10 @@
"edited": "editado el {0}"
},
"tab": {
"accounts": "Cuentas",
"for_you": "Para ti",
"hashtags": "Hashtags",
"hashtags": "Etiquetas",
"list": "Lista",
"media": "Multimedia",
"news": "Noticias",
"notifications_all": "Todas",
@ -454,12 +519,13 @@
"explore_links_intro": "Estas noticias están siendo comentadas ahora mismo por los usuarios de este y otros servidores de la red descentralizada.",
"explore_posts_intro": "Estos mensajes de este y otros servidores de la red descentralizada están siendo tendencia ahora mismo en este servidor.",
"explore_tags_intro": "Estas etiquetas están siendo tendencia ahora mismo entre los usuarios de este y otros servidores de la red descentralizada.",
"publish_failed": "Cierra los mensajes fallidos en la parte superior del editor para volver a publicar",
"toggle_code_block": "Cambiar a bloque de código"
},
"user": {
"add_existing": "Agregar una cuenta existente",
"server_address_label": "Dirección de Servidor de Mastodon",
"sign_in_desc": "Inicia sesión para seguir perfiles o hashtags, marcar cómo favorita, compartir y responder a publicaciones, o interactuar con un servidor diferente con tu usuario.",
"sign_in_desc": "Inicia sesión para seguir perfiles o etiquetas, marcar cómo favorita, compartir y responder a publicaciones, o interactuar con un servidor diferente con tu usuario.",
"sign_in_notice_title": "Viendo información pública de {0}",
"sign_out_account": "Cerrar sesión {0}",
"tip_no_account": "Si aún no tienes una cuenta Mastodon, {0}.",

View file

@ -1,57 +1,57 @@
{
"a11y": {
"loading_page": "Ladataan sivu, odottakaa",
"loading_titled_page": "Ladataan sivu {0}, odottakaa",
"locale_changed": "Kieli vaihtoi kieleksi {0}",
"locale_changing": "Kielen vaihto, odottakaa",
"loading_page": "Lataan, odota hetki",
"loading_titled_page": "Lataan sivua {0}, odota hetki",
"locale_changed": "Vaihdettu kieleksi {0}",
"locale_changing": "Vaihdan kieltä, odota hetki",
"route_loaded": "Sivu {0} ladattu"
},
"account": {
"avatar_description": "{0}:n avatar",
"blocked_by": "Olet estetty tämän käyttäjän toimesta.",
"blocked_domains": "Estetyt domeenit",
"blocked_by": "Käyttäjä on estänyt sinut.",
"blocked_domains": "Estetyt domainit",
"blocked_users": "Estetyt käyttäjät",
"blocking": "Estetty",
"bot": "BOT",
"favourites": "Favorites",
"favourites": "Suosikit",
"follow": "Seuraa",
"follow_back": "Seuraa takaisin",
"follow_requested": "Pyydetty",
"followers": "Seuraajat",
"followers_count": "{0} Seuraajaa|{0} Seuraaja|{0} Seuraajaa",
"followers_count": "{0} seuraajaa|{0} seuraaja|{0} seuraajaa",
"following": "Seuraamassa",
"following_count": "{0} Seuraamassa",
"following_count": "{0} seuraa",
"follows_you": "Seuraa sinua",
"go_to_profile": "Mene profiiliin",
"joined": "Liittyi",
"moved_title": "on kertonut, että uusi tilinsä on nyt:",
"moved_title": "on siirtynyt käyttämään tiliä:",
"muted_users": "Hiljennetyt käyttäjät",
"muting": "Hiljennetty",
"mutuals": "Molemminsuuntaiset",
"notifications_on_post_disable": "Älä enää ilmoita, kun {username} julkaisee",
"notifications_on_post_enable": "Ilmoita, kun {username} julkaisee",
"pinned": "Kiinnitetty",
"posts": "Julkaisut",
"posts_count": "{0} Julkaisua|{0} Julkaisu|{0} Julkaisua",
"posts": "Viestit",
"posts_count": "{0} viestiä|{0} viestiä|{0} viestiä",
"profile_description": "{0}:n profiilin otsikko",
"profile_unavailable": "Profiilia ei ole",
"profile_unavailable": "Profiilia ei löydy",
"unblock": "Poista esto",
"unfollow": "Lopeta seuraamista",
"unfollow": "Lopeta seuraaminen",
"unmute": "Poista hiljennys",
"view_other_followers": "Muiden ilmentymien seuraajat eivät välttämättä näy.",
"view_other_following": "Muiden ilmentymien seurattavat eivät välttämättä näy."
"view_other_followers": "Seuraajat muilta palvelimilta eivät välttämättä näy.",
"view_other_following": "Seuratut muilla palvelimilla eivät välttämättä näy."
},
"action": {
"apply": "Sovella",
"apply": "Aseta",
"bookmark": "Kirjanmerkki",
"bookmarked": "Kirjanmerkitty",
"boost": "Jaa",
"boost": "Jaa edelleen",
"boost_count": "{0}",
"boosted": "Jaettu",
"clear_publish_failed": "Siivoa julkaisuvirheet",
"clear_upload_failed": "Siivoa tiedoston latausvirheet",
"clear_publish_failed": "Tyhjennä julkaisuvirheet",
"clear_upload_failed": "Tyhjennä lähetysvirheet",
"close": "Sulje",
"compose": "Muodosta",
"compose": "Kirjoita",
"confirm": "Vahvista",
"edit": "Muokkaa",
"enter_app": "Avaa App",
@ -64,15 +64,15 @@
"publish": "Julkaise",
"reply": "Vastaa",
"reply_count": "{0}",
"reset": "Resetoi",
"reset": "Palauta",
"save": "Tallenna",
"save_changes": "Tallenna muutokset",
"sign_in": "Kirjoittaudu sisään",
"switch_account": "Vaihda tili",
"switch_account": "Vaihda tiliä",
"vote": "Äänestä"
},
"app_desc_short": "Ketterä Mastodonin web-klientti",
"app_logo": "Elk Logo",
"app_desc_short": "Ketterä web-sovellus Mastodonille",
"app_logo": "Elk logo",
"app_name": "Elk",
"attachment": {
"edit_title": "Kuvaus",
@ -81,21 +81,21 @@
"command": {
"activate": "Aktivoi",
"complete": "Täydellinen",
"compose_desc": "Kirjoita uusi julkaisu",
"compose_desc": "Kirjoita uusi viesti",
"n-people-in-the-past-n-days": "{0} ihmistä viime {1} päivän aikana",
"select_lang": "Valitse kieli",
"sign_in_desc": "Lisää olemassa oleva tili",
"switch_account": "Vaihda tiliin {0}",
"sign_in_desc": "Kirjaudu tilille",
"switch_account": "Katso tiliä {0}",
"switch_account_desc": "Vaihda toiseen tiliin",
"toggle_dark_mode": "Vaihda väriskeema",
"toggle_zen_mode": "Vaihda zen-tila"
"toggle_dark_mode": "Vaihda tumma/vaalea",
"toggle_zen_mode": "Vaihda zen-tilaan"
},
"common": {
"end_of_list": "Listan loppu",
"end_of_list": "Listan lopussa",
"error": "VIRHE",
"in": "in",
"not_found": "404 Ei löydy",
"offline_desc": "Näyttää siltä, että olet offline-tilassa. Tarkista verkkoyhteytesi."
"not_found": "404 ei löydy",
"offline_desc": "Yhteyttä verkkoon ei ole."
},
"compose": {
"draft_title": "Luonnos {0}",
@ -103,42 +103,42 @@
},
"confirm": {
"block_account": {
"cancel": "Peruuta",
"cancel": "Peru",
"confirm": "Estä",
"title": "Oletko varma, että haluat estää {0}"
"title": "Oletko varma, että haluat estää {0}?"
},
"block_domain": {
"cancel": "Peruuta",
"cancel": "Peru",
"confirm": "Estä",
"title": "Oletko varma, että haluat estää {0}"
"title": "Oletko varma, että haluat estää {0}?"
},
"common": {
"cancel": "Peruuta",
"cancel": "Peru",
"confirm": "OK"
},
"delete_posts": {
"cancel": "Peruuta",
"cancel": "Peru",
"confirm": "Poista",
"title": "Oletko varma, että haluat poistaa tämä julkaisu?"
"title": "Oletko varma, että haluat poistaa tämän viestin?"
},
"mute_account": {
"cancel": "Peruuta",
"cancel": "Peru",
"confirm": "Hiljennä",
"title": "Oletko varma, että hasluat hiljentää {0}"
"title": "Oletko varma, että haluat hiljentää {0}?"
},
"show_reblogs": {
"cancel": "Peruuta",
"cancel": "Peru",
"confirm": "Näytä",
"title": "Oletko varma, että haluat jakaa {0}:n julkaisuja"
"title": "Oletko varma, että haluat nähdä {0}:n edelleenjaot?"
},
"unfollow": {
"cancel": "Peruuta",
"confirm": "Lopeta seuraamista",
"title": "Oletko varma, että haluat lopettaa seuraamista?"
"cancel": "Peru",
"confirm": "Älä seuraa",
"title": "Oletko varma, että haluat lopettaa seuraamisen?"
}
},
"conversation": {
"with": "with"
"with": "ja"
},
"custom_cards": {
"stackblitz": {
@ -148,150 +148,152 @@
}
},
"error": {
"account_not_found": "Tili {0} ei löydy",
"explore-list-empty": "Mitään ei trendaa juuri nyt. Katso uudelleen myöhemmin!",
"account_not_found": "Tiliä {0} ei löydy",
"explore-list-empty": "Nyt ei löydy mitään nousevaa sisältöä. Tarkista uudelleen myöhemmin!",
"file_size_cannot_exceed_n_mb": "Tiedosto ei saa olla suurempi kuin {0}MB",
"sign_in_error": "Yhteyden muodostus palvelimeen ei onnistu.",
"status_not_found": "Julkaisu ei löydy",
"unsupported_file_format": "Ei-tuettu tiedostoformaatti"
"status_not_found": "Viestiä ei löydy",
"unsupported_file_format": "Tiedostomuoto ei ole tuettu"
},
"help": {
"desc_highlight": "Odota paikoitellen joitakin bugeja ja puuttuvia ominaisuuksia.",
"desc_para1": "Kiitos, että haluat kokeilla Elkiä, vielä keskeneräinen Mastodonin web-klientti!",
"desc_para2": "teemme kovasti työtä sen jatkuvaksi kehittämiseksi ja parantamiseksi.",
"desc_para3": "Kehitystyön auttamiseksi voit tukea Tiimiä GitHub Sponsorsin kautta. Toivomme, että nautit Elkin käytöstä!",
"desc_para4": "Elk on avoimen lähdekoodin ohjelmisto. Jos haluat auttaa sen testauksella, palautteen antamisella tai antamalla koodia,",
"desc_para5": "ota meihin yhteyttä GitHubilla",
"desc_para6": "ja aktivoidu.",
"title": "Elk on esikokeiluvaiheessä!"
"desc_highlight": "Saatat löytää bugeja ja puuttuvia ominaisuuksia.",
"desc_para1": "Kiitos, että kokeilet Elkiä, työn alla olevaa web-sovellustamme Mastodonille!",
"desc_para2": "teemme kovasti työtä sen sitä kehittäessämme ja parantaessamme.",
"desc_para3": "Voit auttaa kehitystyötä tukemalla tiimiä GitHub Sponsorina. Toivomme, että nautit Elkin käytöstä!",
"desc_para4": "Elk on avointa lähdekoodia. Jos haluat auttaa testaamalla, palautteella tai koodia lahjoittaen,",
"desc_para5": "ota meihin yhteyttä GitHubissa",
"desc_para6": "ja liity joukkoon.",
"title": "Elk on ennakkokäytössä ennen julkaisua!"
},
"language": {
"search": "Haku"
"search": "Hae"
},
"menu": {
"block_account": "Estä {0}",
"block_domain": "Estä domeeni {0}",
"copy_link_to_post": "Kopioi linkki tähän julkaisuun",
"block_domain": "Estä domain {0}",
"copy_link_to_post": "Kopioi linkki tähän viestiin",
"delete": "Poista",
"delete_and_redraft": "Poista & kirjoita uudelleen",
"direct_message_account": "Suora viesti {0}",
"direct_message_account": "Lähetä viesti {0}:lle",
"edit": "Muokkaa",
"hide_reblogs": "Piilota jaot {0}:lta",
"mention_account": "Mainitse {0}",
"mention_account": "Mainitse {0} viestissä",
"mute_account": "Hiljennä {0}",
"mute_conversation": "Hiljennä tämä julkaisu",
"open_in_original_site": "Avaa alkuperäispalvelimella",
"pin_on_profile": "Kiinnitä profiiliin",
"share_post": "Jaa tämä julkaisu",
"mute_conversation": "Hiljennä tämä keskustelu",
"open_in_original_site": "Avaa alkulähteellä",
"pin_on_profile": "Kiinnitä profiiliisi",
"share_post": "Jaa edelleen",
"show_favourited_and_boosted_by": "Näytä, kuka tykkäsi ja jakoi",
"show_reblogs": "Näytä {0}:n jaot",
"show_untranslated": "Näytä ilman käännöstä",
"show_reblogs": "Näytä {0}:n edelleenjaot",
"show_untranslated": "Piilota käännös",
"toggle_theme": {
"dark": "Vaihda tummaan väriskeemaan",
"light": "Vaihda vaaleaan väriskeemaan"
},
"translate_post": "Käännä julkaisu",
"translate_post": "Käännä viesti",
"unblock_account": "Poista tilin {0} esto",
"unblock_domain": "Poista domeenin {0} esto",
"unmute_account": "Poista tilin {0} hiljennys",
"unmute_conversation": "Poista tämän julkaisun hiljennys",
"unpin_on_profile": "Irroita profiilista"
"unblock_domain": "Poista esto domainilta {0}",
"unmute_account": "Älä hiljennä {0}",
"unmute_conversation": "Älä hiljennä tätä keskustelua",
"unpin_on_profile": "Irrota profiilistasi"
},
"nav": {
"back": "Go back",
"blocked_domains": "Estetyt domeenit",
"blocked_domains": "Estetyt domainit",
"blocked_users": "Estetyt käyttäjät",
"bookmarks": "Kirjanmerkit",
"built_at": "Viime build: {0}",
"bookmarks": "Kirjanmerkkisi",
"built_at": "Versio tehty {0}",
"compose": "Muodosta",
"conversations": "Keskustelut",
"explore": "Tutki",
"favourites": "Tykkäykset",
"explore": "Löydä uutta",
"favourites": "Tykkäyksesi",
"federated": "Federoitu",
"home": "Koti",
"local": "Paikallinen",
"list": "Lista",
"lists": "Listat",
"local": "Paikalliset",
"muted_users": "Hiljennetyt käyttäjät",
"notifications": "Ilmoitukset",
"profile": "Profiili",
"search": "Haku",
"select_feature_flags": "Aktivoi Ominaisuusliput",
"select_font_size": "Fonttikoko",
"select_language": "Näytön kieli",
"select_font_size": "Kirjasinkoko",
"select_language": "Sovelluksen kieli",
"settings": "Asetukset",
"show_intro": "Näytä intro",
"toggle_theme": "Vaihda väriskeema",
"zen_mode": "Zen-moodi"
"toggle_theme": "Vaihda tumma/vaalea",
"zen_mode": "Zen-tila"
},
"notification": {
"favourited_post": "tykkäsi julkaisustasi",
"favourited_post": "tykkäsi viestistäsi",
"followed_you": "seurasi sinua",
"followed_you_count": "{0} ihmistä seurasi sinua|{0} henkilö seurasi sinua|{0} ihmistä seurasi sinua",
"missing_type": "MISSING notification.type:",
"reblogged_post": "jakoi julkaisusi",
"reblogged_post": "jakoi viestisi",
"request_to_follow": "pyysi saada seurata sinua",
"signed_up": "on kirjautunut",
"update_status": "päivitti julkaisunsa"
"signed_up": "liittyi",
"update_status": "päivitti viestiään"
},
"placeholder": {
"content_warning": "Kirjoita varoituksesi tähän",
"content_warning": "Kirjoita aiheesi",
"default_1": "Mitä tuumaat?",
"reply_to_account": "Vastaus {0}:lle",
"replying": "Vastaaminen",
"the_thread": "ketju"
"replying": "Vastauksesi",
"the_thread": "säie"
},
"pwa": {
"dismiss": "Dismiss",
"title": "New Elk update available!",
"update": "Update",
"update_available_short": "Update Elk",
"dismiss": "Hylkää",
"title": "Uusi versio käytettävissä!",
"update": "Päivitä",
"update_available_short": "Päivitä Elk",
"webmanifest": {
"canary": {
"description": "Ketterä Mastodonin web-klientti (canary)",
"description": "Ketterä web-sovellus Mastodonille (testiversio)",
"name": "Elk (canary)",
"short_name": "Elk (canary)"
},
"dev": {
"description": "Ketterä Mastodonin web-klientti (dev)",
"description": "Ketterä web-sovellus Mastodonille (kehitysversio)",
"name": "Elk (dev)",
"short_name": "Elk (dev)"
},
"preview": {
"description": "Ketterä Mastodonin web-klientti (preview)",
"description": "Ketterä web-sovellus Mastodonille (esijulkaisu)",
"name": "Elk (preview)",
"short_name": "Elk (preview)"
},
"release": {
"description": "Ketterä Mastodonin web-klientti",
"description": "Ketterä web-sovellus Mastodonille",
"name": "Elk",
"short_name": "Elk"
}
}
},
"search": {
"search_desc": "Etsi ihmisiä & hashtags",
"search_empty": "Nämä hakutermit eivät tuota tulosta"
"search_desc": "Etsi ihmisiä & aihetunnisteita",
"search_empty": "Tällä haulla ei löytynyt mitään"
},
"settings": {
"about": {
"label": "Elk:stä",
"label": "Tietoja",
"meet_the_team": "Tapaa tiimi",
"sponsor_action": "Tue meitä rahallisesti",
"sponsor_action": "Tue kehitystä",
"sponsor_action_desc": "Elkin kehitystiimin tukemiseksi",
"sponsors": "Tukijat",
"sponsors_body_1": "Elk on mahdollista kiitos seuraavien avokätistä tukea ja apua:",
"sponsors_body_2": "Ja kaikki yritykset ja yksilöt, jotka tukevat Elk-tiimiä ja sen jäseniä.",
"sponsors_body_3": "Jos pidät appista, harkitse tukemista:"
"sponsors_body_1": "Kehityksen mahdollistaa avokätinen tuki ja apu seuraavilta:",
"sponsors_body_2": "Sekä kaikki yritykset ja yksilöt, jotka tukevat Elk-tiimiä ja sen jäseniä.",
"sponsors_body_3": "Jos pidät sovelluksesta, harkitse tukemista:"
},
"account_settings": {
"description": "Muokkaa tiliasetuksesi Mastodonin käyttöliittymässä",
"description": "Muokkaa tiliasetuksiasi koti-Mastodonissasi",
"label": "Tiliasetukset"
},
"interface": {
"color_mode": "Väriskeema",
"color_mode": "Pohjaväri",
"dark_mode": "Tumma",
"default": " (oletus)",
"font_size": "Fonttikoko",
"label": "Liitäntä",
"font_size": "Kirjasinkoko",
"label": "Käyttöliittymä",
"light_mode": "Vaalea",
"size_label": {
"lg": "Suuri",
@ -300,11 +302,11 @@
"xl": "Ekstra-suuri",
"xs": "Ekstra-pieni"
},
"system_mode": "System",
"theme_color": "Theme Color"
"system_mode": "Laitteen asetus",
"theme_color": "Korostusväri"
},
"language": {
"display_language": "Näytön kieli",
"display_language": "Sovelluksen kieli",
"label": "Kieli"
},
"notifications": {
@ -318,10 +320,10 @@
"follow": "Uudet seuraajat",
"mention": "Maininnat",
"poll": "Äänestykset",
"reblog": "Jaa julkaisusi",
"reblog": "Edelleenjaot",
"title": "Mitkä ilmoitukset vastaanotettava?"
},
"description": "Ota vastaan ilmoitukset, myös kun et ole käyttämässä Elkiä.",
"description": "Vastaanota ilmoituksia taustalla.",
"instructions": "Muista tallentaa muutokset @:settings.notifications.push_notifications.save_settings -painikkeella!",
"label": "Push-ilmoitusten asetukset",
"policy": {
@ -331,38 +333,42 @@
"none": "Ei keneltäkään",
"title": "Keneltä voin saada ilmoituksia?"
},
"save_settings": "Tallenna asetukset",
"save_settings": "Vahvista asetukset",
"subscription_error": {
"clear_error": "Siivoa virhe",
"permission_denied": "Lupa evätty: aktivoi ilmoitukset selaimessasi.",
"request_error": "Virhe tapahtui, kun haettiin tilaus, yritä uudestaan ja jos virhe toistuu, ole hyvä ja raportoi asiasta Elkin koodivarannolle.",
"title": "Ei voitu tilata push-ilmoituksia",
"too_many_registrations": "Selaimen rajoitusten seurauksena Elk ei pysty käyttämään push-ilmoituspalvelua useilla tileilla eri palvelimilla. Deaktivoi toisen tilin push-ilmoitukset ja yritä uudelleen."
"request_error": "Ilmoitusten tilaamisessa tapahtui virhe. Yritä uudestaan ja jos virhe toistuu, ole hyvä ja raportoi asiasta Elkin kehitystiimille.",
"title": "Push-ilmoitusten tilaaminen ei onnistunut",
"too_many_registrations": "Selaimen rajoituksista johtuen Elk ei pysty tilaamaan push-ilmoituksia monilta tileiltä eri palvelimilla. Poista ilmoitukset käytöstä toisella tililläsi ja yritä uudelleen."
},
"title": "Push-ilmoitusten asetukset",
"undo_settings": "Peruuta muutokset",
"undo_settings": "Peru muutokset",
"unsubscribe": "Poista push-imoitukset käytöstä",
"unsupported": "Selaimesi ei tue push-ilmoituksia.",
"warning": {
"enable_close": "Sulje",
"enable_description": "Saadaksesi ilmoituksia, kun Elk ei ole auki, aktivoi push-ilmoituksia. Voit hallita tarkasti, millaiset vuorovaikutukset tuottavat push-ilmoituksia käyttämällä \"@:settings.notifications.show_btn{'\"'} -painiketta ylhäällä, kun se on aktivoitu.",
"enable_description_desktop": "Saadaksesi ilmoituksia, kun Elk ei ole auki, aktivoi push-ilmoitukset. Voit hallita tarkasti, millaiset vuorovaikutukset tuottavat push-ilmoituksia käyttämällä \"Asetukset > Ilmoitukset > Push-ilmoitusten asetukset\", kun se on aktivoitu.",
"enable_description_mobile": "Voit myös päästä asetuksiin käyttämällä navigointivalikkoa \"Asetukset > Ilmoitukset > Push-ilmoitusten asetukset\".",
"enable_description_settings": "Ilmoitusten vastaanottamiseksi kun Elk ei ole auki, aktivoi push-ilmoitukset. Voit hallita tarkasti, millaiset vuorovaikutukset tuottavat push-ilmoituksia tähän samaan näyttöön, kunhan aktivoit ne.",
"enable_desktop": "Kytke push-ilmoitukset päälle",
"enable_title": "Älä anna ilmoitukset livahtaa ohitse",
"re_auth": "Ilmeisesti palvelimesi ei tue push-ilmoituksia. Yritä kirjautua ulos ja kirjautua uudelleen sisään, jos sämä viesti tulee uudelleen, ota yhteys palvelimen admin:iin."
"enable_description": "Saadaksesi ilmoituksia, kun Elk ei ole auki, tilaa push-ilmoituksia. Tilattuasi ilmoitukset voit valita tarkemmin, millaiset vuorovaikutukset tuottavat ilmoituksia \"@:settings.notifications.show_btn{'\"'} -painikeella.",
"enable_description_desktop": "Saadaksesi ilmoituksia, kun Elk ei ole auki, tilaa push-ilmoituksia. Tilattuasi ilmoitukset voit valita tarkemmin, millaiset vuorovaikutukset tuottavat ilmoituksia käyttämällä \"Asetukset > Ilmoitukset > Push-ilmoitusten asetukset\".",
"enable_description_mobile": "Voit säätää asetuksia myös valikosta \"Asetukset > Ilmoitukset > Push-ilmoitusten asetukset\".",
"enable_description_settings": "Saadaksesi ilmoituksia, kun Elk ei ole auki, tilaa push-ilmoituksia. Tilattuasi ilmoitukset voit valita tarkemmin, millaiset vuorovaikutukset tuottavat ilmoituksia.",
"enable_desktop": "Tilaa push-ilmoituksia",
"enable_title": "Älä anna tapahtumien livahtaa ohitse",
"re_auth": "Palvelimesi ei ilmeisesti tue push-ilmoituksia. Voit yrittää uudelleen kirjautumalla ulos ja takaisin sisään. Jos tämä virhe toistuu, ota yhteyttä palvelimesi ylläpitoon."
}
},
"show_btn": "Ilmoitusasetuksiin"
},
"notifications_settings": "Ilmoitukset",
"preferences": {
"github_cards": "GitHub Cards",
"grayscale_mode": "Grayscale mode",
"enable_autoplay": "Toista automaattisesti",
"github_cards": "GitHub -kortit",
"grayscale_mode": "Näytä harmaasävyissä",
"hide_account_hover_card": "Piilota tilin nostokortti",
"hide_boost_count": "Piilota jakojen lukumäärä",
"hide_favorite_count": "Piilota tykkäysten lukumäärä",
"hide_follower_count": "Piilota seuraajien lukumäärä",
"hide_reply_count": "Piilota vastausten lukumäärä",
"hide_translation": "Älä käytä käännöksiä",
"label": "Valinnat",
"title": "Kokeellisia ominaisuuksia",
"user_picker": "Käyttäjävalitsin",
@ -371,49 +377,49 @@
"profile": {
"appearance": {
"bio": "Bio",
"description": "Muokkaa avatar, käyttäjänimi, profiili, jne.",
"display_name": "Kuvaruutunimi",
"description": "Muokkaa kuvaasi, nimeäsi ja muita tietojasi",
"display_name": "Näkyvä nimesi",
"label": "Visuaalinen ilme",
"profile_metadata": "Profiilin metatiedot",
"profile_metadata_desc": "Saa olla korkeintaan {0} kohdetta taulukkona profiilissa",
"title": "Muokkaa profiili"
"profile_metadata": "Profiilisi metatiedot",
"profile_metadata_desc": "Voit liittää profiiliisi korkeintaan {0} lisätietoa tai linkkiä",
"title": "Muokkaa tietojasi"
},
"featured_tags": {
"description": "Ihmiset voivat katsella julkiset kirjoituksesi näillä hashtageillä.",
"label": "Esillä olevat hashtagit"
"label": "Esillä olevat aiheet"
},
"label": "Profiili"
},
"select_a_settings": "Valitse asetus",
"users": {
"export": "Käyttäjätokenien vienti",
"import": "Käyttäjätokenien tuonti",
"label": "Kirjoittautujia käyttäjiä"
"export": "Kirjaantumistietojen vienti",
"import": "Kirjaantumistietojen tuonti",
"label": "Kirjaantuneet tilit"
}
},
"share-target": {
"description": "Elk voidaan konfiguroida niin, että voit jakaa sisältöä muilta sovelluksilta, yksinkertaisesti installoi Elk laitteeseesi tai tietokoneesi ja ilmoittaudu.",
"hint": "Jos kaluat jakaa sisältöä Elkin kanssa, Elk on oltava installoituna ja sinun on oltava kirjoittautuna sisään.",
"title": "Share with Elk"
"description": "Voit jakaa sisältöä muilta sovelluksilta asentamalla Elkin laitteeseesi tai tietokoneellesi ja kirjaantumalla sisään.",
"hint": "Jos haluat jakaa sisältöä Elkillä, sovelluksen on oltava asennettu ja sisään kirjautunut.",
"title": "Jaa Elkillä"
},
"state": {
"attachments_exceed_server_limit": "Liitteiden lukumäärä per julkaisu enemmän kuin sallittu.",
"attachments_limit_error": "Enemmän kuin sallittu per julkaisu",
"attachments_exceed_server_limit": "Viestissä on liian monta liitettä.",
"attachments_limit_error": "Viestissä on liian monta liitettä",
"edited": "(Muokattu)",
"editing": "Muokkaa",
"loading": "Lataa...",
"publish_failed": "Julkaiseminen epäonnistui",
"publish_failed": "Julkaisu epäonnistui",
"publishing": "Julkaisee",
"upload_failed": "Lataaminen epäonnistui",
"uploading": "Lataa..."
"upload_failed": "Lähetys epäonnistui",
"uploading": "Lähetetään..."
},
"status": {
"boosted_by": "Jakaminen teki",
"edited": "Viimein muokattu {0}",
"favourited_by": "Tykkääminen teki",
"filter_hidden_phrase": "Piilotus suotimella teki",
"filter_removed_phrase": "Poisto suotimella teki",
"filter_show_anyway": "Näytä kuitenkin",
"boosted_by": "Jakanut",
"edited": "Muokattu {0}",
"favourited_by": "Tykännyt",
"filter_hidden_phrase": "Suodatettu",
"filter_removed_phrase": "Suodattimen poistama",
"filter_show_anyway": "Näytä suodatetut",
"img_alt": {
"desc": "Kuvaus",
"dismiss": "Sulje"
@ -425,12 +431,12 @@
},
"reblogged": "{0} jakoi",
"replying_to": "Vastaa {0}:lle",
"show_full_thread": "Näytä koko ketju",
"show_full_thread": "Näytä koko säie",
"someone": "joku",
"spoiler_show_less": "Näytä vähemmän",
"spoiler_show_more": "Näytä enemmän",
"thread": "Ketju",
"try_original_site": "Kokeile alkuperäisserveri"
"thread": "Säie",
"try_original_site": "Katso alkulähteellä"
},
"status_history": {
"created": "luotu {0}",
@ -438,90 +444,90 @@
},
"tab": {
"for_you": "Sinulle",
"hashtags": "Hashtagit",
"media": "Media",
"news": "Uutiset",
"hashtags": "Aiheet",
"media": "Kuvat",
"news": "Uutisia",
"notifications_all": "Kaikki",
"notifications_mention": "Maininnat",
"posts": "Julkaisut",
"posts_with_replies": "Julkaisut & Vastaukset"
"posts": "Viestit",
"posts_with_replies": "Viestit & vastaukset"
},
"tag": {
"follow": "Seuraa",
"follow_label": "Seuraa {0}-tägi",
"unfollow": "Lopeta seuraamista",
"unfollow_label": "Lopeta {0}-tägin seuraamista"
"follow_label": "Seuraa aihetta {0}",
"unfollow": "Lopeta seuraaminen",
"unfollow_label": "Lopeta aiheen {0} seuraaminen"
},
"time_ago_options": {
"day_future": "0 päivässä|huomenna|{n} päivässä",
"day_past": "0 päivää sitten|eilen|{n} päivää sitten",
"hour_future": "in 0 hours|in 1 hour|in {n} hours",
"hour_past": "0 hours ago|1 hour ago|{n} hours ago",
"day_future": "tänään|huomenna|{n} päivässä",
"day_past": "tänään|eilen|{n} päivää sitten",
"hour_future": "tällä tunnilla|tunnin kuluttua|{n} tunnin kuluttua",
"hour_past": "tällä tunnilla|tunti sitten|{n} tuntia sitten",
"just_now": "juuri nyt",
"minute_future": "0 minuutissa|1 minuutissa|in {n} minuutissa",
"minute_past": "0 minuuttia sitten|1 minuutti sitten|{n} minuuttia sitten",
"month_future": "0 kuukaudessa|ensi kuussa|{n} kuukaudessa",
"month_past": "0 kuukautta sitten|viime kuussa|{n} kuukautta sitten",
"minute_future": "tällä minuutilla|1 minuutissa|in {n} minuutissa",
"minute_past": "tällä minuutilla|1 minuutti sitten|{n} minuuttia sitten",
"month_future": "tässä kuussa|ensi kuussa|{n} kuukaudessa",
"month_past": "tässä kuussa|viime kuussa|{n} kuukautta sitten",
"second_future": "juuri nyt|{n} sekunnissa|{n} sekunnissa",
"second_past": "juuri nyt|{n} sekunti sitten|{n} sekuntia sitten",
"short_day_future": "{n}pv:ssä",
"short_day_past": "{n}pv",
"short_hour_future": "{n}t:ssä",
"short_hour_future": "{n}t:ssa",
"short_hour_past": "{n}t",
"short_minute_future": "{n}min:ssa",
"short_minute_past": "{n}min",
"short_month_future": "{n}kk:ssa",
"short_month_past": "{n}kk",
"short_second_future": "{n}sek:ssa",
"short_second_future": "{n}s:ssa",
"short_second_past": "{n}s",
"short_week_future": "{n}vk:ssa",
"short_week_past": "{n}vk",
"short_year_future": "{n} v:ssa",
"short_year_future": "{n}v:ssa",
"short_year_past": "{n}v",
"week_future": "0 viikossa|ensi viikkona|{n} viikossa",
"week_past": "0 viikkoa sitten|viime viikkona|{n} viikkoa sitten",
"year_future": "0 vuodessa|ensi vuonna|{n} vuodessa",
"year_past": "0 vuotta sitten|viime vuonna|{n} vuotta sitten"
"week_future": "tällä viikolla|ensi viikkona|{n} viikossa",
"week_past": "tällä viikolla|viime viikkona|{n} viikkoa sitten",
"year_future": "tänä vuonna|ensi vuonna|{n} vuodessa",
"year_past": "tänä vuonna|viime vuonna|{n} vuotta sitten"
},
"timeline": {
"show_new_items": "Näytä {v} uutta kohtaa|Näytä {v} uusi kohta|Näytä {v} uutta kohtaa",
"view_older_posts": "Muiden ilmentymien vanhemmat julkaisut eivät välttämättä näy."
"show_new_items": "Näytä {v} uutta viestiä|Näytä {v} uusi viesti|Näytä {v} uutta viestiä",
"view_older_posts": "Vanhemmat viestit muilta palvelimilta eivät välttämättä näy."
},
"title": {
"federated_timeline": "Federoitu aikajana",
"local_timeline": "Paikallinen akajana"
"local_timeline": "Paikallinen aikajana"
},
"tooltip": {
"add_content_warning": "Lisää sisältövaroitus",
"add_emojis": "Lisää emojit",
"add_content_warning": "Lisää aihevaroitus",
"add_emojis": "Lisää emojeita",
"add_media": "Lisää kuvia, video- tai äänitiedosto",
"add_publishable_content": "Lisää sisältöä julkaistavaksi",
"change_content_visibility": "Muuta sisällön näkyvyys",
"add_publishable_content": "Liitä sisältöä viestiin",
"change_content_visibility": "Muuta sisällön näkyvyyttä",
"change_language": "Vaihda kieli",
"emoji": "Emoji",
"explore_links_intro": "Näistä uutistarinoista puhutaan tässä ja muissa hajoitetun verkon palvelimissa juuri nyt.",
"explore_posts_intro": "Nämä julkaisut tässä ja muissa hajoitetun verkon palvelimissa saavat lisää huomiota tämän palvelimen ihmisten kesken juuri nyt.",
"explore_tags_intro": "Nämä hashtagit saavat enemmän huomiota tämän ja muiden hajautetun verkon palvelimien ihmisten kesken juuri nyt.",
"publish_failed": "Sulje epäonnistunut viestit editorin ylälaidalla ennen julkaisujen uudelleenjlkaisemista",
"toggle_code_block": "Vaihda koodilohko"
"explore_links_intro": "Näistä uutisista puhutaan tällä ja muilla hajautetun verkon palvelimilla juuri nyt.",
"explore_posts_intro": "Nämä viestit saavat huomiota tämän palvelimen keskusteluissa juuri nyt.",
"explore_tags_intro": "Nämä aiheet saavat huomiota tällä ja muilla hajautetun verkon palvelimilla juuri nyt.",
"publish_failed": "Sulje epäonnistuneet viestit editorin yltä voidaksesi uudelleenjulkaista",
"toggle_code_block": "Kirjoita koodilohkona"
},
"user": {
"add_existing": "Lisää olemassa oleva tili",
"server_address_label": "Mastodonin palvelinosoite",
"sign_in_desc": "Kirjaudu sisään seurataakseen profiilit tai hashtagit, tykätäkseen, jakaakseen ja vastatakseen julkaisuihin, tai olla vuorovaikutuksessa tililtäsi toisella palvelimella.",
"add_existing": "Kirjaudu lisätilille",
"server_address_label": "Mastodon-palvelimesi osoite",
"sign_in_desc": "Kirjaudu sisään voidaksesi seurata muita ihmisiä ja aiheita, sekä keskustellaksesi ja jakaaksesi viestejä.",
"sign_in_notice_title": "{0}:n julkisten tietojen katselu",
"sign_out_account": "Kirjaudu ulos {0}",
"tip_no_account": "Jos sinulla ei ole vielä Mastodon-tili, {0}.",
"tip_register_account": "valitse palvelimesi ja ilmoittaudu eli luo tili"
"sign_out_account": "Kirjaa {0} ulos",
"tip_no_account": "Jos sinulla ei ole vielä tiliä, {0}.",
"tip_register_account": "valitse palvelimesi ja luo tili"
},
"visibility": {
"direct": "Vain mainitut tilit",
"direct": "Suoraviesti",
"direct_desc": "Nähtävissä vain mainituille tilille",
"private": "Vain seuraajat",
"private": "Vain seuraajille",
"private_desc": "Nähtävissä vain seuraajille",
"public": "Julkinen",
"public_desc": "Nähtävissä kaikille",
"unlisted": "Ei-luetteloitu",
"unlisted_desc": "Kaikille nähtävissä, mutta ilman tunnustusominaisuuksia"
"unlisted": "Listaamaton",
"unlisted_desc": "Julkisesti nähtävissä, mutta ei julkaistu hakuihin"
}
}

View file

@ -253,6 +253,8 @@
},
"pwa": {
"dismiss": "Fermer",
"install": "Installer",
"install_title": "Installer Elk",
"title": "Nouvelle mise à jour Elk disponible !",
"update": "Mettre à jour",
"update_available_short": "Mettre à jour Elk",

531
locales/gl-ES.json Normal file
View file

@ -0,0 +1,531 @@
{
"a11y": {
"loading_page": "Cargando páxina, agarda",
"loading_titled_page": "Cargando páxina {0}, agarda",
"locale_changed": "Idioma mudado a {0}",
"locale_changing": "Cambiando o idioma, agarda",
"route_loaded": "Cargouse a páxina {0}"
},
"account": {
"avatar_description": "Avatar de {0}",
"blocked_by": "Esta usuaria bloqueoute.",
"blocked_domains": "Dominios bloqueados",
"blocked_users": "Usuarias bloqueadas",
"blocking": "Bloqueada",
"bot": "BOT",
"favourites": "Favoritas",
"follow": "Seguir",
"follow_back": "Seguir tamén",
"follow_requested": "Solicitado",
"followers": "Seguidoras",
"followers_count": "{0} Seguidoras|{0} Seguidora|{0} Seguidoras",
"following": "Seguimentos",
"following_count": "Seguindo a {0}",
"follows_you": "Séguete",
"go_to_profile": "Ir ao perfil",
"joined": "Uníuse",
"moved_title": "informou de que agora a súa conta é:",
"muted_users": "Usuarias acaladas",
"muting": "Acalada",
"mutuals": "Seguimento recíproco",
"notifications_on_post_disable": "Deixar de notificarme as publicacións de {username}",
"notifications_on_post_enable": "Recibir notificación cando {username} publique",
"pinned": "Fixada",
"posts": "Publicacións",
"posts_count": "{0} Publicacións|{0} Publicación|{0} Publicacións",
"profile_description": "Cabeceira do perfil de{0}",
"profile_unavailable": "Perfil non dispoñible",
"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."
},
"action": {
"apply": "Aplicar",
"bookmark": "Marcar",
"bookmarked": "Marcada",
"boost": "Promover",
"boost_count": "{0}",
"boosted": "Promovida",
"clear_publish_failed": "Limpar erros de publicación",
"clear_upload_failed": "Limpar o ficheiro de erros de subida",
"close": "Pechar",
"compose": "Escribir",
"confirm": "Confirmar",
"edit": "Editar",
"enter_app": "Entrar na App",
"favourite": "Favorita",
"favourite_count": "{0}",
"favourited": "Favorecida",
"more": "Máis",
"next": "Seg",
"prev": "Ant",
"publish": "Publicar",
"reply": "Responder",
"reply_count": "{0}",
"reset": "Restablecer",
"save": "Gardar",
"save_changes": "Gardar cambios",
"sign_in": "Acceder",
"switch_account": "Cambiar de conta",
"vote": "Votar"
},
"app_desc_short": "Un cliente web áxil para Mastodon",
"app_logo": "Logo de Elk",
"app_name": "Elk",
"attachment": {
"edit_title": "Descrición",
"remove_label": "Quitar o anexo"
},
"command": {
"activate": "Activar",
"complete": "Completar",
"compose_desc": "Escribir nova publicación",
"n-people-in-the-past-n-days": "{0} persoas nos últimos {1} días",
"select_lang": "Elixe idioma",
"sign_in_desc": "Engadir unha conta existente",
"switch_account": "Cambiar a {0}",
"switch_account_desc": "Utilizar outra conta",
"toggle_dark_mode": "Activar modo escuro",
"toggle_zen_mode": "Activar modo cen"
},
"common": {
"end_of_list": "Fin da lista",
"error": "ERRO",
"in": "en",
"not_found": "404 Non Atopado",
"offline_desc": "Semella que non tes conexión. Comproba a conexión á rede."
},
"compose": {
"draft_title": "Borrador {0}",
"drafts": "Borradores ({v})"
},
"confirm": {
"block_account": {
"cancel": "Cancelar",
"confirm": "Bloquear",
"title": "Tes certeza de querer bloquear a {0}"
},
"block_domain": {
"cancel": "Cancelar",
"confirm": "Bloquear",
"title": "Tes certeza de querer bloquear {0}"
},
"common": {
"cancel": "Non",
"confirm": "Si"
},
"delete_posts": {
"cancel": "Cancelar",
"confirm": "Eliminar",
"title": "Tes certeza de querer eliminar esta publicación?"
},
"mute_account": {
"cancel": "Cancelar",
"confirm": "Acalar",
"title": "Tes certeza de querer acalar a {0}"
},
"show_reblogs": {
"cancel": "Cancelar",
"confirm": "Mostrar",
"title": "Tes certeza de querer mostrar as promocións de {0}"
},
"unfollow": {
"cancel": "Cancelar",
"confirm": "Retirar",
"title": "Tes certeza de querer retirar o seguimento?"
}
},
"conversation": {
"with": "con"
},
"custom_cards": {
"stackblitz": {
"lines": "Liñas {0}",
"open": "Abrir",
"snippet_from": "Fragmento de {0}"
}
},
"error": {
"account_not_found": "Non se atopa a conta {0}",
"explore-list-empty": "Non hai tendencias agora. Mira máis tarde!",
"file_size_cannot_exceed_n_mb": "O ficheiro non pode superar os {0}MB",
"sign_in_error": "Non se conectou co servidor.",
"status_not_found": "Non se atopa a publicación",
"unsupported_file_format": "Non se admite este tipo de ficheiro"
},
"help": {
"build_preview": {
"desc1": "Estás vendo unha versión non oficial de Elk creada pola comunidade - {0}.",
"desc2": "Podería conter cambios non revisados e incluso malintencionados.",
"desc3": "Non accedas usando unha conta real.",
"title": "Instalar versión"
},
"desc_highlight": "É de agardar que haxa fallos e falten cousas por aquí e por alá.",
"desc_para1": "Grazas polo teu interese en probar Elk, o cliente web para Mastodon que estamos creando!",
"desc_para2": "traballamos arreo para desenvolvelo e melloralo.",
"desc_para3": "Podes acelerar o desenvolvemento patrocinando ao Equipo en GitHub Sponsors. Agardamos que desfrutes de Elk!",
"desc_para4": "Elk é Código Aberto. Se queres axudar probándoo, aportando a túa opinión, ou colaborando,",
"desc_para5": "contacta con nós en GitHub",
"desc_para6": "e involúcrate.",
"title": "Elk está de pre-estrea!"
},
"language": {
"search": "Buscar"
},
"menu": {
"block_account": "Bloquear {0}",
"block_domain": "Bloquear o dominio {0}",
"copy_link_to_post": "Copiar ligazón á publicación",
"copy_original_link_to_post": "Copiar ligazón orixinal á publicación",
"delete": "Eliminar",
"delete_and_redraft": "Eliminar e volver a escribir",
"direct_message_account": "Mensaxe directa {0}",
"edit": "Editar",
"hide_reblogs": "Agochar promocións de {0}",
"mention_account": "Mencionar a {0}",
"mute_account": "Acalar a {0}",
"mute_conversation": "Acalar esta publicación",
"open_in_original_site": "Abrir no sitio web orixinal",
"pin_on_profile": "Fixar no perfil",
"share_post": "Compartir esta publicación",
"show_favourited_and_boosted_by": "Mostrar quen favoreceu e promoveu",
"show_reblogs": "Mostrar promocións desde {0}",
"show_untranslated": "Mostrar sen traducir",
"toggle_theme": {
"dark": "Activar modo escuro",
"light": "Activar modo claro"
},
"translate_post": "Traducir publicación",
"unblock_account": "Desbloquear a {0}",
"unblock_domain": "Desbloquear o dominio {0}",
"unmute_account": "Reactivar {0}",
"unmute_conversation": "Reactivar esta publicación",
"unpin_on_profile": "Desafixar do perfil"
},
"nav": {
"back": "Atrás",
"blocked_domains": "Dominios bloqueados",
"blocked_users": "Usuarias bloqueadas",
"bookmarks": "Marcadores",
"built_at": "Versión {0}",
"compose": "Redactar",
"conversations": "Conversas",
"explore": "Explorar",
"favourites": "Favoritas",
"federated": "Federada",
"home": "Inicio",
"local": "Local",
"muted_users": "Usuarias acaladas",
"notifications": "Notificacións",
"profile": "Perfil",
"search": "Buscar",
"select_feature_flags": "Toggle Feature Flags",
"select_font_size": "Tamaño do texto",
"select_language": "Idioma da interface",
"settings": "Axustes",
"show_intro": "Mostrar intro",
"toggle_theme": "Mudar decorado",
"zen_mode": "Modo Cen"
},
"notification": {
"favourited_post": "favoreceu a túa publicación",
"followed_you": "seguiute",
"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",
"request_to_follow": "solicitou seguirte",
"signed_up": "creou a conta",
"update_status": "actualizou a publicación"
},
"placeholder": {
"content_warning": "Escribe aquí o aviso",
"default_1": "En que estás a pensar?",
"reply_to_account": "Responder a {0}",
"replying": "Respondendo",
"the_thread": "a conversa"
},
"pwa": {
"dismiss": "Desbotar",
"title": "Dispoñible nova versión de Elk!",
"update": "Actualizar",
"update_available_short": "Actualizar Elk",
"webmanifest": {
"canary": {
"description": "Un cliente áxil para Mastodon (canary)",
"name": "Elk (canary)",
"short_name": "Elk (canary)"
},
"dev": {
"description": "Un cliente áxil para Mastodon (dev)",
"name": "Elk (dev)",
"short_name": "Elk (dev)"
},
"preview": {
"description": "Un cliente áxil para Mastodon (preview)",
"name": "Elk (preview)",
"short_name": "Elk (preview)"
},
"release": {
"description": "Un cliente áxil para Mastodon",
"name": "Elk",
"short_name": "Elk"
}
}
},
"search": {
"search_desc": "Buscar persoas e cancelos",
"search_empty": "Non atopamos nada con eses termos de busca"
},
"settings": {
"about": {
"label": "Acerca de",
"meet_the_team": "Coñece ao equipo",
"sponsor_action": "Patrocínanos",
"sponsor_action_desc": "Para axudar ao equipo que desenvolve Elk",
"sponsors": "Patrocinios",
"sponsors_body_1": "Elk é posible grazas ao xeneroso patrocinio e axuda de:",
"sponsors_body_2": "Todas as empresas e persoas que patrocinan a Team Elk e colaboradoras.",
"sponsors_body_3": "Se estás desfrutando da app, considera patrocinarnos:",
"version": "Versión"
},
"account_settings": {
"description": "Edita a configuración da túa conta na interface de Mastodon",
"label": "Axustes da conta"
},
"interface": {
"color_mode": "Modo de cor",
"dark_mode": "Escuro",
"default": " (por defecto)",
"font_size": "Tamaño da letra",
"label": "Interface",
"light_mode": "Claro",
"system_mode": "Escuro",
"theme_color": "Cor do decorado"
},
"language": {
"display_language": "Idioma da interface",
"label": "Idioma"
},
"notifications": {
"label": "Notificacións",
"notifications": {
"label": "Axuste da notificacións"
},
"push_notifications": {
"alerts": {
"favourite": "Favoritas",
"follow": "Novas seguidoras",
"mention": "Mencións",
"poll": "Enquisas",
"reblog": "Promoción recibida",
"title": "Que notificacións queres recibir?"
},
"description": "Recibe notificacións incluso cando non usas Elk.",
"instructions": "Non esquezas gardar os cambios usando o botón @:settings.notifications.push_notifications.save_settings",
"label": "Axustes de notificacións Push",
"policy": {
"all": "De calquera",
"followed": "De persoas que sigo",
"follower": "De persoas que me siguen",
"none": "De ninguén",
"title": "De quen podo recibir notificacións?"
},
"save_settings": "Gardar axustes",
"subscription_error": {
"clear_error": "Limpar erro",
"permission_denied": "Permiso non concedido: activa as notificacións no navegador.",
"request_error": "Algo fallou ao solicitar a subscrición, inténtao outra vez e se o erro continúa, informa do problema no repositorio de Elk.",
"title": "Non se puido activar a subscrición a notificacións push",
"too_many_registrations": "Debido a limitacións do navegador, Elk non pode usar o servizo de notificacións push para múltiples contas en diferentes servidores. Podes subscribirte ás notificacións push con outra conta e intentalo outra vez."
},
"title": "Axustes das Notificacións Push",
"undo_settings": "Desfacer cambios",
"unsubscribe": "Desactivar notificacións Push",
"unsupported": "O teu navegador non ten soporte para notificacións Push.",
"warning": {
"enable_close": "Pechar",
"enable_description": "Para recibir notificacións cando Elk non está aberta, activa as notificacións Push. Podes controlar de xeito preciso o tipo de interaccións que crearán notificacións push a través do botón \"@:settings.notifications.show_btn{'\"'} unha vez activadas.",
"enable_description_desktop": "Para recibir notificacións cando Elk non está aberta, activa as notificacións Push. Cando as actives poderás controlar de xeito preciso o tipo de interaccións que crearán notificación Push en \"Axustes > Notificacións > Axustes Notificacións Push\".",
"enable_description_mobile": "Tamén podes acceder aos axustes usando o menú de navegación \"Axustes > Notificacións > Axustes notificación Push\".",
"enable_description_settings": "Para recibir notificacións cando Elk non está aberta, activa as notificacións Push. Cando as actives, e nesta mesma panalla, poderás controlar de xeito preciso o tipo de interacción que creará unha notificación Push.",
"enable_desktop": "Activar notificacións Push",
"enable_title": "Non perdas nada",
"re_auth": "Semella que o teu servidor non ten soporte para notificacións Push. Inténtao pechando a sesión e volvendo a acceder, se esta mensaxe continúa aparecendo contacta coa administración do teu servidor."
}
},
"show_btn": "Ir aos axustes de notificacións"
},
"notifications_settings": "Notificacións",
"preferences": {
"enable_autoplay": "Activa reprodución auto.",
"github_cards": "GitHub Cards",
"grayscale_mode": "Modo en escala de grises",
"hide_account_hover_card": "Non mostrar tarxetas emerxentes",
"hide_boost_count": "Agochar conta de promocións",
"hide_favorite_count": "Agochar conta de favoritos",
"hide_follower_count": "Agochar conta de seguimentos",
"hide_translation": "Agochar tradución",
"label": "Preferencias",
"title": "Características experimentais",
"user_picker": "Selector de usuarias",
"virtual_scroll": "Desprazamento virtual"
},
"profile": {
"appearance": {
"bio": "Bio",
"description": "Editar avatar, nome de usuaria, perfil, etc.",
"display_name": "Nome público",
"label": "Aspecto",
"profile_metadata": "Metadatos do perfil",
"profile_metadata_desc": "Podes mostrar {0} elementos nunha táboa no teu perfil",
"title": "Editar perfil"
},
"featured_tags": {
"description": "Será posible buscar as túas publicacións públicas con estos cancelos.",
"label": "Cancelos destacados"
},
"label": "Perfil"
},
"select_a_settings": "Elixe un axuste",
"users": {
"export": "Exportar User Tokens",
"import": "Importar User Tokens",
"label": "Contas conectadas"
}
},
"share-target": {
"description": "Podes configurar Elk para compartir contido desde outras aplicacións, simplemente instala Elk no teu dispositivo ou computadora e inicia sesión.",
"hint": "Para poder compartir usando Elk, debes instalar Elk e iniciar sesión.",
"title": "Compartir con Elk"
},
"state": {
"attachments_exceed_server_limit": "O número de anexo excede o límite por publicación.",
"attachments_limit_error": "Límite por publicación superado",
"edited": "(Editado)",
"editing": "Editando",
"loading": "Cargando...",
"publish_failed": "Fallou a publicación",
"publishing": "Publicando",
"upload_failed": "Fallou a subida",
"uploading": "Subindo..."
},
"status": {
"boosted_by": "Promovida por",
"edited": "Editada por {0}",
"favourited_by": "Favorecida por",
"filter_hidden_phrase": "Filtrada por",
"filter_removed_phrase": "Eliminada polo filtro",
"filter_show_anyway": "Mostrar igualmente",
"img_alt": {
"desc": "Descrición",
"dismiss": "Desbotar"
},
"poll": {
"count": "{0} votos|{0} voto|{0} votos",
"ends": "remata en {0}",
"finished": "rematou o {0}"
},
"reblogged": "Promovida por {0}",
"replying_to": "En resposta a {0}",
"show_full_thread": "Mostrar conversa completa",
"someone": "alguén",
"spoiler_show_less": "Mostrar menos",
"spoiler_show_more": "Mostrar máis",
"thread": "Fío",
"try_original_site": "Ver no sitio orixinal"
},
"status_history": {
"created": "escrita o {0}",
"edited": "editada o {0}"
},
"tab": {
"for_you": "Para ti",
"hashtags": "Cancelos",
"media": "Multimedia",
"news": "Novas",
"notifications_all": "Todo",
"notifications_mention": "Mención",
"posts": "Publicacións",
"posts_with_replies": "Publicacións & Respostas"
},
"tag": {
"follow": "Seguir",
"follow_label": "Seguir etiqueta {0}",
"unfollow": "Deixar de seguir",
"unfollow_label": "Retirar seguimento de {0}"
},
"time_ago_options": {
"day_future": "en 0 días|mañán|en {n} días",
"day_past": "fai 0 días|onte|fai {n} días",
"hour_future": "en 0 horas|nunha hora|en {n} horas",
"hour_past": "fai 0 horas|fai 1 hora|fai {n} horas",
"just_now": "agora",
"minute_future": "en 0 minutos|nun minuto|en {n} minutos",
"minute_past": "fai 0 minutos|fai un minuto|fai{n} minutos",
"month_future": "en 0 meses|o próximo mes|en {n} meses",
"month_past": "fai 0 meses|o último mes|fai {n} meses",
"second_future": "agora|en {n} segundo|en {n} segundos",
"second_past": "agora|fai {n} segundo|fai {n} segundos",
"short_day_future": "en {n}d",
"short_day_past": "{n}d",
"short_hour_future": "en {n}h",
"short_hour_past": "{n}h",
"short_minute_future": "en {n}min",
"short_minute_past": "{n}min",
"short_month_future": "en {n}m",
"short_month_past": "{n}m",
"short_second_future": "en {n}s",
"short_second_past": "{n}s",
"short_week_future": "en {n}se",
"short_week_past": "{n}se",
"short_year_future": "in {n}a",
"short_year_past": "{n}a",
"week_future": "en 0 semanas|próxima semana|en {n} semanas",
"week_past": "fai 0 semanas|última semana|fai {n} semanas",
"year_future": "en 0 anos|próximo ano|en {n} anos",
"year_past": "fai 0 anos|último ano|fai {n} anos"
},
"timeline": {
"show_new_items": "Mostrar {v} novos elementos|Mostrar {v} novo elemento|Mostrar {v} novos elementos",
"view_older_posts": "Non se mostrarán publicacións antigas desde outras instancias."
},
"title": {
"federated_timeline": "Cronoloxía Federada",
"local_timeline": "Cronoloxía Local"
},
"tooltip": {
"add_content_warning": "Engadir aviso sobre o contido",
"add_emojis": "Engadir emojis",
"add_media": "Engade unha imaxe, vídeo ou ficheiro de audio",
"add_publishable_content": "Engade contido a publicar",
"change_content_visibility": "Cambia a visibilidade do contido",
"change_language": "Cambia o idioma",
"emoji": "Emoji",
"explore_links_intro": "Estes son os temas sobre os que están a conversar agora mesmo as persoas deste servidor e as dos outros servidores da rede descentralizada.",
"explore_posts_intro": "Estas publicacións deste e outros servidores da rede descentralizada están aumentando a súa popularidade.",
"explore_tags_intro": "Está aumentando a popularidade destes cancelos entre as persoas deste e outros servidores da rede descentralizada.",
"publish_failed": "Close failed messages at the top of editor to republish posts",
"toggle_code_block": "Activar bloque de código"
},
"user": {
"add_existing": "Engadir unha conta existente.",
"server_address_label": "Enderezo do Servidor Mastodon",
"sign_in_desc": "Inicia sesión para seguir perfís e cancelos, favorecer, compartir ou responder a mensaxes, ou interactuar coa túa conta noutro servidor.",
"sign_in_notice_title": "Vendo {0} datos públicos",
"sign_out_account": "Pechar sesión {0}",
"tip_no_account": "Se aínda non tes unha conta Mastodon, {0}.",
"tip_register_account": "elixe un servidor para crear unha"
},
"visibility": {
"direct": "Directa",
"direct_desc": "Visible só polas usuarias mencionadas",
"private": "Só seguidoras",
"private_desc": "Visible só polas seguidoras",
"public": "Pública",
"public_desc": "Visible por todas",
"unlisted": "Non listada",
"unlisted_desc": "Visible por todas, pero non aparece en seccións Descubrir"
}
}

View file

@ -174,6 +174,11 @@
"language": {
"search": "検索"
},
"list": {
"add_account": "アカウントをリストに追加",
"modify_account": "このアカウントでリストを編集",
"remove_account": "アカウントをリストから削除"
},
"menu": {
"block_account": "{0}さんをブロック",
"block_domain": "{0}をドメインブロック",
@ -216,9 +221,12 @@
"favourites": "お気に入り",
"federated": "連合",
"home": "ホーム",
"list": "リスト",
"lists": "リスト",
"local": "ローカル",
"muted_users": "ミュートしたユーザー",
"notifications": "通知",
"privacy": "プライバシー",
"profile": "プロフィール",
"search": "検索",
"select_feature_flags": "実験的機能を切り替え",
@ -248,6 +256,8 @@
},
"pwa": {
"dismiss": "閉じる",
"install": "インストール",
"install_title": "Elkをインストール",
"title": "新しいElkのアップデートが利用できます",
"update": "アップデート",
"update_available_short": "Elkをアップデート",
@ -362,9 +372,12 @@
"enable_autoplay": "自動再生を有効化",
"github_cards": "GitHubカード",
"grayscale_mode": "グレースケールモード",
"hide_account_hover_card": "アカウントのホバーカードを隠す",
"hide_boost_count": "ブーストの数を隠す",
"hide_favorite_count": "お気に入りの数を隠す",
"hide_follower_count": "フォロワーの数を隠す",
"hide_reply_count": "リプライの数を隠す",
"hide_translation": "翻訳を隠す",
"label": "環境設定",
"title": "実験的機能",
"user_picker": "ユーザーピッカー",
@ -432,15 +445,17 @@
"spoiler_show_less": "隠す",
"spoiler_show_more": "表示する",
"thread": "スレッド",
"try_original_site": "元のサイトを試す"
"try_original_site": "元のサイトを試す"
},
"status_history": {
"created": "{0}に投稿",
"edited": "{0}に編集"
},
"tab": {
"accounts": "アカウント",
"for_you": "For you",
"hashtags": "ハッシュタグ",
"list": "リスト",
"media": "メディア",
"news": "ニュース",
"notifications_all": "すべて",

View file

@ -167,6 +167,11 @@
"language": {
"search": "Szukaj"
},
"list": {
"add_account": "Dodaj konto do listy",
"modify_account": "Modyfikacja listy",
"remove_account": "Usuń konto z listy"
},
"menu": {
"block_account": "Zablokuj {0}",
"block_domain": "Zablokuj domenę {0}",
@ -208,10 +213,13 @@
"explore": "Odkrywaj",
"favourites": "Ulubione",
"federated": "Globalna",
"home": "Strona główna",
"home": "Główny widok",
"list": "Lista",
"lists": "Listy",
"local": "Lokalna",
"muted_users": "Wyciszeni użytkownicy",
"notifications": "Powiadomienia",
"privacy": "Prywatność",
"profile": "Profil",
"search": "Szukaj",
"select_feature_flags": "Włączanie funkcji",
@ -241,6 +249,8 @@
},
"pwa": {
"dismiss": "Odrzuć",
"install": "Zainstaluj",
"install_title": "Instalacja Elk",
"title": "Dostępna nowa aktualizacja Elk!",
"update": "Aktualizacja",
"update_available_short": "Zaktualizuj Elk",
@ -288,24 +298,17 @@
"label": "Ustawienia konta"
},
"interface": {
"color_mode": "Tryb koloru",
"color_mode": "Motyw",
"dark_mode": "Ciemny",
"default": " (domyślna)",
"font_size": "Rozmiar czcionki",
"label": "Wygląd",
"light_mode": "Jasny",
"size_label": {
"lg": "Duża",
"md": "Średnia",
"sm": "Mała",
"xl": "Bardzo duża",
"xs": "Bardzo mała"
},
"system_mode": "Systemowy",
"theme_color": "Kolor motywu"
},
"language": {
"display_language": "Wyświetl język",
"display_language": "Język aplikacji",
"label": "Język"
},
"notifications": {
@ -316,21 +319,21 @@
"push_notifications": {
"alerts": {
"favourite": "Ulubione",
"follow": "Nowi obserwujący",
"follow": "Nowy obserwujący",
"mention": "Wzmianki",
"poll": "Ankiety",
"reblog": "Udostępnione moje wpisy",
"title": "Jakie powiadomienia otrzymywać?"
"reblog": "Udostępniono Twój wpis",
"title": "Jakie powiadomienia chcesz otrzymywać?"
},
"description": "Otrzymuj powiadomienia nawet wtedy, gdy nie korzystasz z Elk.",
"instructions": "Nie zapomnij zapisać zmian za pomocą przycisku @:settings.notifications.push_notifications.save_settings!",
"instructions": "Nie zapomnij zapisać zmian za pomocą przycisku \"Zapisz ustawienia\"",
"label": "Ustawienia powiadomień push",
"policy": {
"all": "Od kogokolwiek",
"followed": "Od tych, których obserwuję",
"follower": "Od tych, którzy mnie obserwują",
"none": "Od nikogo",
"title": "Od kogo mo otrzymywać powiadomienia?"
"title": "Od kogo możesz otrzymywać powiadomienia?"
},
"save_settings": "Zapisz ustawienia",
"subscription_error": {
@ -362,9 +365,12 @@
"enable_autoplay": "Włącz autoodtwarzanie",
"github_cards": "GitHub Cards",
"grayscale_mode": "Tryb skali szarości",
"hide_account_hover_card": "Ukryj wizytówkę konta",
"hide_boost_count": "Ukryj liczbę podbić",
"hide_favorite_count": "Ukryj liczbę polubień",
"hide_follower_count": "Ukryj liczbę obserwujących",
"hide_reply_count": "Ukryj liczbę odpowiedzi",
"hide_translation": "Ukryj funkcję tłumaczenia",
"label": "Preferencje",
"title": "Funkcje eksperymentalne",
"user_picker": "User Picker",
@ -377,11 +383,11 @@
"display_name": "Wyświetlana nazwa",
"label": "Wygląd",
"profile_metadata": "Metadane profilu",
"profile_metadata_desc": "Możesz mieć maksymalnie {0} elementów wyświetlanych jako tabela w swoim profilu",
"profile_metadata_desc": "Możesz mieć maksymalnie {0} elementy wyświetlane jako tabela w swoim profilu",
"title": "Edytuj profil"
},
"featured_tags": {
"description": "Ludzie mogą przeglądać Twoje publiczne posty pod tymi hasztagami.",
"description": "Ludzie mogą przeglądać Twoje publiczne wpisy pod tymi hasztagami.",
"label": "Polecane hasztagi"
},
"label": "Profil"
@ -439,8 +445,10 @@
"edited": "edytowano {0}"
},
"tab": {
"accounts": "Konta",
"for_you": "Dla Ciebie",
"hashtags": "Hasztagi",
"list": "Lista",
"media": "Media",
"news": "Aktualności",
"notifications_all": "Wszystko",
@ -459,7 +467,7 @@
"day_past": "0 dni temu|wczoraj|{n} dni temu",
"hour_future": "za 0 godzin|za 1 godzinę|za {n} godziny|za {n} godzin",
"hour_past": "0 godzin temu|1 godzinę temu|{n} godziny temu|{n} godzin temu",
"just_now": "właśnie teraz",
"just_now": "teraz",
"minute_future": "za 0 minut|za 1 minutę|za {n} minuty|za {n} minut",
"minute_past": "0 minut temu|1 minutę temu|{n} minuty temu|{n} minut temu",
"month_future": "za 0 miesięcy|za miesiąc|za {n} miesiące|za {n} miesięcy",

View file

@ -174,6 +174,11 @@
"language": {
"search": "Procurar"
},
"list": {
"add_account": "Adicionar conta à lista",
"modify_account": "Modificar listas com a conta",
"remove_account": "Remover conta da lista"
},
"menu": {
"block_account": "Bloquear {0}",
"block_domain": "Bloquear domínio {0}",
@ -216,9 +221,12 @@
"favourites": "Favoritos",
"federated": "Federada",
"home": "Início",
"list": "Lista",
"lists": "Listas",
"local": "Local",
"muted_users": "Utilizadores silenciados",
"notifications": "Notificações",
"privacy": "Privacidade",
"profile": "Perfil",
"search": "Procurar",
"select_feature_flags": "Alternar Funcionalidades",
@ -248,6 +256,8 @@
},
"pwa": {
"dismiss": "Dispensar",
"install": "Instalar",
"install_title": "Instalar Elk",
"title": "Nova atualização do Elk disponível!",
"update": "Atualizar",
"update_available_short": "Atualizar Elk",
@ -362,9 +372,12 @@
"enable_autoplay": "Habilitar Reprodução Automática",
"github_cards": "Cartões do GitHub",
"grayscale_mode": "Modo tons de cinza",
"hide_account_hover_card": "Esconder cartão flutuante de conta",
"hide_boost_count": "Esconder contagem de partilhas",
"hide_favorite_count": "Esconder contagem de favoritos",
"hide_follower_count": "Esconder contagem de seguidores",
"hide_reply_count": "Esconder contagem de respostas",
"hide_translation": "Esconder botão de tradução",
"label": "Preferências",
"title": "Funcionalidades Experimentais",
"user_picker": "Selecionador de Utilizador",
@ -375,7 +388,7 @@
"bio": "Bio",
"description": "Editar imagem de perfil, nome, perfil, etc.",
"display_name": "Nome de apresentação",
"label": "Aspecto",
"label": "Aspeto",
"profile_metadata": "Metadados de perfil",
"profile_metadata_desc": "Pode ter até {0} itens expostos, em forma de tabela, no seu perfil",
"title": "Editar perfil"
@ -439,8 +452,10 @@
"edited": "editada {0}"
},
"tab": {
"accounts": "Contas",
"for_you": "Para si",
"hashtags": "Hashtags",
"list": "Lista",
"media": "Media",
"news": "Notícias",
"notifications_all": "Todas",

529
locales/ru-RU.json Normal file
View file

@ -0,0 +1,529 @@
{
"a11y": {
"loading_page": "Загрузка страницы, пожалуйста, подождите",
"loading_titled_page": "Загрузка страницы {0}, пожалуйста, подождите",
"locale_changed": "Язык изменен на {0}",
"locale_changing": "Изменение языка, пожалуйста, подождите",
"route_loaded": "Страница {0} загружена"
},
"account": {
"avatar_description": "Аватар {0}",
"blocked_by": "Вы заблокированы этим пользователем.",
"blocked_domains": "Заблокированные домены",
"blocked_users": "Заблокированные пользователи",
"blocking": "Заблокирован",
"bot": "БОТ",
"favourites": "Избранное",
"follow": "Читать",
"follow_back": "Читать",
"follow_requested": "В ожидании",
"followers": "Читатели",
"followers_count": "{0} Читатель|{0} Читателя|{0} Читателей|{0} Читателей",
"following": "Читаю",
"following_count": "{0} в читаемых",
"follows_you": "Читает вас",
"go_to_profile": "Перейти к профилю",
"joined": "Регистрация",
"moved_title": "теперь использует другую учетную запись:",
"muted_users": "Игнорируемые пользователи",
"muting": "Вы игнорируете",
"mutuals": "Взаимно читаю",
"notifications_on_post_disable": "Не уведомлять о постах {username}",
"notifications_on_post_enable": "Уведомлять о постах {username}",
"pinned": "Закрепленные посты",
"posts": "Посты",
"posts_count": "{0} Пост|{0} Поста|{0} Постов|{0} Постов",
"profile_description": "Заголовок профиля {0}",
"profile_unavailable": "Профиль недоступен",
"unblock": "Перестать блокировать",
"unfollow": "Перестать читать",
"unmute": "Перестать игнорировать"
},
"action": {
"apply": "Применить",
"bookmark": "Добавить в закладки",
"bookmarked": "Добавлен в закладки",
"boost": "Сделать репост",
"boost_count": "{0}",
"boosted": "Репост сделан",
"clear_publish_failed": "Закрыть сообщение об ошибке публикации",
"clear_upload_failed": "Закрыть сообщение об ошибке загрузки файлов",
"close": "Закрыть",
"compose": "Написать",
"confirm": "Да",
"edit": "Редактировать",
"enter_app": "Перейти к приложению",
"favourite": "Добавить в избранное",
"favourite_count": "{0}",
"favourited": "Добавлено в избранное",
"more": "Больше",
"next": "Следующее",
"prev": "Предыдущее",
"previous": "Предыдущее",
"publish": "Опубликовать",
"reply": "Ответить",
"reply_count": "{0}",
"reset": "Отменить изменения",
"save": "Сохранить",
"save_changes": "Сохранить изменения",
"sign_in": "Войти",
"switch_account": "Сменить учетную запись",
"vote": "Ответить"
},
"app_desc_short": "Открытый веб-клиент для Mastodon",
"app_logo": "Логотип Elk",
"app_name": "Elk",
"attachment": {
"edit_title": "Описание",
"remove_label": "Удалить файл"
},
"command": {
"activate": "Активировать",
"complete": "Дополнить",
"compose_desc": "Написать новый пост",
"n-people-in-the-past-n-days": "{0} людей за последние {1} д",
"select_lang": "Выбрать язык",
"sign_in_desc": "Добавить существующую учетную запись",
"switch_account": "Переключить на {0}",
"switch_account_desc": "Переключить на учетную запись",
"toggle_dark_mode": "Переключить темный режим",
"toggle_zen_mode": "Переключить режим дзен"
},
"common": {
"confirm_dialog": {
"cancel": "Нет",
"confirm": "Да",
"title": "Вы уверены?"
},
"end_of_list": "Конец списка",
"error": "ОШИБКА",
"in": "в",
"not_found": "404 - Не Найдено",
"offline_desc": "Похоже, вы находитесь в автономном режиме. Пожалуйста, проверьте ваше сетевое подключение."
},
"compose": {
"draft_title": "Черновик {0}",
"drafts": "Черновики ({v})"
},
"confirm": {
"block_account": {
"cancel": "Отмена",
"confirm": "Заблокировать",
"title": "Вы уверены, что хотите заблокировать {0}"
},
"block_domain": {
"cancel": "Отмена",
"confirm": "Заблокировать",
"title": "Вы уверены, что хотите заблокировать {0}"
},
"common": {
"cancel": "Нет",
"confirm": "Да"
},
"delete_posts": {
"cancel": "Отмена",
"confirm": "Удалить",
"title": "Вы уверены, что хотите удалить этот пост?"
},
"mute_account": {
"cancel": "Отмена",
"confirm": "Скрыть",
"title": "Вы уверены, что хотите скрыть {0}"
},
"show_reblogs": {
"cancel": "Нет",
"confirm": "Да",
"title": "Вы уверены, что хотите снова видеть репосты от {0}"
},
"unfollow": {
"cancel": "Нет",
"confirm": "Да",
"title": "Вы уверены, что хотите перестать читать этого пользователя?"
}
},
"conversation": {
"with": "Переписка с"
},
"error": {
"account_not_found": "Учетная запись {0} не найдена",
"explore-list-empty": "Сейчас тренды пусты. Загляните попозже!",
"file_size_cannot_exceed_n_mb": "Размер файла не может превышать {0} Мбайт",
"sign_in_error": "Не удается подключиться к серверу.",
"status_not_found": "Пост не найден",
"unsupported_file_format": "Неподдерживаемый формат файла"
},
"help": {
"desc_highlight": "В приложении может недоставать некоторых функций, зато могут попадаться баги.",
"desc_para1": "Спасибо за участие в тестировании Elk, открытого веб-клиента для Mastodon!",
"desc_para2": "Мы усердно работаем над развитием приложения и постоянно его улучшаем.",
"desc_para3": "А еще вы можете поддержать разработку, став спонсором нашей команды на GitHub Sponsors. Мы надеемся, что вам понравится Elk!",
"desc_para4": "Elk является проектом с открытым исходным кодом. Если вы хотите помочь с тестированием, обратной связью или разработкой,",
"desc_para5": "приходите к нам на GitHub",
"desc_para6": "и примите участие.",
"title": "Elk находится в превью!"
},
"language": {
"search": "Поиск"
},
"menu": {
"block_account": "Заблокировать {0}",
"block_domain": "Заблокировать домен {0}",
"copy_link_to_post": "Скопировать ссылку на этот пост",
"delete": "Удалить",
"delete_and_redraft": "Удалить и переписать",
"delete_confirm": {
"cancel": "Отменить",
"confirm": "Удалить",
"title": "Вы уверены, что хотите удалить этот пост?"
},
"direct_message_account": "Отправьте личное сообщение {0}",
"edit": "Редактировать",
"hide_reblogs": "Скрыть репосты от {0}",
"mention_account": "Упомянуть {0}",
"mute_account": "Игнорировать {0}",
"mute_conversation": "Игнорировать пост",
"open_in_original_site": "Открыть на исходном сайте",
"pin_on_profile": "Закрепить в профиле",
"share_post": "Поделиться этим постом",
"show_favourited_and_boosted_by": "Кто добавил в избранное и сделал репост",
"show_reblogs": "Показывать репосты от {0}",
"show_untranslated": "Показать оригинал",
"toggle_theme": {
"dark": "Включить темную тему",
"light": "Включить светлую тему"
},
"translate_post": "Перевести пост",
"unblock_account": "Разблокировать {0}",
"unblock_domain": "Разблокировать домен {0}",
"unmute_account": "Не игнорировать {0}",
"unmute_conversation": "Не игнорировать этот пост",
"unpin_on_profile": "Открепить от профиля"
},
"nav": {
"back": "Назад",
"blocked_domains": "Заблокированные домены",
"blocked_users": "Заблокированные пользователи",
"bookmarks": "Закладки",
"built_at": "Билд собран {0}",
"compose": "Написать",
"conversations": "Сообщения",
"explore": "Обзор",
"favourites": "Избранное",
"federated": "Все сервера",
"home": "Главная",
"local": "Этот сервер",
"muted_users": "Скрытые пользователи",
"notifications": "Уведомления",
"profile": "Профиль",
"search": "Поиск",
"select_feature_flags": "Переключить флаги функций",
"select_font_size": "Размер текста",
"select_language": "Язык сайта",
"settings": "Настройки",
"show_intro": "Показать интро",
"toggle_theme": "Переключить тему",
"zen_mode": "Рижим дзен"
},
"notification": {
"favourited_post": "добавили ваш пост в избранное",
"followed_you": "теперь читает вас",
"followed_you_count": "{0} читатель|{0} читателя|{0} читателей|{0} читателей",
"missing_type": "ОТСУТСТВУЕТ notification.type:",
"reblogged_post": "сделали реблог вашего поста",
"request_to_follow": "запрос на чтение",
"signed_up": "зарегистрировались",
"update_status": "обновили свой пост"
},
"placeholder": {
"content_warning": "Напишите ваше предупреждение...",
"default_1": "Что у вас нового?",
"reply_to_account": "Ответить {0}",
"replying": "Написать в ответ",
"the_thread": "тред"
},
"pwa": {
"dismiss": "Отклонить",
"title": "Доступно новое обновление Elk!",
"update": "Обновление",
"update_available_short": "Обновить Elk",
"webmanifest": {
"canary": {
"description": "Открытый веб-клиент для Mastodon (canary)",
"name": "Elk (canary)",
"short_name": "Elk (canary)"
},
"dev": {
"description": "Открытый веб-клиент для Mastodon (dev)",
"name": "Elk (dev)",
"short_name": "Elk (dev)"
},
"preview": {
"description": "Открытый веб-клиент для Mastodon (preview)",
"name": "Elk (preview)",
"short_name": "Elk (preview)"
},
"release": {
"description": "Открытый веб-клиент для Mastodon",
"name": "Elk",
"short_name": "Elk"
}
}
},
"search": {
"search_desc": "Поиск людей и хэштегов",
"search_empty": "Не удалось найти ничего по этому поисковому запросу"
},
"settings": {
"about": {
"label": "О Elk",
"meet_the_team": "Наша команда",
"sponsor_action": "Станьте спонсором",
"sponsor_action_desc": "Чтобы поддержать команду, разрабатывающую Elk",
"sponsors": "Спонсоры",
"sponsors_body_1": "Elk стал возможен благодаря спонсированию и помощи:",
"sponsors_body_2": "А также всех компаний и частных лиц, спонсирующих команду Elk и ее членов.",
"sponsors_body_3": "Если вам нравится приложение, возможно вы захотите стать нашим спонсором:"
},
"account_settings": {
"description": "Вы можете изменить параметры своей учетной записи в пользовательском интерфейсе Mastodon",
"label": "Настройки учетной записи"
},
"interface": {
"color_mode": "Тема",
"dark_mode": "Темная",
"default": " (по умолчанию)",
"font_size": "Размер текста",
"label": "Интерфейс",
"light_mode": "Светлая",
"size_label": {
"lg": "Большой",
"md": "Средний",
"sm": "Маленький",
"xl": "Очень большой",
"xs": "Очень маленький"
},
"system_mode": "Системная",
"theme_color": "Цвет"
},
"language": {
"display_language": "Язык отображения",
"label": "Язык"
},
"notifications": {
"label": "Уведомления",
"notifications": {
"label": "Настройки уведомлений"
},
"push_notifications": {
"alerts": {
"favourite": "Добавление в избранное",
"follow": "Новые читатели",
"mention": "Упоминания",
"poll": "Опросы",
"reblog": "Репосты",
"title": "Какие уведомления получать?"
},
"description": "Получайте уведомления, даже если вы не используете Elk.",
"instructions": "Не забудьте сохранить свои изменения, используя кнопку @:settings.notifications.push_notifications.save_settings!",
"label": "Настройки Push-уведомлений",
"policy": {
"all": "От кого угодно",
"followed": "От тех, кого я читаю",
"follower": "От тех, кто читает меня",
"none": "Ни от кого",
"title": "От кого я могу получать уведомления?"
},
"save_settings": "Сохранить настройки",
"subscription_error": {
"clear_error": "Очистить ошибки",
"permission_denied": "Ошибка: включите уведомления в вашем браузере.",
"request_error": "При запросе подписки произошла ошибка, попробуйте еще раз, и если ошибка повторится, пожалуйста, сообщите о проблеме в Github репозиторий Elk.",
"title": "Не удалось подписаться на push-уведомления",
"too_many_registrations": "Из-за ограничений браузера, Elk не может использовать службу push-уведомлений для нескольких учетных записей на разных серверах. Вам необходимо отказаться от подписки на push-уведомления в других аккаунтах и повторить попытку."
},
"title": "Настройки push-уведомлений",
"undo_settings": "Отменить изменения",
"unsubscribe": "Отключить push-уведомления",
"unsupported": "Ваш браузер не поддерживает push-уведомления.",
"warning": {
"enable_close": "Закрыть",
"enable_description": "Чтобы получать уведомления, даже когда Elk закрыт, включите push-уведомления. После включения, с помощью кнопки \"@:settings.notifications.show_btn{'\"'} выше, вы сможете настроить какие именно действия генерируют push-уведомления.",
"enable_description_desktop": "Чтобы получать уведомления, даже когда Elk закрыт, включите push-уведомления. После включения, в меню \"Настройки > Уведомления > Настройки Push-уведомлений\" появится возможность настроить какие именно действия генерируют push-уведомления.",
"enable_description_mobile": "Вы также можете получить доступ к настройкам в меню \"Настройки > Уведомления > Настройки Push-уведомлений\".",
"enable_description_settings": "Чтобы получать уведомления, даже когда Elk закрыт, включите push-уведомления. После включения, на этом экране появится возможность настроить какие именно действия генерируют push-уведомления.",
"enable_desktop": "Включить push-уведомления",
"enable_title": "Оставайтесь в курсе событий",
"re_auth": "Похоже, что ваш сервер не поддерживает push-уведомления. Попробуйте выйти и снова войти в систему, если это сообщение все еще появляется, обратитесь к администратору вашего сервера."
}
},
"show_btn": "Перейдите в настройки уведомлений"
},
"notifications_settings": "Уведомления",
"preferences": {
"github_cards": "GitHub карточки",
"grayscale_mode": "Режим серого цвета",
"hide_boost_count": "Скрыть счетчик репостов",
"hide_favorite_count": "Скрыть счетчик избранного",
"hide_follower_count": "Скрыть счетчик читателей",
"label": "Настройки",
"title": "Экспериментальные функции",
"user_picker": "Переключатель учетных записей",
"virtual_scroll": "Виртуальный скролл"
},
"profile": {
"appearance": {
"bio": "О себе",
"description": "Измените аватар, обложку, имя пользователя и т.д.",
"display_name": "Имя",
"label": "Публичный профиль",
"profile_metadata": "Метаданные профиля",
"profile_metadata_desc": "В вашем профиле может отображаться до {0} элементов в виде таблицы",
"title": "Настройки профиля пользователя"
},
"featured_tags": {
"description": "Люди могут просматривать ваши публичные посты под этими хэштегами.",
"label": "Рекомендуемые хэштеги"
},
"label": "Профиль"
},
"select_a_settings": "Выберите настройку",
"users": {
"export": "Экспорт пользовательских токенов",
"import": "Импорт пользовательских токенов",
"label": "Авторизованные пользователи"
}
},
"share-target": {
"description": "Elk можно настроить таким образом, чтобы вы могли делиться контентом из других приложений, просто установите Elk на свое устройство или компьютер и войдите в систему.",
"hint": "Чтобы поделиться контентом с помощью Elk, вы должны установить Elk и войти в систему.",
"title": "Поделиться с помощью Elk"
},
"state": {
"attachments_exceed_server_limit": "Количество вложенных файлов превысило лимит на одно сообщение.",
"attachments_limit_error": "Превышен лимит вложенных файлов на одно сообщение",
"edited": "(Отредактированно)",
"editing": "Редактирование",
"loading": "Погрузка...",
"publish_failed": "Ошибка публикации",
"publishing": "Публикация...",
"upload_failed": "Ошибка загрузки файлов",
"uploading": "Загрузка..."
},
"status": {
"boosted_by": "Сделали репост",
"edited": "Отредактировано {0}",
"favourited_by": "Добавили в избранное",
"filter_hidden_phrase": "Отфильтровано по",
"filter_removed_phrase": "Удалено фильтром",
"filter_show_anyway": "Показать все равно",
"img_alt": {
"desc": "Описание",
"dismiss": "Закрыть"
},
"poll": {
"count": "{0} голос|{0} голоса|{0} голосов|{0} голосов",
"ends": "Завершается {0}",
"finished": "Завершен {0}"
},
"reblogged": "{0} сделали репост",
"replying_to": "Ответ на пост {0}",
"show_full_thread": "Показать весь тред",
"someone": "кого-то",
"spoiler_show_less": "Скрыть",
"spoiler_show_more": "Показать",
"thread": "Тред",
"try_original_site": "Посмотреть на оригинальном сайте"
},
"status_history": {
"created": "созданно {0}",
"edited": "отредактировано {0}"
},
"tab": {
"for_you": "Для вас",
"hashtags": "Хэштеги",
"media": "Медиа",
"news": "Новости",
"notifications_all": "Все",
"notifications_mention": "Упоминания",
"posts": "Посты",
"posts_with_replies": "Посты и Ответы"
},
"tag": {
"follow": "Подписаться",
"follow_label": "Подписаться на хэштег {0}",
"unfollow": "Отписаться",
"unfollow_label": "Отписаться от хэштега {0}"
},
"time_ago_options": {
"day_future": "через {n} день|через {n} дня|через {n} дней|через {n} дней",
"day_past": "{n} день назад|{n} дня назад|{n} дней назад|{n} дней назад",
"hour_future": "через {n} час|через {n} часа|через {n} часов|через {n} часов",
"hour_past": "{n} час назад|{n} часа назад|{n} часов назад|{n} часов назад",
"just_now": "только что",
"minute_future": "через {n} минуту|через {n} минуты|через {n} минут|через {n} минут",
"minute_past": "{n} минуту назад|{n} минуты назад|{n} минут назад|{n} минут назад",
"month_future": "через {n} месяц|через {n} месяца|через {n} месяцев|через {n} месяцев",
"month_past": "{n} месяц назад|{n} месяца назад|{n} месяцев назад|{n} месяцев назад",
"second_future": "через {n} секунду|через {n} секунды|через {n} секунд|через {n} секунд",
"second_past": "{n} секунду назад|{n} секунды назад|{n} секунд назад|{n} секунд назад",
"short_day_future": "через {n} д",
"short_day_past": "{n} д",
"short_hour_future": "через {n} ч",
"short_hour_past": "{n} ч",
"short_minute_future": "через {n} мин",
"short_minute_past": "{n} мин",
"short_month_future": "через {n} мес",
"short_month_past": "{n} мес",
"short_second_future": "через {n} сек",
"short_second_past": "{n} сек",
"short_week_future": "через {n} нед",
"short_week_past": "{n} нед",
"short_year_future": "через {n} год",
"short_year_past": "{n} год",
"week_future": "через {n} неделю|через {n} недели|через {n} недель|через {n} недель",
"week_past": "{n} неделю назад|{n} недели назад|{n} недель назад|{n} недель назад",
"year_future": "через {n} год|через {n} года|через {n} лет|через {n} лет",
"year_past": "{n} год назад|{n} года назад|{n} лет назад|{n} лет назад"
},
"timeline": {
"show_new_items": "Показать {v} новый элемент|Показать {v} новых элемента|Показать {v} новых элементов|Показать {v} новых элементов",
"view_older_posts": "Более старые записи из других инстансов могут не отображаться."
},
"title": {
"federated_timeline": "Лента всех серверов",
"local_timeline": "Лента этого сервера"
},
"tooltip": {
"add_content_warning": "Добавить предупреждение о содержимом",
"add_emojis": "Добавить эмодзи",
"add_media": "Добавить изображения, видео или аудиофайл",
"add_publishable_content": "Добавьте контент для публикации",
"change_content_visibility": "Изменить аудиторию",
"change_language": "Изменить язык",
"emoji": "Эмодзи",
"explore_links_intro": "Об этих новостях сейчас говорят пользователи этого и других серверов децентрализованной сети.",
"explore_posts_intro": "Здесь отображаются посты с различных серверов децентрализованной сети, которые набирают популярность на этом сервере.",
"explore_tags_intro": "Здесь отображаются хэштеги, которые набирают популярность среди пользователей этого и других серверов децентрализованной сети.",
"publish_failed": "Не удалось опубликовать",
"toggle_code_block": "Кодовый блок"
},
"user": {
"add_existing": "Добавить существующую учетную запись",
"server_address_label": "Адрес сервера Mastodon",
"sign_in_desc": "Войдите, чтобы подписываться на профили и хэштеги, добавлять в избранное, делиться постами и отвечать на них, или использовать свою учетную запись с другого сервера",
"sign_in_notice_title": "Просмотр публичных данных {0}",
"sign_out_account": "Выйти из учетной записи {0}",
"tip_no_account": "Если у вас еще нет учетной записи Mastodon, {0}.",
"tip_register_account": "выберите сервер и зарегистрируйтесь на нем"
},
"visibility": {
"direct": "Только упомянутые пользователи",
"direct_desc": "Виден только упомянутым пользователям",
"private": "Только ваши читатели",
"private_desc": "Виден только вашим читателям",
"public": "Все",
"public_desc": "Виден всем",
"unlisted": "Скрытый",
"unlisted_desc": "Виден всем, но не будет показан в публичных лентах"
}
}

View file

@ -28,6 +28,8 @@
"muted_users": "已屏蔽的用户",
"muting": "已屏蔽",
"mutuals": "互相关注",
"notifications_on_post_disable": "当 {username} 发布时停止通知我",
"notifications_on_post_enable": "当 {username} 发布时通知我",
"pinned": "置顶的帖文",
"posts": "帖文",
"posts_count": "{0} 条帖文",
@ -44,6 +46,7 @@
"bookmark": "收藏",
"bookmarked": "已收藏",
"boost": "转发",
"boost_count": "{0}",
"boosted": "已转发",
"clear_publish_failed": "清除发布失败信息",
"clear_upload_failed": "清除上传失败信息",
@ -53,12 +56,14 @@
"edit": "编辑",
"enter_app": "进入应用",
"favourite": "喜欢",
"favourite_count": "{0}",
"favourited": "已喜欢",
"more": "更多",
"next": "下一个",
"prev": "上一个",
"publish": "发布",
"reply": "回复",
"reply_count": "{0}",
"reset": "重置",
"save": "保存",
"save_changes": "保存更改",
@ -135,6 +140,13 @@
"conversation": {
"with": "与"
},
"custom_cards": {
"stackblitz": {
"lines": "行 {0}",
"open": "打开",
"snippet_from": "来自 {0} 的片段"
}
},
"error": {
"account_not_found": "未找到用户 {0}",
"explore-list-empty": "目前没有热门话题,稍后再来看看吧!",
@ -144,6 +156,12 @@
"unsupported_file_format": "不支持的文件格式"
},
"help": {
"build_preview": {
"desc1": "您当前正在查看来自社区的鹿鸣预览版 - {0}。",
"desc2": "可能包含未经审查甚至恶意的更改。",
"desc3": "请不要使用真实账号登录",
"title": "预览部署"
},
"desc_highlight": "可能会在某些地方出现一些 bug 或缺失的功能。",
"desc_para1": "感谢你有兴趣尝试鹿鸣,一个我们正在积极开发的通用 Mastodon 客户端。",
"desc_para2": "我们正在努力开发中,并随着时间的推移不断完善。",
@ -160,6 +178,7 @@
"block_account": "拉黑 {0}",
"block_domain": "拉黑域名 {0}",
"copy_link_to_post": "复制这篇帖文的链接",
"copy_original_link_to_post": "复制这篇贴文的原始链接",
"delete": "删除",
"delete_and_redraft": "删除并重新编辑",
"direct_message_account": "私信 {0}",
@ -274,7 +293,15 @@
"font_size": "字号",
"label": "外观",
"light_mode": "浅色",
"system_mode": "跟随系统"
"size_label": {
"lg": "大",
"md": "中",
"sm": "小",
"xl": "特大",
"xs": "特小"
},
"system_mode": "跟随系统",
"theme_color": "主题颜色"
},
"language": {
"display_language": "首选语言",
@ -309,7 +336,8 @@
"clear_error": "清除错误",
"permission_denied": "权限不足:请在你的浏览器中打开通知权限。",
"request_error": "请求订阅时发生了一个错误,请再次尝试。如错误仍然存在,请到鹿鸣代码仓库中报告这一问题。",
"title": "无法订阅推送通知。"
"title": "无法订阅推送通知。",
"too_many_registrations": "由于浏览器限制,鹿鸣无法为不同服务器上的多个帐户使用推送通知服务。请取消订阅另一个帐户的推送通知,然后重试。"
},
"title": "推送通知设置",
"undo_settings": "撤销设置改动",
@ -330,10 +358,13 @@
},
"notifications_settings": "通知",
"preferences": {
"enable_autoplay": "开启自动播放",
"github_cards": "GitHub 卡片",
"grayscale_mode": "灰色模式",
"hide_boost_count": "隐藏转发数",
"hide_favorite_count": "隐藏收藏数",
"hide_follower_count": "隐藏关注者数",
"hide_translation": "隐藏翻译",
"label": "首选项",
"title": "实验功能",
"user_picker": "用户选择器",

View file

@ -8,20 +8,20 @@
},
"account": {
"avatar_description": "{0} 的大頭貼",
"blocked_by": "您已被此使用者列入黑名單",
"blocked_domains": "已列入黑名單的域名",
"blocked_users": "已列入黑名單的使用者",
"blocking": "已列入黑名單",
"blocked_by": "您已被該使用者封鎖",
"blocked_domains": "已封鎖的域名",
"blocked_users": "已封鎖的使用者",
"blocking": "已封鎖",
"bot": "機器人",
"favourites": "喜歡的貼文",
"follow": "關注",
"follow_back": "回",
"follow_requested": "已申請關注",
"followers": "關注者",
"followers_count": "被 {0} 人關注",
"following": "正在關注",
"following_count": "正在關注 {0} 人",
"follows_you": "已關注你",
"follow": "追蹤",
"follow_back": "回",
"follow_requested": "已要求追蹤",
"followers": "粉絲",
"followers_count": " {0} 位粉絲",
"following": "正在追蹤",
"following_count": "正在追蹤 {0} 人",
"follows_you": "已追蹤你",
"go_to_profile": "轉到個人資料",
"joined": "已加入",
"moved_title": "的新帳號是:",
@ -34,11 +34,11 @@
"posts_count": "{0} 則貼文",
"profile_description": "{0} 的個人資料封面",
"profile_unavailable": "個人資料不可見",
"unblock": "取消黑名單",
"unfollow": "取消關注",
"unblock": "取消封鎖",
"unfollow": "取消追蹤",
"unmute": "取消靜音",
"view_other_followers": "其他站點上的關注者可能不會在這裡顯示。",
"view_other_following": "其他站點上正在關注的人可能不會在這裡顯示。"
"view_other_followers": "其他站點上的粉絲可能不會在這裡顯示。",
"view_other_following": "其他站點上正在追蹤的人可能不會在這裡顯示。"
},
"action": {
"apply": "套用",
@ -52,7 +52,7 @@
"compose": "撰寫",
"confirm": "確認",
"edit": "編輯",
"enter_app": "進入應用",
"enter_app": "進入應用程式",
"favourite": "喜歡",
"favourite_count": "{0}",
"favourited": "已喜歡",
@ -69,7 +69,7 @@
"switch_account": "切換帳號",
"vote": "投票"
},
"app_desc_short": "用 🧡 製作的 Mastodon 用戶端",
"app_desc_short": "一個靈巧的 Mastodon 用戶端",
"app_logo": "鹿鳴 Logo",
"app_name": "鹿鳴",
"attachment": {
@ -82,9 +82,9 @@
"compose_desc": "寫一條新貼文",
"n-people-in-the-past-n-days": "{0} 人在過去 {1} 天",
"select_lang": "選擇語言",
"sign_in_desc": "加入現有帳",
"sign_in_desc": "加入現有帳",
"switch_account": "切換到 {0}",
"switch_account_desc": "切換到另一個帳",
"switch_account_desc": "切換到另一個帳",
"toggle_dark_mode": "切換深色模式",
"toggle_zen_mode": "切換禪模式"
},
@ -102,13 +102,13 @@
"confirm": {
"block_account": {
"cancel": "取消",
"confirm": "拉黑",
"title": "你确定將 {0} 加入黑名單吗"
"confirm": "封鎖",
"title": "你確定要封鎖 {0} 嗎"
},
"block_domain": {
"cancel": "取消",
"confirm": "拉黑",
"title": "你确定將 {0} 加入域名黑名單吗"
"confirm": "封鎖",
"title": "你確定要封鎖 {0} 域名嗎"
},
"common": {
"cancel": "否",
@ -122,17 +122,17 @@
"mute_account": {
"cancel": "取消",
"confirm": "靜音",
"title": "你确定要靜音 {0}吗"
"title": "你確定要靜音 {0}嗎"
},
"show_reblogs": {
"cancel": "取消",
"confirm": "顯示",
"title": "你确定要顯示來自 {0} 的轉發吗"
"title": "你確定要顯示來自 {0} 的轉發嗎"
},
"unfollow": {
"cancel": "取消",
"confirm": "取消關注",
"title": "你確定要取消關注嗎?"
"confirm": "取消追蹤",
"title": "你確定要取消追蹤嗎?"
}
},
"conversation": {
@ -160,8 +160,8 @@
"search": "搜尋"
},
"menu": {
"block_account": "黑名單 {0}",
"block_domain": "黑名單域名 {0}",
"block_account": "封鎖 {0}",
"block_domain": "封鎖的域名 {0}",
"copy_link_to_post": "複製這篇貼文的連結",
"delete": "刪除",
"delete_and_redraft": "刪除並重新編輯",
@ -171,7 +171,7 @@
"mention_account": "提及 {0}",
"mute_account": "靜音 {0}",
"mute_conversation": "靜音貼文",
"open_in_original_site": "從源站打開",
"open_in_original_site": "在原網站上開啟",
"pin_on_profile": "置頂在個人資料上",
"share_post": "分享這則貼文",
"show_favourited_and_boosted_by": "顯示誰喜歡和轉發了",
@ -182,16 +182,16 @@
"light": "切換淺色模式"
},
"translate_post": "翻譯貼文",
"unblock_account": "解除黑名單 {0}",
"unblock_domain": "解除黑名單域名 {0}",
"unblock_account": "解除封鎖 {0}",
"unblock_domain": "解除封鎖域名 {0}",
"unmute_account": "解除靜音 {0}",
"unmute_conversation": "取消靜音貼文",
"unpin_on_profile": "取消置頂"
},
"nav": {
"back": "回上一頁",
"blocked_domains": "已黑名單的域名",
"blocked_users": "已黑名單的使用者",
"blocked_domains": "已封鎖的域名",
"blocked_users": "已封鎖的使用者",
"bookmarks": "書籤",
"built_at": "於 {0}更新",
"compose": "撰寫",
@ -200,7 +200,7 @@
"favourites": "喜歡",
"federated": "聯邦",
"home": "首頁",
"local": "本",
"local": "本",
"muted_users": "已靜音的使用者",
"notifications": "通知",
"profile": "個人資料",
@ -215,11 +215,11 @@
},
"notification": {
"favourited_post": "點讚了你的貼文",
"followed_you": "關注了你",
"followed_you_count": "{n} 人關注了你",
"followed_you": "追蹤了你",
"followed_you_count": "{n} 人追蹤了你",
"missing_type": "未知的通知類型:",
"reblogged_post": "轉發了你的貼文",
"request_to_follow": "請求關注你",
"request_to_follow": "請求追蹤你",
"signed_up": "註冊了",
"update_status": "更新了他們的狀態"
},
@ -299,7 +299,7 @@
"push_notifications": {
"alerts": {
"favourite": "喜歡的",
"follow": "新的關注者",
"follow": "新的粉絲",
"mention": "提及",
"poll": "投票",
"reblog": "轉發了你的貼文",
@ -310,8 +310,8 @@
"label": "推播通知設定",
"policy": {
"all": "任何人",
"followed": "我關注的人",
"follower": "關注我的人",
"followed": "我追蹤的人",
"follower": "粉絲",
"none": "無人",
"title": "我可以從誰那裡接收通知?"
},
@ -319,20 +319,20 @@
"subscription_error": {
"clear_error": "清除錯誤",
"permission_denied": "權限不足:請在你的瀏覽器中打開通知權限。",
"request_error": "請求訂閱時發生了一個錯誤,請再次嘗試。如錯誤仍然存在,請到鹿鳴代碼倉庫中報告這一問題。",
"request_error": "請求訂閱時發生了一個錯誤,請再次嘗試。如錯誤仍然存在,請到鹿鳴儲存庫中報告這一問題。",
"title": "無法訂閱推播通知。",
"too_many_registrations": "由於瀏覽器限制,鹿鳴無法為不同伺服器上的多個帳戶使用推播通知服務。 你應該取消訂閱其他帳戶的推送通知,然後重試。"
"too_many_registrations": "由於瀏覽器限制,鹿鳴無法為不同伺服器上的多個帳號使用推播通知服務。 你應該取消訂閱其他帳號的推送通知,然後重試。"
},
"title": "推播通知設定",
"undo_settings": "撤銷設定變更",
"unsubscribe": "禁用桌面通知",
"unsupported": "你的瀏覽器不支援桌面通知",
"unsubscribe": "停用推播功能",
"unsupported": "你的瀏覽器不支援推播功能",
"warning": {
"enable_close": "關閉",
"enable_description": "若想在鹿鳴未開啟時接收通知,請啟用推播通知功能。啟用後,你可以通過上面的 「前往通知設定」 按鈕來 精確控制哪種類型的互動可以產生桌面通知。",
"enable_description_desktop": "若想在鹿鳴未開啟時接收通知,請啟用推播通知功能。啟用後,你可以通过 「設定」 > 「通知」 > 「推送通知設定」 来精确控制哪种类型的互动可以产生桌面通知。",
"enable_description_mobile": "你也可以使用導覽列 「設定」 > 「通知」 > 「推通知設定」 進入設定頁面。",
"enable_description_settings": "若想在鹿鳴未開啟時接收通知,請啟用推播通知功能。 啟用後,你將能夠精確控制哪些類型的互動會在螢幕上推播通知。",
"enable_description_desktop": "若想在鹿鳴未開啟時接收通知,請啟用推播通知功能。啟用後,你可以在 「設定」 > 「通知」 > 「推播通知設定」 裡面選擇哪些互動你會接收到通知。",
"enable_description_mobile": "你也可以使用導覽列 「設定」 > 「通知」 > 「推通知設定」 進入設定頁面。",
"enable_description_settings": "若想在鹿鳴未開啟時接收通知,請啟用推播通知功能。 啟用後,你將能夠選擇哪些互動你會接收到通知。",
"enable_desktop": "啟用推播功能",
"enable_title": "不錯過任何事",
"re_auth": "您的伺服器似乎不支援推播通知。嘗試退出使用者並重新登入。如果此消息仍然出現,請聯繫您伺服器的管理員。"
@ -345,8 +345,8 @@
"github_cards": "GitHub 卡片",
"hide_boost_count": "隱藏轉發數",
"hide_favorite_count": "隱藏收藏數",
"hide_follower_count": "隱藏關注者數",
"label": "好設定",
"hide_follower_count": "隱藏粉絲數",
"label": "好設定",
"title": "實驗功能",
"user_picker": "使用者選擇器",
"virtual_scroll": "虛擬滾動"
@ -418,7 +418,7 @@
"edited": "在 {0} 編輯了"
},
"tab": {
"for_you": "推薦關注",
"for_you": "推薦追蹤",
"hashtags": "話題標籤",
"media": "媒體",
"news": "最新消息",
@ -428,10 +428,10 @@
"posts_with_replies": "貼文與留言"
},
"tag": {
"follow": "關注",
"follow_label": "關注 {0} 標籤",
"unfollow": "取消關注",
"unfollow_label": "取消關注 {0} 標籤"
"follow": "追蹤",
"follow_label": "追蹤 {0} 標籤",
"unfollow": "取消追蹤",
"unfollow_label": "取消追蹤 {0} 標籤"
},
"time_ago_options": {
"day_future": "現在|明天|{n} 天後",
@ -469,39 +469,39 @@
"view_older_posts": "其他站點上更舊的貼文可能不會在這裡顯示。"
},
"title": {
"federated_timeline": "跨站時間",
"local_timeline": "本地時間線"
"federated_timeline": "跨站時間",
"local_timeline": "本站時間軸"
},
"tooltip": {
"add_content_warning": "加入內容警告標識",
"add_content_warning": "加入貼文警告標識",
"add_emojis": "加入表情符號",
"add_media": "加入圖片、影片或音訊",
"add_publishable_content": "加入要發布的內容",
"change_content_visibility": "修改內容是否可見",
"add_publishable_content": "加入要發布的貼文",
"change_content_visibility": "修改貼文隱私狀態",
"change_language": "切換語言",
"emoji": "表情符號",
"explore_links_intro": "這些新聞故事正被本站和分式網路上其他站點的使用者談論。",
"explore_posts_intro": "來自本站和分式網路上其他站點的這些嘟文正在本站引起關注。",
"explore_tags_intro": "這些標籤正在本站和分式網路上其他站點的使用者中引起關注。",
"explore_links_intro": "這些新聞故事正被本站和分式網路上其他站點的使用者談論。",
"explore_posts_intro": "來自本站和分式網路上其他站點的這些嘟文正在本站引起關注。",
"explore_tags_intro": "這些標籤正在本站和分式網路上其他站點的使用者中引起關注。",
"toggle_code_block": "切換程式碼區塊"
},
"user": {
"add_existing": "加入現有帳",
"add_existing": "加入現有帳",
"server_address_label": "Mastodon 伺服器位置",
"sign_in_desc": "登入後可關注其他人或標籤、點讚、分享和回覆貼文,或與不同伺服器上的帳號互動。",
"sign_in_desc": "登入後可追蹤其他人或標籤、點讚、分享和回覆貼文,或與不同伺服器上的帳號互動。",
"sign_in_notice_title": "正在查看 {0} 的公共數據",
"sign_out_account": "登出 {0}",
"tip_no_account": "如果您還沒有 Mastodon 賬戶{0}。",
"tip_no_account": "如果您還沒有 Mastodon 帳號{0}。",
"tip_register_account": "選擇您的伺服器並註冊一個"
},
"visibility": {
"direct": "私訊",
"direct_desc": "僅對提及的使用者可見",
"private": "僅限關注者",
"private_desc": "僅關注者可見",
"private": "僅限粉絲",
"private_desc": "僅粉絲可見",
"public": "公開",
"public_desc": "所有人可見",
"unlisted": "不列出",
"unlisted_desc": "對所有人可見,但不出現在公共時間線上"
"public_desc": "所有人可見",
"unlisted": "不公開",
"unlisted_desc": "對所有人可見,但不出現在探索頁面裡面"
}
}

View file

@ -92,6 +92,12 @@ export const createI18n = async (): Promise<LocalizedWebManifest> => {
sizes: '512x512',
type: 'image/png',
},
{
src: 'maskable-icon.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable',
},
],
share_target: {
action: '/web-share-target',
@ -132,6 +138,12 @@ export const createI18n = async (): Promise<LocalizedWebManifest> => {
sizes: '512x512',
type: 'image/png',
},
{
src: 'maskable-icon.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable',
},
],
share_target: {
action: '/web-share-target',

View file

@ -4,6 +4,7 @@ import {
defineLazyEventHandler,
toNodeListener,
} from 'h3'
import type { FetchResponse } from 'ofetch'
import { createFetch } from 'ofetch'
import {
createCall,
@ -64,7 +65,7 @@ export default defineNuxtPlugin(async () => {
const route = useRoute()
if (route.path.startsWith('/api')) {
const result = await $fetch.raw(route.fullPath)
const result = (await ($fetch.raw as any)(route.fullPath)) as FetchResponse<unknown>
if (result.headers.get('location'))
location.href = result.headers.get('location')!
}

View file

@ -93,6 +93,7 @@ export default defineNuxtConfig({
apiToken: '',
},
public: {
privacyPolicyUrl: '',
env: '', // set in build-env module
buildInfo: {} as BuildInfo, // set in build-env module
pwaEnabled: !isDevelopment || process.env.VITE_DEV_PWA === 'true',
@ -115,6 +116,11 @@ export default defineNuxtConfig({
},
},
nitro: {
esbuild: {
options: {
target: 'esnext',
},
},
prerender: {
crawlLinks: true,
routes: ['/'],

View file

@ -1,6 +1,6 @@
{
"type": "module",
"version": "0.6.1",
"version": "0.6.2",
"private": true,
"packageManager": "pnpm@7.9.0",
"license": "MIT",
@ -20,7 +20,7 @@
"generate": "nuxi generate",
"test:unit": "stale-dep && vitest",
"test:typecheck": "stale-dep && vue-tsc --noEmit && vue-tsc --noEmit --project service-worker/tsconfig.json",
"test": "stale-dep && nr test:unit",
"test": "nr test:unit",
"update:team:avatars": "esno scripts/avatars.ts",
"postinstall": "stale-dep -u && simple-git-hooks && nuxi prepare",
"release": "stale-dep && bumpp && esno scripts/release.ts"
@ -28,7 +28,7 @@
"dependencies": {
"@fnando/sparkline": "^0.3.10",
"@iconify-emoji/twemoji": "^1.0.2",
"@iconify/utils": "^2.0.11",
"@iconify/utils": "^2.0.12",
"@tiptap/extension-character-count": "2.0.0-beta.204",
"@tiptap/extension-code-block": "2.0.0-beta.204",
"@tiptap/extension-history": "2.0.0-beta.204",
@ -39,12 +39,12 @@
"@tiptap/starter-kit": "2.0.0-beta.204",
"@tiptap/suggestion": "2.0.0-beta.204",
"@tiptap/vue-3": "2.0.0-beta.204",
"@vueuse/core": "^9.10.0",
"@vueuse/core": "^9.11.1",
"@vueuse/gesture": "2.0.0-beta.1",
"@vueuse/integrations": "^9.10.0",
"@vueuse/integrations": "^9.11.1",
"@vueuse/motion": "2.0.0-beta.12",
"blurhash": "^2.0.4",
"browser-fs-access": "^0.31.1",
"browser-fs-access": "^0.31.2",
"floating-vue": "2.0.0-beta.20",
"focus-trap": "^7.2.0",
"form-data": "^4.0.0",
@ -53,8 +53,8 @@
"iso-639-1": "^2.1.15",
"js-yaml": "^4.1.0",
"lru-cache": "^7.14.1",
"masto": "^5.5.0",
"pinia": "^2.0.28",
"masto": "^5.6.1",
"pinia": "^2.0.29",
"shiki": "^0.12.1",
"shiki-es": "^0.1.2",
"slimeform": "^0.9.0",
@ -65,49 +65,48 @@
"tippy.js": "^6.3.7",
"ufo": "^1.0.1",
"ultrahtml": "^1.2.0",
"vue-advanced-cropper": "^2.8.6",
"vue-advanced-cropper": "^2.8.8",
"vue-virtual-scroller": "2.0.0-beta.7"
},
"devDependencies": {
"@antfu/eslint-config": "^0.34.1",
"@antfu/ni": "^0.18.8",
"@emoji-mart/data": "^1.1.1",
"@iconify-json/carbon": "^1.1.13",
"@antfu/ni": "^0.19.0",
"@emoji-mart/data": "^1.1.2",
"@iconify-json/carbon": "^1.1.14",
"@iconify-json/logos": "^1.1.22",
"@iconify-json/material-symbols": "^1.1.26",
"@iconify-json/ph": "^1.1.3",
"@iconify-json/ri": "^1.1.4",
"@iconify-json/twemoji": "^1.1.10",
"@nuxtjs/color-mode": "^3.2.0",
"@nuxtjs/i18n": "^8.0.0-beta.8",
"@nuxtjs/i18n": "8.0.0-beta.9",
"@pinia/nuxt": "^0.4.6",
"@types/chroma-js": "^2.1.4",
"@types/file-saver": "^2.0.5",
"@types/fnando__sparkline": "^0.3.4",
"@types/fs-extra": "^11.0.0",
"@types/fs-extra": "^11.0.1",
"@types/js-yaml": "^4.0.5",
"@types/prettier": "^2.7.2",
"@types/wicg-file-system-access": "^2020.9.5",
"@unocss/nuxt": "^0.48.3",
"@vitejs/plugin-vue": "^3.2.0",
"@vue-macros/nuxt": "^0.2.10",
"@vueuse/math": "^9.10.0",
"@vueuse/nuxt": "^9.10.0",
"@unocss/nuxt": "^0.48.5",
"@vue-macros/nuxt": "^0.3.3",
"@vueuse/math": "^9.11.1",
"@vueuse/nuxt": "^9.11.1",
"bumpp": "^8.2.1",
"chroma-js": "^2.4.2",
"emoji-mart": "^5.4.0",
"eslint": "^8.31.0",
"emoji-mart": "^5.5.2",
"eslint": "^8.32.0",
"esno": "^0.16.3",
"file-saver": "^2.0.5",
"fs-extra": "^11.1.0",
"jsdom": "^21.0.0",
"jsdom": "^21.1.0",
"lint-staged": "^13.1.0",
"nuxt": "^3.0.0",
"nuxt-security": "^0.10.0",
"nuxt": "3.0.0",
"nuxt-security": "^0.10.1",
"postcss-nested": "^6.0.0",
"prettier": "^2.8.2",
"prettier": "^2.8.3",
"rollup-plugin-node-polyfills": "^0.2.1",
"simple-git": "^3.15.1",
"simple-git": "^3.16.0",
"simple-git-hooks": "^2.8.1",
"stale-dep": "^0.3.1",
"std-env": "^3.3.1",
@ -124,9 +123,6 @@
"workbox-window": "^6.5.4"
},
"pnpm": {
"patchedDependencies": {
"nitropack@1.0.0": "patches/nitropack@1.0.0.patch"
},
"overrides": {
"mlly": "1.1.0",
"@tiptap/extension-bubble-menu": "2.0.0-beta.204",

View file

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { CommonRouteTabOption } from '~/components/common/CommonRouteTabs.vue'
const { t } = useI18n()
const tabs = $computed(() => [
const tabs = $computed<CommonRouteTabOption[]>(() => [
{
to: isHydrated.value ? `/${currentServer.value}/explore` : '/explore',
display: isHydrated.value ? t('tab.posts') : '',
@ -20,7 +22,7 @@ const tabs = $computed(() => [
display: isHydrated.value ? t('tab.for_you') : '',
disabled: !isHydrated.value || !currentUser.value,
},
] as const)
])
</script>
<template>

55
pages/[[server]]/list.vue Normal file
View file

@ -0,0 +1,55 @@
<script setup lang="ts">
import type { CommonRouteTabOption } from '~/components/common/CommonRouteTabs.vue'
const list = $computed(() => useRoute().params.list as string)
const server = $computed(() => useRoute().params.server as string)
const { t } = useI18n()
const tabs = $computed<CommonRouteTabOption[]>(() => [
{
to: {
name: 'list',
params: { server, list },
},
display: t('tab.list'),
icon: 'i-ri:list-unordered',
},
{
to: {
name: 'list-accounts',
params: { server, list },
},
display: t('tab.accounts'),
icon: 'i-ri:user-line',
},
],
)
const { client } = $(useMasto())
const { data: listInfo, refresh } = $(await useAsyncData(() => client.v1.lists.fetch(list), { default: () => shallowRef() }))
if (listInfo) {
useHeadFixed({
title: () => `${listInfo.title}`,
})
}
onReactivated(() => {
// Silently update data when reentering the page
// The user will see the previous content first, and any changes will be updated to the UI when the request is completed
refresh()
})
</script>
<template>
<MainContent back>
<template #title>
<span text-lg font-bold>{{ listInfo ? listInfo.title : t('nav.list') }}</span>
</template>
<template #header>
<CommonRouteTabs replace :options="tabs" />
</template>
<NuxtPage v-if="isHydrated" />
</MainContent>
</template>

View file

@ -0,0 +1,35 @@
<script setup lang="ts">
definePageMeta({
name: 'list',
})
const params = useRoute().params
const listId = $(computedEager(() => params.list as string))
const { client } = $(useMasto())
const { data: listInfo, refresh } = $(await useAsyncData(() => client.v1.lists.fetch(listId), { default: () => shallowRef() }))
const paginator = client.v1.timelines.listList(listId)
const stream = useStreaming(client => client.v1.stream.streamListTimeline(listId))
if (listInfo) {
useHeadFixed({
title: () => `${listInfo.title}`,
})
}
onReactivated(() => {
// Silently update data when reentering the page
// The user will see the previous content first, and any changes will be updated to the UI when the request is completed
refresh()
})
</script>
<template>
<MainContent back>
<template #title>
<span text-lg font-bold>{{ listInfo ? listInfo.title : $t('nav.list') }}</span>
</template>
<TimelinePaginator v-bind="{ paginator, stream }" :preprocess="reorderedTimeline" context="home" />
</MainContent>
</template>

View file

@ -0,0 +1,23 @@
<script setup lang="ts">
definePageMeta({
name: 'list-accounts',
})
const params = useRoute().params
const listId = $(computedEager(() => params.list as string))
const paginator = useMastoClient().v1.lists.listAccounts(listId)
</script>
<template>
<CommonPaginator :paginator="paginator">
<template #default="{ item }">
<ListAccount
:account="item"
:list="listId"
hover-card
border="b base" py2 px4
/>
</template>
</CommonPaginator>
</template>

View file

@ -0,0 +1,17 @@
<script setup lang="ts">
definePageMeta({
name: 'list',
})
const params = useRoute().params
const listId = $(computedEager(() => params.list as string))
const { client } = $(useMasto())
const paginator = client.v1.timelines.listList(listId)
const stream = useStreaming(client => client.v1.stream.streamListTimeline(listId))
</script>
<template>
<TimelinePaginator v-bind="{ paginator, stream }" :preprocess="reorderedTimeline" context="home" />
</template>

View file

@ -0,0 +1,30 @@
<script lang="ts" setup>
const { t } = useI18n()
const { client } = $(useMasto())
const paginator = client.v1.lists.list()
useHeadFixed({
title: () => t('nav.lists'),
})
</script>
<template>
<MainContent>
<template #title>
<NuxtLink to="/lists" timeline-title-style flex items-center gap-2 @click="$scrollToTop">
<div i-ri:list-check />
<span text-lg font-bold>{{ t('nav.lists') }}</span>
</NuxtLink>
</template>
<slot>
<CommonPaginator :paginator="paginator">
<template #default="{ item }">
<NuxtLink :to="`list/${item.id}`" block p4 hover:bg-active flex justify-between>
{{ item.title }}
</NuxtLink>
</template>
</CommonPaginator>
</slot>
</MainContent>
</template>

View file

@ -1,4 +1,6 @@
<script setup lang="ts">
import type { CommonRouteTabOption } from '~/components/common/CommonRouteTabs.vue'
definePageMeta({
middleware: 'auth',
})
@ -6,7 +8,7 @@ definePageMeta({
const { t } = useI18n()
const pwaEnabled = useRuntimeConfig().public.pwaEnabled
const tabs = $computed(() => [
const tabs = $computed<CommonRouteTabOption[]>(() => [
{
name: 'all',
to: '/notifications',
@ -17,7 +19,7 @@ const tabs = $computed(() => [
to: '/notifications/mention',
display: isHydrated.value ? t('tab.notifications_mention') : '',
},
] as const)
])
</script>
<template>

View file

@ -27,6 +27,12 @@ const userSettings = useUserSettings()
>
{{ $t('settings.preferences.hide_favorite_count') }}
</SettingsToggleItem>
<SettingsToggleItem
:checked="getPreferences(userSettings, 'hideReplyCount')"
@click="togglePreferences('hideReplyCount')"
>
{{ $t('settings.preferences.hide_reply_count') }}
</SettingsToggleItem>
<SettingsToggleItem
:checked="getPreferences(userSettings, 'hideFollowerCount')"
@click="togglePreferences('hideFollowerCount')"
@ -39,6 +45,12 @@ const userSettings = useUserSettings()
>
{{ $t('settings.preferences.hide_translation') }}
</SettingsToggleItem>
<SettingsToggleItem
:checked="getPreferences(userSettings, 'hideAccountHoverCard')"
@click="togglePreferences('hideAccountHoverCard')"
>
{{ $t('settings.preferences.hide_account_hover_card') }}
</SettingsToggleItem>
<SettingsToggleItem
:checked="getPreferences(userSettings, 'grayscaleMode')"
@click="togglePreferences('grayscaleMode')"

0
patches/.gitkeep Normal file
View file

View file

@ -1,13 +0,0 @@
diff --git a/dist/shared/nitro.c8278d90.mjs b/dist/shared/nitro.c8278d90.mjs
index 9ba312fc248da3731720ee7e3b38ba2a85537657..5ec9f06ccf60259820586715d73d41466daa8cff 100644
--- a/dist/shared/nitro.c8278d90.mjs
+++ b/dist/shared/nitro.c8278d90.mjs
@@ -1296,7 +1296,7 @@ async function copyPublicAssets(nitro) {
if (nitro.options.noPublicDir) {
return;
}
- for (const asset of nitro.options.publicAssets) {
+ for (const asset of [...nitro.options.publicAssets].reverse()) {
if (await isDirectory(asset.dir)) {
await fse.copy(asset.dir, join(nitro.options.output.publicDir, asset.baseURL));
}

View file

@ -1,9 +1,12 @@
import { useRegisterSW } from 'virtual:pwa-register/vue'
import { STORAGE_KEY_PWA_HIDE_INSTALL } from '~/constants'
export default defineNuxtPlugin(() => {
const online = useOnline()
const registrationError = ref(false)
const swActivated = ref(false)
const showInstallPrompt = ref(false)
const hideInstall = useLocalStorage(STORAGE_KEY_PWA_HIDE_INSTALL, false)
// https://thomashunter.name/posts/2021-12-11-detecting-if-pwa-twa-is-installed
const ua = navigator.userAgent
@ -57,10 +60,55 @@ export default defineNuxtPlugin(() => {
needRefresh.value = false
}
let install: () => Promise<void> = () => Promise.resolve()
let cancelInstall: () => void = noop
if (!hideInstall.value) {
type InstallPromptEvent = Event & {
prompt: () => void
userChoice: Promise<{ outcome: 'dismissed' | 'accepted' }>
}
let deferredPrompt: InstallPromptEvent | undefined
const beforeInstallPrompt = (e: Event) => {
e.preventDefault()
deferredPrompt = e as InstallPromptEvent
showInstallPrompt.value = true
}
window.addEventListener('beforeinstallprompt', beforeInstallPrompt)
window.addEventListener('appinstalled', () => {
deferredPrompt = undefined
showInstallPrompt.value = false
})
cancelInstall = () => {
deferredPrompt = undefined
showInstallPrompt.value = false
window.removeEventListener('beforeinstallprompt', beforeInstallPrompt)
hideInstall.value = true
}
install = async () => {
if (!showInstallPrompt.value || !deferredPrompt) {
showInstallPrompt.value = false
return
}
showInstallPrompt.value = false
await nextTick()
deferredPrompt.prompt()
await deferredPrompt.userChoice
}
}
return {
provide: {
pwa: reactive({
isInstalled,
showInstallPrompt,
cancelInstall,
install,
swActivated,
registrationError,
needRefresh,

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
public/maskable-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View file

@ -21,7 +21,7 @@ export const onShareTarget = (event: FetchEvent) => {
}
async function handleSharedTarget(event: FetchEvent) {
event.respondWith(Response.redirect('/home?share-target=true'))
event.respondWith(Response.redirect('/home?share-target=true', 303))
await waitForClientToGetReady(event.resultingClientId)
const [client, formData] = await getClientAndFormData(event)

View file

@ -270,7 +270,8 @@ async function render(content: string, options?: ContentParseOptions) {
}
// mocks
vi.mock('vue-router', () => {
vi.mock('vue-router', async () => {
const { defineComponent, h } = await import('vue')
return {
RouterLink: defineComponent((attrs) => {
return () => h('a', attrs)
@ -286,7 +287,8 @@ vi.mock('shiki-es', async (importOriginal) => {
}
})
vi.mock('~/components/content/ContentMentionGroup.vue', () => {
vi.mock('~/components/content/ContentMentionGroup.vue', async () => {
const { defineComponent, h } = await import('vue')
return {
default: defineComponent({
setup(props, { slots }) {
@ -296,7 +298,8 @@ vi.mock('~/components/content/ContentMentionGroup.vue', () => {
}
})
vi.mock('~/components/account/AccountHoverWrapper.vue', () => {
vi.mock('~/components/account/AccountHoverWrapper.vue', async () => {
const { defineComponent } = await import('vue')
return {
default: defineComponent({
props: ['handle', 'class'],

View file

@ -1,6 +1,13 @@
export function matchLanguages(languages: string[], acceptLanguages: readonly string[]): string | null {
{
const lang = acceptLanguages.map(userLang => languages.find(lang => lang.startsWith(userLang))).filter(v => !!v)[0]
// const lang = acceptLanguages.map(userLang => languages.find(lang => lang.startsWith(userLang))).filter(v => !!v)[0]
// TODO: Support es-419, remove this code if we include spanish country variants
const lang = acceptLanguages.map(userLang => languages.find((lang) => {
if (userLang.startsWith('es-') && userLang !== 'es-ES')
return lang === 'es-419'
return lang.startsWith(userLang)
})).filter(v => !!v)[0]
if (lang)
return lang
}