1
0

Merge branch 'main' into 1931-filter-for-home-timeline

This commit is contained in:
Shinigami 2023-04-25 21:19:19 +02:00 committed by GitHub
commit 0495b115e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
88 changed files with 2117 additions and 919 deletions

View File

@ -103,7 +103,7 @@ If you are updating a translation in your local environment, you can run the fol
### Adding a new language
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.
2. Copy [en](./locales/en.json) and translate the strings.
3. Add the language to the `locales` array in [config/i18n.ts](./config/i18n.ts#L61), below `en` and `ar`:
- If your language has 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#L12)

View File

@ -81,6 +81,8 @@ watchEffect(() => {
iconFields.value = icons
})
const personalNoteDraft = ref(relationship?.note ?? '')
async function editNote(event: Event) {
if (!event.target || !('value' in event.target) || !relationship)
return
@ -92,10 +94,13 @@ async function editNote(event: Event) {
const newNoteApiResult = await client.v1.accounts.createNote(account.id, { comment: newNote })
relationship.note = newNoteApiResult.note
personalNoteDraft.value = relationship.note ?? ''
}
const isSelf = $(useSelfAccount(() => account))
const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
const personalNoteMaxLength = 2000
</script>
<template>
@ -124,7 +129,7 @@ const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
<AccountMoreButton
:account="account" :command="command"
@add-note="isEditingPersonalNote = true"
@remove-note="isEditingPersonalNote = false"
@remove-note="() => { isEditingPersonalNote = false; personalNoteDraft = '' }"
/>
<CommonTooltip v-if="!isSelf && relationship?.following" :content="getNotificationIconTitle()">
<button
@ -160,7 +165,7 @@ const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
<AccountDisplayName :account="account" font-bold sm:text-2xl text-xl />
<AccountBotIndicator v-if="account.bot" show-label />
</div>
<AccountHandle :account="account" />
<AccountHandle :account="account" overflow-unset line-clamp-unset />
</div>
</div>
<label
@ -175,21 +180,41 @@ const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
<p font-medium>
{{ $t('account.profile_personal_note') }}
</p>
<p text-secondary text-sm :class="{ 'text-orange': personalNoteDraft.length > (personalNoteMaxLength - 100) }">
{{ personalNoteDraft.length }} / {{ personalNoteMaxLength }}
</p>
</div>
<div position-relative>
<div
input-base
min-h-10ex
whitespace-pre-wrap
opacity-0
:class="{ 'trailing-newline': personalNoteDraft.endsWith('\n') }"
>
{{ personalNoteDraft }}
</div>
<textarea
v-model="personalNoteDraft"
input-base
position-absolute
style="height: 100%"
top-0
resize-none
:maxlength="personalNoteMaxLength"
@change="editNote"
/>
</div>
<textarea
input-base
:value="relationship?.note ?? ''"
@change="editNote"
/>
</label>
<div v-if="account.note" max-h-100 overflow-y-auto>
<ContentRich text-4 text-base :content="account.note" :emojis="account.emojis" />
</div>
<div v-if="namedFields.length" flex="~ col wrap gap1">
<div v-for="field in namedFields" :key="field.name" flex="~ gap-1" items-center>
<div text-secondary uppercase text-xs font-bold>
{{ field.name }} |
<div mt="0.5" text-secondary uppercase text-xs font-bold>
<ContentRich :content="field.name" :emojis="account.emojis" />
</div>
<span text-secondary text-xs font-bold>|</span>
<ContentRich :content="field.value" :emojis="account.emojis" />
</div>
</div>
@ -205,3 +230,9 @@ const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
</div>
</div>
</template>
<style>
.trailing-newline::after {
content: '\a';
}
</style>

View File

@ -19,6 +19,6 @@ const relationship = $(useRelationship(account))
<div v-if="account.note" max-h-100 overflow-y-auto>
<ContentRich text-4 text-secondary :content="account.note" :emojis="account.emojis" />
</div>
<AccountPostsFollowers text-sm :account="account" />
<AccountPostsFollowers text-sm :account="account" :is-hover-card="true" />
</div>
</template>

View File

@ -3,6 +3,7 @@ import type { mastodon } from 'masto'
defineProps<{
account: mastodon.v1.Account
isHoverCard?: boolean
}>()
const userSettings = useUserSettings()
@ -26,33 +27,37 @@ const userSettings = useUserSettings()
</template>
</NuxtLink>
<NuxtLink
v-if="!getPreferences(userSettings, 'hideFollowerCount')"
v-if="!(isHoverCard && getPreferences(userSettings, 'hideFollowerCount'))"
:to="getAccountFollowingRoute(account)"
replace
text-secondary exact-active-class="text-primary"
>
<template #default="{ isExactActive }">
<CommonLocalizedNumber
v-if="!getPreferences(userSettings, 'hideFollowerCount')"
keypath="account.following_count"
:count="account.followingCount"
font-bold
:class="isExactActive ? 'text-primary' : 'text-base'"
/>
<span v-else>{{ $t('account.following') }}</span>
</template>
</NuxtLink>
<NuxtLink
v-if="!getPreferences(userSettings, 'hideFollowerCount')"
v-if="!(isHoverCard && getPreferences(userSettings, 'hideFollowerCount'))"
:to="getAccountFollowersRoute(account)"
replace text-secondary
exact-active-class="text-primary"
>
<template #default="{ isExactActive }">
<CommonLocalizedNumber
v-if="!getPreferences(userSettings, 'hideFollowerCount')"
keypath="account.followers_count"
:count="account.followersCount"
font-bold
:class="isExactActive ? 'text-primary' : 'text-base'"
/>
<span v-else>{{ $t('account.followers') }}</span>
</template>
</NuxtLink>
</div>

View File

@ -66,10 +66,6 @@ const shortcutItemGroups: ShortcutItemGroup[] = [
description: t('magic_keys.groups.actions.boost'),
shortcut: { keys: ['b'], isSequence: false },
},
{
description: t('magic_keys.groups.actions.zen_mode'),
shortcut: { keys: ['z'], isSequence: false },
},
],
},
{

View File

@ -8,12 +8,23 @@ defineProps<{
noOverflowHidden?: boolean
}>()
const container = ref()
const route = useRoute()
const { height: windowHeight } = useWindowSize()
const { height: containerHeight } = useElementBounding(container)
const wideLayout = computed(() => route.meta.wideLayout ?? false)
const sticky = computed(() => route.path?.startsWith('/settings/'))
const containerClass = computed(() => {
// we keep original behavior when not in settings page and when the window height is smaller than the container height
if (!isHydrated.value || !sticky.value || (windowHeight.value < containerHeight.value))
return null
return 'lg:sticky lg:top-0'
})
</script>
<template>
<div>
<div ref="container" :class="containerClass">
<div
sticky top-0 z10 backdrop-blur
pt="[env(safe-area-inset-top,0)]"

View File

@ -93,9 +93,9 @@ onBeforeUnmount(() => {
transition-colors duration-200 transform
hover="bg-gray-100 dark:(bg-gray-700 text-white)"
:aria-label="$t('nav.zen_mode')"
@click="userSettings.zenMode = !userSettings.zenMode"
@click="togglePreferences('zenMode')"
>
<span :class="userSettings.zenMode ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line'" class="flex-shrink-0 text-xl me-4 !align-middle" />
<span :class="getPreferences(userSettings, 'zenMode') ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line'" class="flex-shrink-0 text-xl me-4 !align-middle" />
{{ $t('nav.zen_mode') }}
</button>
</div>

View File

@ -23,9 +23,9 @@ function toggleDark() {
<button
flex
text-lg
:class="userSettings.zenMode ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line'"
:class="getPreferences(userSettings, 'zenMode') ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line'"
:aria-label="$t('nav.zen_mode')"
@click="userSettings.zenMode = !userSettings.zenMode"
@click="togglePreferences('zenMode')"
/>
</CommonTooltip>
<CommonTooltip :content="$t('settings.about.sponsor_action')">

View File

@ -29,7 +29,7 @@ router.afterEach(() => {
@click.prevent="onClickLogo"
>
<NavLogo shrink-0 aspect="1/1" sm:h-8 xl:h-10 class="rtl-flip" />
<div hidden xl:block text-secondary>
<div v-show="isHydrated" hidden xl:block text-secondary>
{{ $t('app_name') }} <sup text-sm italic mt-1>{{ env === 'release' ? 'alpha' : env }}</sup>
</div>
</NuxtLink>

View File

@ -75,7 +75,12 @@ function groupItems(items: mastodon.v1.Notification[]): NotificationSlot[] {
}
return
}
else if (group.length && group[0].status && (group[0].type === 'reblog' || group[0].type === 'favourite')) {
else if (group.length && (group[0].type === 'reblog' || group[0].type === 'favourite')) {
if (!group[0].status) {
// Ignore favourite or reblog if status is null, sometimes the API is sending these
// notifications
return
}
// All notifications in these group are reblogs or favourites of the same status
const likes: GroupedAccountLike[] = []
for (const notification of group) {

View File

@ -64,7 +64,7 @@ function activate() {
<template>
<div ref="el" relative group>
<div bg-base border="~ base" h10 px-4 rounded-3 flex="~ row" items-center relative focus-within:box-shadow-outline gap-3>
<div bg-base border="~ base" h10 ps-4 pe-1 rounded-3 flex="~ row" items-center relative focus-within:box-shadow-outline>
<div i-ri:search-2-line pointer-events-none text-secondary mt="1px" class="rtl-flip" />
<input
ref="input"
@ -74,7 +74,8 @@ function activate() {
w-full
bg-transparent
outline="focus:none"
pe-4
ps-3
pe-1
ml-1
:placeholder="isHydrated ? t('nav.search') : ''"
pb="1px"
@ -83,6 +84,9 @@ function activate() {
@keydown.up.prevent="shift(-1)"
@keypress.enter="activate"
>
<button v-if="query.length" btn-action-icon text-secondary @click="query = ''; input?.focus()">
<span aria-hidden="true" class="i-ri:close-line" />
</button>
</div>
<!-- Results -->
<div left-0 top-11 absolute w-full z10 group-focus-within="pointer-events-auto visible" invisible pointer-events-none>

View File

@ -125,7 +125,7 @@ function showFavoritedAndBoostedBy() {
<template #popper>
<div flex="~ col">
<template v-if="userSettings.zenMode">
<template v-if="getPreferences(userSettings, 'zenMode')">
<CommonDropdownItem
:text="$t('action.reply')"
icon="i-ri:chat-1-line"

View File

@ -65,6 +65,8 @@ const isDM = $computed(() => status.visibility === 'direct')
const showUpperBorder = $computed(() => props.newer && !directReply)
const showReplyTo = $computed(() => !replyToMain && !directReply)
const forceShow = ref(false)
</script>
<template>
@ -114,60 +116,75 @@ const showReplyTo = $computed(() => !replyToMain && !directReply)
</slot>
<div flex gap-3 :class="{ 'text-secondary': inNotification }">
<!-- Avatar -->
<div relative>
<div v-if="collapseRebloggedBy" absolute flex items-center justify-center top--6px px-2px py-3px rounded-full bg-base>
<div i-ri:repeat-fill text-green w-16px h-16px />
<template v-if="status.account.suspended && !forceShow">
<div flex="~col 1" min-w-0>
<p italic>
{{ $t('status.account.suspended_message') }}
</p>
<div>
<button p-0 flex="~ center" gap-2 text-sm btn-text @click="forceShow = true">
<div i-ri:eye-line />
<span>{{ $t('status.account.suspended_show') }}</span>
</button>
</div>
</div>
<AccountHoverWrapper :account="status.account">
<NuxtLink :to="getAccountRoute(status.account)" rounded-full>
<AccountBigAvatar :account="status.account" />
</NuxtLink>
</AccountHoverWrapper>
<div v-if="connectReply" w-full h-full flex mt--3px justify-center>
<div w-1px border="x base" />
</div>
</div>
<!-- Main -->
<div flex="~ col 1" min-w-0>
<!-- Account Info -->
<div flex items-center space-x-1>
</template>
<template v-else>
<!-- Avatar -->
<div relative>
<div v-if="collapseRebloggedBy" absolute flex items-center justify-center top--6px px-2px py-3px rounded-full bg-base>
<div i-ri:repeat-fill text-green w-16px h-16px />
</div>
<AccountHoverWrapper :account="status.account">
<StatusAccountDetails :account="status.account" />
<NuxtLink :to="getAccountRoute(status.account)" rounded-full>
<AccountBigAvatar :account="status.account" />
</NuxtLink>
</AccountHoverWrapper>
<div flex-auto />
<div v-show="!userSettings.zenMode" text-sm text-secondary flex="~ row nowrap" hover:underline whitespace-nowrap>
<AccountBotIndicator v-if="status.account.bot" me-2 />
<div flex="~ gap1" items-center>
<StatusVisibilityIndicator v-if="status.visibility !== 'public'" :status="status" />
<div flex>
<CommonTooltip :content="createdAt">
<NuxtLink :title="status.createdAt" :href="statusRoute.href" @click.prevent="go($event)">
<time text-sm ws-nowrap hover:underline :datetime="status.createdAt">
{{ timeago }}
</time>
</NuxtLink>
</CommonTooltip>
<StatusEditIndicator :status="status" inline />
<div v-if="connectReply" w-full h-full flex mt--3px justify-center>
<div w-1px border="x base" />
</div>
</div>
<!-- Main -->
<div flex="~ col 1" min-w-0>
<!-- Account Info -->
<div flex items-center space-x-1>
<AccountHoverWrapper :account="status.account">
<StatusAccountDetails :account="status.account" />
</AccountHoverWrapper>
<div flex-auto />
<div v-show="!getPreferences(userSettings, 'zenMode')" text-sm text-secondary flex="~ row nowrap" hover:underline whitespace-nowrap>
<AccountBotIndicator v-if="status.account.bot" me-2 />
<div flex="~ gap1" items-center>
<StatusVisibilityIndicator v-if="status.visibility !== 'public'" :status="status" />
<div flex>
<CommonTooltip :content="createdAt">
<NuxtLink :title="status.createdAt" :href="statusRoute.href" @click.prevent="go($event)">
<time text-sm ws-nowrap hover:underline :datetime="status.createdAt">
{{ timeago }}
</time>
</NuxtLink>
</CommonTooltip>
<StatusEditIndicator :status="status" inline />
</div>
</div>
</div>
<StatusActionsMore v-if="actions !== false" :status="status" me--2 />
</div>
<StatusActionsMore v-if="actions !== false" :status="status" me--2 />
</div>
<!-- Content -->
<StatusContent
:status="status"
:newer="newer"
:context="context"
:is-preview="isPreview"
:in-notification="inNotification"
mb2 :class="{ 'mt-2 mb1': isDM }"
/>
<StatusActions v-if="actions !== false" v-show="!userSettings.zenMode" :status="status" />
</div>
<!-- Content -->
<StatusContent
:status="status"
:newer="newer"
:context="context"
:is-preview="isPreview"
:in-notification="inNotification"
mb2 :class="{ 'mt-2 mb1': isDM }"
/>
<StatusActions v-if="actions !== false" v-show="!getPreferences(userSettings, 'zenMode')" :status="status" />
</div>
</template>
</div>
</StatusLink>
</template>

View File

@ -20,7 +20,7 @@ const createdAt = useFormattedDateTime(status.createdAt)
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${getDisplayName(status.account)} ${t('common.in')} ${t('app_name')}: "${removeHTMLTags(status.content) || ''}"`,
})
</script>

View File

@ -274,10 +274,10 @@ export function provideGlobalCommands() {
scope: 'Preferences',
name: () => t('command.toggle_zen_mode'),
icon: () => userSettings.value.zenMode ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line',
icon: () => userSettings.value.preferences.zenMode ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line',
onActivate() {
userSettings.value.zenMode = !userSettings.value.zenMode
togglePreferences('zenMode')
},
})

View File

@ -145,7 +145,6 @@ export function convertMastodonHTML(html: string, customEmojis: Record<string, m
const tree = parseMastodonHTML(html, {
emojis: customEmojis,
markdown: true,
replaceUnicodeEmoji: false,
convertMentionLink: true,
})
return render(tree)

View File

@ -66,6 +66,9 @@ function nodeToVNode(node: Node): VNode | string | null {
function treeToVNode(
input: Node,
): VNode | string | null {
if (!input)
return null
if (input.type === TEXT_NODE)
return decode(input.value)

View File

@ -1,6 +1,6 @@
import type { mastodon } from 'masto'
export const UserLinkRE = /^https?:\/\/([^/]+)\/@([^/]+)$/
export const UserLinkRE = /^(?:https:\/)?\/([^/]+)\/@([^/]+)$/
export const TagLinkRE = /^https?:\/\/([^/]+)\/tags\/([^/]+)$/
export const HTMLTagRE = /<[^>]+>/g

View File

@ -20,6 +20,7 @@ export interface PreferencesSettings {
enableAutoplay: boolean
enableDataSaving: boolean
enablePinchToZoom: boolean
zenMode: boolean
experimentalVirtualScroller: boolean
experimentalGitHubCards: boolean
experimentalUserPicker: boolean
@ -31,7 +32,6 @@ export interface UserSettings {
fontSize: FontSize
language: string
disabledTranslationLanguages: string[]
zenMode: boolean
themeColors?: ThemeColors
}
@ -65,16 +65,6 @@ export function getDefaultLanguage(languages: string[]) {
return matchLanguages(languages, navigator.languages) || 'en-US'
}
export function getDefaultUserSettings(locales: string[]): UserSettings {
return {
language: getDefaultLanguage(locales),
fontSize: DEFAULT_FONT_SIZE,
disabledTranslationLanguages: [],
zenMode: false,
preferences: {},
}
}
export const DEFAULT__PREFERENCES_SETTINGS: PreferencesSettings = {
hideAltIndicatorOnPosts: false,
hideBoostCount: false,
@ -88,7 +78,17 @@ export const DEFAULT__PREFERENCES_SETTINGS: PreferencesSettings = {
enableAutoplay: true,
enableDataSaving: false,
enablePinchToZoom: false,
zenMode: false,
experimentalVirtualScroller: true,
experimentalGitHubCards: true,
experimentalUserPicker: true,
}
export function getDefaultUserSettings(locales: string[]): UserSettings {
return {
language: getDefaultLanguage(locales),
fontSize: DEFAULT_FONT_SIZE,
disabledTranslationLanguages: [],
preferences: DEFAULT__PREFERENCES_SETTINGS,
}
}

View File

@ -12,7 +12,7 @@ export function setupPageHeader() {
return acc
}, {} as Record<string, Directions>)
useHead({
useHydratedHead({
htmlAttrs: {
lang: () => locale.value,
dir: () => localeMap[locale.value] ?? 'ltr',
@ -22,7 +22,7 @@ export function setupPageHeader() {
name: 'viewport',
content: () => `width=device-width,initial-scale=1${enablePinchToZoom.value ? '' : ',maximum-scale=1,user-scalable=0'},viewport-fit=cover`,
}],
titleTemplate: (title) => {
titleTemplate: (title?: string) => {
let titleTemplate = title ?? ''
if (titleTemplate.match(/&[a-z0-9#]+;/gi)) {

View File

@ -1,5 +1,7 @@
import type { ComponentInternalInstance } from 'vue'
import { onActivated, onDeactivated, ref } from 'vue'
import type { ActiveHeadEntry, HeadEntryOptions, UseHeadInput } from '@unhead/vue'
import type { SchemaAugmentations } from '@unhead/schema'
export const isHydrated = ref(false)
@ -34,3 +36,25 @@ export function onReactivated(hook: Function, target?: ComponentInternalInstance
}, target)
onDeactivated(() => initial.value = false)
}
export function useHydratedHead<T extends SchemaAugmentations>(input: UseHeadInput<T>, options?: HeadEntryOptions): ActiveHeadEntry<UseHeadInput<T>> | void {
if (input && typeof input === 'object' && !('value' in input)) {
const title = 'title' in input ? input.title : undefined
if (process.server && title) {
input.meta = input.meta || []
if (Array.isArray(input.meta)) {
input.meta.push(
{ property: 'og:title', content: (typeof input.title === 'function' ? input.title() : input.title) as string },
)
}
}
else if (title) {
(input as any).title = () => isHydrated.value ? typeof title === 'function' ? title() : title : ''
}
}
return useHead(() => {
if (!isHydrated.value)
return {}
return resolveUnref(input)
}, options)
}

View File

@ -189,6 +189,16 @@ const locales: LocaleObjectData[] = [
file: 'gl-ES.json',
name: 'Galego',
},
{
code: 'ko-KR',
file: 'ko-KR.json',
name: '한국어',
},
{
code: 'it-IT',
file: 'it-IT.json',
name: 'Italiano',
},
]
function buildLocales() {

View File

@ -13,6 +13,6 @@
},
"devDependencies": {
"@nuxt-themes/docus": "^1.10.1",
"nuxt": "^3.4.0"
"nuxt": "^3.4.2"
}
}

View File

@ -34,7 +34,9 @@
"posts": "المنشورات",
"posts_count": "{0} منشورات|{0} منشور|{0} منشورين|{0} منشورات|{0} منشور|{0} منشور",
"profile_description": "{0} رأسية حساب",
"profile_personal_note": "ملاحظة شخصية",
"profile_unavailable": "حساب غير متوفر",
"request_follow": "طلب متابعة",
"unblock": "إلغاء حظر",
"unfollow": "إلغاء متابعة",
"unmute": "إلغاء كتم",
@ -68,6 +70,7 @@
"save": "حفظ",
"save_changes": "حفظ التغييرات",
"sign_in": "تسجيل الدخول",
"sign_in_to": "سجّل الدخول إلى {0}",
"switch_account": "تغيير الحساب",
"vote": "تصويت"
},
@ -91,13 +94,9 @@
"toggle_zen_mode": "تبديل الوضع الهادئ"
},
"common": {
"confirm_dialog": {
"cancel": "لا",
"confirm": "نعم",
"title": "هل أنت متأكد؟"
},
"end_of_list": "نهاية القائمة",
"error": "حدث خطأ",
"fetching": "في عملية الجلب ...",
"in": "في",
"not_found": "404 غير موجود",
"offline_desc": "يبدو أنك غير متصل بالإنترنت. يرجى التحقق من اتصالك."
@ -121,6 +120,11 @@
"cancel": "لا",
"confirm": "نعم"
},
"delete_list": {
"cancel": "إلغاء",
"confirm": "حذف",
"title": "هل أنت متأكد أنك تريد حذف القائمة \"{0}\"؟"
},
"delete_posts": {
"cancel": "إلغاء",
"confirm": "حذف",
@ -174,6 +178,7 @@
"desc_para4": "قبل ذلك ، إذا كنت ترغب في المساعدة في الاختبار أو تقديم التعليقات أو المساهمة ،",
"desc_para5": "تواصل معنا على GitHub",
"desc_para6": "و شارك معنا",
"footer_team": "فريق Elk",
"title": "Elk في عرض مسبق"
},
"language": {
@ -181,21 +186,53 @@
},
"list": {
"add_account": "إضافة حساب إلى القائمة",
"cancel_edit": "إلغاء التعديل",
"clear_error": "امسح الخطأ",
"create": "إخلق",
"delete": "احذف هذه القائمة",
"delete_error": "حدث خطأ أثناء حذف القائمة",
"edit": "قم بتعديل هذه القائمة",
"edit_error": "حدث خطأ أثناء تحديث القائمة",
"error": "حدث خطأ أثناء إنشاء القائمة",
"error_prefix": "خطأ: ",
"list_title_placeholder": "عنوان القائمة",
"modify_account": "تعديل القوائم مع الحساب",
"remove_account": "إزالة الحساب من القائمة"
"remove_account": "إزالة الحساب من القائمة",
"save": "احفظ التغييرات"
},
"magic_keys": {
"dialog_header": "اختصارات لوحة المفاتيح",
"groups": {
"actions": {
"boost": "إعادة نشر",
"command_mode": "Command mode",
"compose": "منشور جديد",
"favourite": "إعجاب",
"title": "أجراءات",
"zen_mode": "وضع Zen"
},
"media": {
"title": "الوسائل الرقمية"
},
"navigation": {
"go_to_home": "الرئيسيّة",
"go_to_notifications": "التنبيهات",
"next_status": "الوضع التالي",
"previous_status": "الوضع السابق",
"shortcut_help": "مساعدة الاختصار",
"title": "ملاحة"
}
},
"sequence_then": "ثم"
},
"menu": {
"add_personal_note": "إضافة ملاحظة شخصية إلى {0}",
"block_account": "حظر {0}",
"block_domain": "حظر المجال {0}",
"copy_link_to_post": "انسخ الرابط إلى هذا المنشور",
"copy_original_link_to_post": "انسخ الرابط الأصلي لهذا المنشور",
"delete": "حذف",
"delete_and_redraft": "حذف وإعادة صياغة",
"delete_confirm": {
"cancel": "إلغاء",
"confirm": "حذف",
"title": "هل أنت متأكد أنك تريد حذف هذا المنشور؟"
},
"direct_message_account": "إرسال رسالة مباشرة إلى {0}",
"edit": "تعديل",
"hide_reblogs": "إخفاء المشاركات من {0}",
@ -204,6 +241,7 @@
"mute_conversation": "تجاهل هذا المنصب",
"open_in_original_site": "فتح في الموقع الأصلي",
"pin_on_profile": "تثبيت على حسابك الشخصي",
"remove_personal_note": "إزالة الملاحظة الشخصية من {0}",
"share_post": "شارك هذا المنشور",
"show_favourited_and_boosted_by": "أظهر من فضل وشارك",
"show_reblogs": "عرض المشاركات من {0}",
@ -219,6 +257,9 @@
"unmute_conversation": "إلغاء كتم المحادثة",
"unpin_on_profile": "إلغاء التثبيت من الملف الشخصي"
},
"modals": {
"aria_label_close": "أغلق"
},
"nav": {
"back": "العودة",
"blocked_domains": "المجالات المحظورة",
@ -300,6 +341,7 @@
},
"settings": {
"about": {
"built_at": "تم التحديث في",
"label": "حول Elk",
"meet_the_team": "تعرف على فريقنا",
"sponsor_action": "تمويل Elk",
@ -314,12 +356,6 @@
"description": "قم بتحرير إعدادات حسابك في موقع ماستودون الأصل",
"label": "إعدادت الحساب"
},
"feature_flags": {
"github_cards": "بطاقات GitHub",
"title": "الميزات التجريبية",
"user_picker": "الشريط الجانبي لمبدل المستخدم",
"virtual_scroll": "التمرير الافتراضي"
},
"interface": {
"color_mode": "وضع اللون",
"dark_mode": "الوضع الداكن",
@ -332,7 +368,15 @@
},
"language": {
"display_language": "اللغة المعروضة",
"label": "اللغة"
"label": "اللغة",
"status": "حالة الترجمة: {0} / {1} ({2}٪)",
"translations": {
"add": "إضافة",
"choose_language": "اختر اللغة",
"heading": "الترجمات",
"hide_specific": "إخفاء ترجمات محددة",
"remove": "إزالة"
}
},
"notifications": {
"label": "التنبيهات",
@ -361,10 +405,14 @@
"save_settings": "حفظ التغييرات الإعدادات",
"subscription_error": {
"clear_error": "خطأ في المسح",
"error_hint": "يمكنك الرجوع إلى قائمة الأسئلة الشائعة لمحاولة حل المشكلة: {0}.",
"invalid_vapid_key": "يبدو أن المفتاح العام VAPID غير صالح.",
"permission_denied": "تم رفض الإذن: قم بتمكين التنبيهات في متصفحك.",
"repo_link": "Elk's repository in GitHub",
"request_error": "حدث خطأ أثناء طلب الاشتراك ، حاول مرة أخرى وإذا استمر الخطأ ، يرجى إبلاغ Elk بالمشكلة.",
"title": "الاشتراك في التنبيهات غير ناجح",
"too_many_registrations": "بسبب القيود في المتصفح ، لا يمكن لـ Elk استخدام خدمة التنبيهات الفورية لعدة حسابات على خوادم مختلفة. يجب عليك إلغاء الاشتراك في التنبيهات الفورية على حسابات أخرى والمحاولة مرة أخرى."
"too_many_registrations": "بسبب القيود في المتصفح ، لا يمكن لـ Elk استخدام خدمة التنبيهات الفورية لعدة حسابات على خوادم مختلفة. يجب عليك إلغاء الاشتراك في التنبيهات الفورية على حسابات أخرى والمحاولة مرة أخرى.",
"vapid_not_supported": "يدعم المستعرض الخاص بك إعلامات Web Push ، ولكن لا يبدو أنه يقوم بتنفيذ بروتوكول VAPID."
},
"title": "إعدادات التنبيهات",
"undo_settings": "تراجع عن تغييرات الإعدادات",
@ -381,23 +429,31 @@
"re_auth": "يبدو أن الخادم الخاص بك لا يدعم دفع التنبيهات. حاول تسجيل الخروج ثم تسجيل الدخول مرة أخرى ، إذا استمرت هذه الرسالة في الظهور ، فاتصل بمسؤول الخادم."
}
},
"show_btn": "انتقل إلى إعدادات التنبيهات"
"show_btn": "انتقل إلى إعدادات التنبيهات",
"under_construction": "تحت التطوير"
},
"notifications_settings": "التنبيهات",
"preferences": {
"enable_autoplay": "تفعيل التشغيل التلقائي",
"enable_data_saving": "قم بتمكين توفير البيانات",
"enable_data_saving_description": "حفظ البيانات عن طريق منع المرفقات من التحميل تلقائيا.",
"enable_pinch_to_zoom": "تمكين القرص للتكبير",
"github_cards": "بطاقات GitHub",
"grayscale_mode": "مظهر رمادي",
"hide_account_hover_card": "إخفاء بطاقة الحساب عند المرور فوقها",
"hide_alt_indi_on_posts": "إخفاء مؤشر النص البديل على المشاركات",
"hide_boost_count": "إخفاء عدد التعزيز",
"hide_favorite_count": "إخفاء التعداد المفضل",
"hide_follower_count": "إخفاء عدد المتابعين",
"hide_reply_count": "إخفاء عدد الردود",
"hide_translation": "إخفاء الترجمة",
"hide_username_emojis": "إخفاء الرموز التعبيرية في أسماء المستخدمين",
"hide_username_emojis_description": "يخفي الرموز التعبيرية من أسماء المستخدمين في الجداول الزمنية. ستظل الرموز التعبيرية مرئية في ملفاتهم الشخصية.",
"label": "التفضيلات",
"title": "الميزات التجريبية",
"user_picker": "منتقي الحسابات",
"virtual_scroll": "التمرير الافتراضي"
"virtual_scroll": "التمرير الافتراضي",
"wellbeing": "السلامة"
},
"profile": {
"appearance": {
@ -407,6 +463,8 @@
"label": "المظهر",
"profile_metadata": "البيانات الوصفية للملف الشخصي",
"profile_metadata_desc": "يمكن أن يكون لديك ما يصل إلى {0} من العناصر المعروضة كجدول في ملفك الشخصي",
"profile_metadata_label": "ملصق",
"profile_metadata_value": "محتوى",
"title": "تعديل الملف الشخصي"
},
"featured_tags": {
@ -439,6 +497,10 @@
"uploading": "جاري التحميل ..."
},
"status": {
"account": {
"suspended_message": "تم تعليق حساب هذه الحالة.",
"suspended_show": "عرض المحتوى على أي حال؟"
},
"boosted_by": "تم النشر من",
"edited": "عدل {0}",
"favourited_by": "مُفضل من",
@ -446,8 +508,10 @@
"filter_removed_phrase": "تمت إزالته بواسطة عامل التصفية",
"filter_show_anyway": "عرض على أي حال",
"img_alt": {
"ALT": "نص بديل",
"desc": "وصف",
"dismiss": "تجاهل"
"dismiss": "تجاهل",
"read": "اقرأ وصف {0}"
},
"poll": {
"count": "لا توجد اصوات|صوت {0}|صوتين|{0} أصوات|{0} صوت|{0} صوت",
@ -471,6 +535,7 @@
"accounts": "الحسابات",
"for_you": "مصممة لك",
"hashtags": "هاشتاغ",
"list": "قائمة",
"media": "الصور/الفيديو",
"news": "الأخبار",
"notifications_all": "كل شىء",
@ -534,8 +599,12 @@
"explore_links_intro": "يتم التحدث عن هذه القصص الإخبارية من قبل الأشخاص الموجودين على هذه الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي",
"explore_posts_intro": "تكتسب هذه المنشورات الكثير من النشاط على الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي",
"explore_tags_intro": "تكتسب هذه الهاشتاغ الكثير من النشاط بين الأشخاص على هذه الشبكة وغيرها من الشبكات اللامركزية في الوقت الحالي",
"open_editor_tools": "أدوات المحرر",
"pick_an_icon": "اختر رمزًا",
"publish_failed": "أغلق الرسائل الفاشلة أعلى المحرر لإعادة نشر المنشورات",
"toggle_code_block": "تبديل كتلة التعليمات البرمجية"
"toggle_bold": "تبديل النص الغامق",
"toggle_code_block": "تبديل كتلة التعليمات البرمجية",
"toggle_italic": "تبديل النص المائل"
},
"user": {
"add_existing": "إضافة حساب قائم",
@ -543,6 +612,7 @@
"sign_in_desc": "قم بتسجيل الدخول لمتابعة الملفات الشخصية والمشاركة والرد على المنشورات أو التفاعل من حسابك على خادم مختلف",
"sign_in_notice_title": "عرض البيانات العامة من {0}",
"sign_out_account": "تسجيل الخروج من {0}",
"single_instance_sign_in_desc": "سجّل الدخول لمتابعة الملفات الشخصية أو علامات التصنيف والمفضلة والمشاركة والرد على المنشورات.",
"tip_no_account": "إذا ليس لديك حساب ماستودون ، {0}",
"tip_register_account": "اختر خادم ماستودون الخاص بك وقم بتسجيل حساب"
},

View File

@ -54,7 +54,6 @@
"not_found": "404 No s'ha trobat",
"offline_desc": "Sembla que estàs fora de línia. Comprova la connexió de xarxa."
},
"compose": {},
"confirm": {
"block_account": {
"cancel": "Cancel·la",
@ -91,7 +90,6 @@
"title": "Segur que vols deixar de seguir-lo?"
}
},
"conversation": {},
"custom_cards": {
"stackblitz": {
"open": "Obri",
@ -119,7 +117,6 @@
"footer_team": "L'equip d'Elk",
"title": "Elk està en proves!"
},
"language": {},
"list": {
"add_account": "Afig el compte a una llista",
"create": "Crea",

View File

@ -142,13 +142,6 @@
"replying": "Sem napište odpověď",
"the_thread": "vlákno"
},
"settings": {
"feature_flags": {
"github_cards": "GitHub Cards",
"user_picker": "User Picker",
"virtual_scroll": "Virtual Scrolling"
}
},
"state": {
"edited": "(Upraveno)",
"editing": "Upravuje se",

View File

@ -28,7 +28,6 @@
"muted_users": "Stummgeschaltete Accounts",
"muting": "Stummgeschaltet",
"mutuals": "Freunde",
"notify_on_post": "Benachrichtige mich, wenn {username} etwas postet",
"pinned": "Angepinnt",
"posts": "Beiträge",
"posts_count": "{0} Beiträge",
@ -102,8 +101,7 @@
"confirm": {
"common": {
"cancel": "Abbrechen",
"confirm": "OK",
"title": "Bist du sicher, {0}?"
"confirm": "OK"
},
"delete_posts": {
"cancel": "Abbrechen",
@ -256,12 +254,6 @@
"description": "Bearbeite Kontoeinstellungen in der Mastodon-Benutzeroberfläche",
"label": "Account Einstellungen"
},
"feature_flags": {
"github_cards": "GitHub Cards",
"title": "Experimentelle Funktionen",
"user_picker": "Benutzerauswahl",
"virtual_scroll": "Virtuelles Scrollen"
},
"interface": {
"color_mode": "Farbschema",
"dark_mode": "Dunkles Farbschema",
@ -385,6 +377,10 @@
"uploading": "Hochladen..."
},
"status": {
"account": {
"suspended_message": "Der Account dieses Status wurde vorübergehend gesperrt.",
"suspended_show": "Inhalt trotzdem anzeigen?"
},
"boosted_by": "Boosted von",
"edited": "Zuletzt bearbeitet: {0}",
"favourited_by": "Favorisiert von",

View File

@ -208,8 +208,7 @@
"command_mode": "Command mode",
"compose": "Compose",
"favourite": "Favourite",
"title": "Actions",
"zen_mode": "Zen mode"
"title": "Actions"
},
"media": {
"title": "Media"
@ -293,7 +292,7 @@
"followed_you": "followed you",
"followed_you_count": "{0} people followed you|{0} person followed you|{0} people followed you",
"missing_type": "MISSING notification.type:",
"reblogged_post": "reblogged your post",
"reblogged_post": "boosted your post",
"request_to_follow": "requested to follow you",
"signed_up": "signed up",
"update_status": "updated their post"
@ -453,7 +452,9 @@
"title": "Experimental Features",
"user_picker": "User Picker",
"virtual_scroll": "Virtual Scrolling",
"wellbeing": "Wellbeing"
"wellbeing": "Wellbeing",
"zen_mode": "Zen mode",
"zen_mode_description": "Hide asides unless the mouse cursor is over them. Also hide some elements from the timeline."
},
"profile": {
"appearance": {
@ -497,6 +498,10 @@
"uploading": "Uploading..."
},
"status": {
"account": {
"suspended_message": "The account of this status has been suspended.",
"suspended_show": "Show content anyways?"
},
"boosted_by": "Boosted By",
"edited": "Edited {0}",
"favourited_by": "Favorited By",

View File

@ -34,6 +34,7 @@
"posts": "Publicaciones",
"posts_count": "{0} Publicaciones|{0} Publicación|{0} Publicaciones",
"profile_description": "Encabezado del perfil de {0}",
"profile_personal_note": "Nota Personal",
"profile_unavailable": "Perfil no disponible",
"request_follow": "Solicitar seguirle",
"unblock": "Desbloquear",
@ -90,7 +91,7 @@
"switch_account": "Cambiar a {0}",
"switch_account_desc": "Cambiar a otra cuenta",
"toggle_dark_mode": "Cambiar a modo oscuro",
"toggle_zen_mode": "Cambiar a modo zen"
"toggle_zen_mode": "Cambiar a modo Zen"
},
"common": {
"end_of_list": "Fin",
@ -207,8 +208,7 @@
"command_mode": "Modo comando",
"compose": "Redactar",
"favourite": "Favorito",
"title": "Acciones",
"zen_mode": "Modo Zen"
"title": "Acciones"
},
"media": {
"title": "Media"
@ -225,6 +225,7 @@
"sequence_then": "seguido de"
},
"menu": {
"add_personal_note": "Agregar una nota personal a {0}",
"block_account": "Bloquear a {0}",
"block_domain": "Bloquear dominio {0}",
"copy_link_to_post": "Copiar enlace",
@ -239,6 +240,7 @@
"mute_conversation": "Silenciar publicación",
"open_in_original_site": "Abrir página original",
"pin_on_profile": "Fijar en tu perfil",
"remove_personal_note": "Eliminar nota personal de {0}",
"share_post": "Compartir esta publicación",
"show_favourited_and_boosted_by": "Mostrar quien marcó como favorita y quien retooteó",
"show_reblogs": "Mostrar retoots de {0}",
@ -450,7 +452,9 @@
"title": "Funcionalidades experimentales",
"user_picker": "Selector de usuarios",
"virtual_scroll": "Desplazamiento virtual",
"wellbeing": "Bienestar"
"wellbeing": "Bienestar",
"zen_mode": "Modo Zen",
"zen_mode_description": "Oculta las secciones laterales de la interfaz a menos que el cursor del ratón esté sobre ellas. Oculta también algunos elementos de las líneas de tiempo."
},
"profile": {
"appearance": {
@ -494,6 +498,10 @@
"uploading": "Subiendo..."
},
"status": {
"account": {
"suspended_message": "La cuenta de este mensaje ha sido suspendida.",
"suspended_show": "¿Mostrar contenido de todos modos?"
},
"boosted_by": "Retooteado por",
"edited": "Editado {0}",
"favourited_by": "Marcado como favorita por",

View File

@ -34,6 +34,7 @@
"posts": "Bidalketak",
"posts_count": "{0} bidalketa|Bidalketa {0}|{0} bidalketa",
"profile_description": "{0}(r)en profilaren goiburua",
"profile_personal_note": "Nire oharra",
"profile_unavailable": "Profila ez dago eskuragai",
"request_follow": "Bidali jarraipen-eskaera",
"unblock": "Utzi blokeatzeari",
@ -178,7 +179,7 @@
"desc_para5": "jarri harremanetan GitHub bidez",
"desc_para6": "eta hartu parte.",
"footer_team": "Elk taldea",
"title": "Elk-en aurreikuspena da hau!"
"title": "Elk-en aurrebista da hau!"
},
"language": {
"search": "Bilatu"
@ -225,6 +226,7 @@
"sequence_then": "orduan"
},
"menu": {
"add_personal_note": "Gehitu {0}(r)i buruzko oharra",
"block_account": "Blokeatu {0}",
"block_domain": "Blokeatu {0} domeinua",
"copy_link_to_post": "Kopiatu bidalketa honen esteka",
@ -239,6 +241,7 @@
"mute_conversation": "Mututu bidalketa",
"open_in_original_site": "Ireki jatorrizko orrian",
"pin_on_profile": "Finkatu profilean",
"remove_personal_note": "Kendu {0}(r)i buruzko oharra",
"share_post": "Partekatu bidalketa",
"show_favourited_and_boosted_by": "Erakutsi nork egin duen gogoko eta nork bultzatu duen",
"show_reblogs": "Erakutsi {0}(r)en bultzadak",

View File

@ -295,13 +295,6 @@
"font_size": "Kirjasinkoko",
"label": "Käyttöliittymä",
"light_mode": "Vaalea",
"size_label": {
"lg": "Suuri",
"md": "Keski",
"sm": "Pieni",
"xl": "Ekstra-suuri",
"xs": "Ekstra-pieni"
},
"system_mode": "Laitteen asetus",
"theme_color": "Korostusväri"
},

View File

@ -30,7 +30,6 @@
"mutuals": "Terkait",
"notifications_on_post_disable": "Berhenti memberi tahu saya saat {username} memposting",
"notifications_on_post_enable": "Beri tahu saya jika {username} memposting",
"notify_on_post": "Beri tahu saya jika {username} memposting",
"pinned": "Dilekatkan",
"posts": "Posting",
"posts_count": "{0} Pos|{0} Pos|{0} Pos",
@ -92,11 +91,6 @@
"toggle_zen_mode": "Beralih ke modus zen"
},
"common": {
"confirm_dialog": {
"cancel": "Tidak",
"confirm": "Ya",
"title": "Apakah Anda yakin {0}?"
},
"end_of_list": "Akhir dari daftar",
"error": "KESALAHAN",
"in": "di dalam",
@ -180,11 +174,6 @@
"copy_link_to_post": "Salin tautan pos ini",
"delete": "Hapus",
"delete_and_redraft": "Hapus dan buat ulang draf",
"delete_confirm": {
"cancel": "Batalkan",
"confirm": "Hapus",
"title": "Yakin ingin menghapus postingan ini?"
},
"direct_message_account": "Pesan langsung {0}",
"edit": "Sunting",
"hide_reblogs": "Sembunyikan dukungan dari {0}",

630
locales/it-IT.json Normal file
View File

@ -0,0 +1,630 @@
{
"a11y": {
"loading_page": "Carico pagina, attendi",
"loading_titled_page": "Carico pagina {0}, attendi",
"locale_changed": "Lingua impostata su {0}",
"locale_changing": "Imposto lingua, attendi",
"route_loaded": "Pagina {0} caricata"
},
"account": {
"avatar_description": "Avatar di {0}",
"blocked_by": "Questo utente ti ha bloccato.",
"blocked_domains": "Domini bloccati",
"blocked_users": "Utenti bloccati",
"blocking": "Bloccato",
"bot": "BOT",
"favourites": "Preferiti",
"follow": "Segui",
"follow_back": "Ricambia",
"follow_requested": "Richiesta inviata",
"followers": "Seguaci",
"followers_count": "{0} seguaci|{0} seguace|{0} seguaci",
"following": "Segui già",
"following_count": "{0} Seguiti",
"follows_you": "Ti segue",
"go_to_profile": "Vai al profilo",
"joined": "Iscritto",
"moved_title": "ha indicato che il suo nuovo account è:",
"muted_users": "Utenti silenziati",
"muting": "Silenziato",
"mutuals": "Reciproci",
"notifications_on_post_disable": "Disattiva notifiche per i post di {username}",
"notifications_on_post_enable": "Attiva notifiche per i post di {username}",
"pinned": "Fissato",
"posts": "Post",
"posts_count": "{0} post|{0} post|{0} post",
"profile_description": "Copertina profilo di {0}",
"profile_personal_note": "Nota personale",
"profile_unavailable": "Profilo non disponibile",
"request_follow": "Chiedi di seguire",
"unblock": "Sblocca",
"unfollow": "Smetti di seguire",
"unmute": "Riattiva",
"view_other_followers": "I seguaci di altre istanze non sono disponibili.",
"view_other_following": "I seguiti di altre istanze non sono disponibili."
},
"action": {
"apply": "Applica",
"bookmark": "Aggiungi ai segnalibri",
"bookmarked": "Aggiunto ai segnalibri",
"boost": "Potenzia",
"boost_count": "{0}",
"boosted": "Potenziato",
"clear_publish_failed": "Cancella errori di pubblicazione",
"clear_upload_failed": "Cancella errori di caricamento file",
"close": "Chiudi",
"compose": "Componi",
"confirm": "Conferma",
"edit": "Modifica",
"enter_app": "Entra nell'app",
"favourite": "Apprezza",
"favourite_count": "{0}",
"favourited": "Apprezzato",
"more": "Altro",
"next": "Successivo",
"prev": "Precedente",
"publish": "Pubblica",
"reply": "Rispondi",
"reply_count": "{0}",
"reset": "Reset",
"save": "Salva",
"save_changes": "Salva modifiche",
"sign_in": "Accedi",
"sign_in_to": "Accedi a {0}",
"switch_account": "Cambia account",
"vote": "Vota"
},
"app_desc_short": "Un agile client web per Mastodon",
"app_logo": "Logo Elk",
"app_name": "Elk",
"attachment": {
"edit_title": "Descrizione",
"remove_label": "Rimuovi allegato"
},
"command": {
"activate": "Attiva",
"complete": "Completa",
"compose_desc": "Componi un nuovo post",
"n-people-in-the-past-n-days": "{0} persone negli ultimi {1} giorni",
"select_lang": "Scegli lingua",
"sign_in_desc": "Aggiungi account esistente",
"switch_account": "Passa a {0}",
"switch_account_desc": "Cambia account",
"toggle_dark_mode": "Tema scuro",
"toggle_zen_mode": "Modalità zen"
},
"common": {
"end_of_list": "Fine della lista",
"error": "ERRORE",
"fetching": "Carico...",
"in": "in",
"not_found": "404 non trovato",
"offline_desc": "Sembra che tu sia offline. Controlla la tua connessione."
},
"compose": {
"draft_title": "Bozza {0}",
"drafts": "Bozze ({v})"
},
"confirm": {
"block_account": {
"cancel": "Annulla",
"confirm": "Blocca",
"title": "Confermi di voler bloccare {0}"
},
"block_domain": {
"cancel": "Annulla",
"confirm": "Blocca",
"title": "Confermi di voler bloccare {0}"
},
"common": {
"cancel": "Annulla",
"confirm": "Conferma"
},
"delete_list": {
"cancel": "Annulla",
"confirm": "Elimina",
"title": "Confermi di voler eliminare la lista \"{0}\"?"
},
"delete_posts": {
"cancel": "Annulla",
"confirm": "Elimina",
"title": "Confermi di voler eliminare questo post?"
},
"mute_account": {
"cancel": "Annulla",
"confirm": "Silenzia",
"title": "Confermi di voler silenziare {0}"
},
"show_reblogs": {
"cancel": "Annulla",
"confirm": "Mostra",
"title": "Confermi di voler mostrare i post potenziati da {0}"
},
"unfollow": {
"cancel": "Annulla",
"confirm": "Smetti di seguire",
"title": "Confermi di voler smettere di seguire?"
}
},
"conversation": {
"with": "con"
},
"custom_cards": {
"stackblitz": {
"lines": "Righe {0}",
"open": "Apri",
"snippet_from": "Porzione di codice da {0}"
}
},
"error": {
"account_not_found": "Account {0} non trovato",
"explore-list-empty": "Non c'è niente in tendenza al momento. Torna più tardi!",
"file_size_cannot_exceed_n_mb": "La dimensione del file non può superare {0}MB",
"sign_in_error": "Impossibile connettersi al server.",
"status_not_found": "Post non trovato",
"unsupported_file_format": "Formato file non supportato"
},
"help": {
"build_preview": {
"desc1": "Stai attualmente visualizzando una versione di prova di Elk dalla comunità - {0}.",
"desc2": "Potrebbe contenere modifiche non verificate o persino maliziose.",
"desc3": "Non accedere con il tuo vero account.",
"title": "Anteprima implementazione"
},
"desc_highlight": "Aspettati qualche bug e funzione mancante qua e là.",
"desc_para1": "Grazie per il tuo interesse a provare Elk, il nostro web client per Mastodon in corso d'opera!",
"desc_para2": "Stiamo lavorando sodo allo sviluppo e al suo miglioramento nel tempo.",
"desc_para3": "Per sostenere lo sviluppo, puoi sponsorizzare il team tramite GitHub Sponsors. Speriamo ti piaccia Elk!",
"desc_para4": "Elk è open source. Se hai voglia di testare, fornire feedback o contribuire,",
"desc_para5": "unisciti a noi su GitHub",
"desc_para6": "e partecipa al progetto.",
"footer_team": "Il team di Elk",
"title": "Elk è in anteprima!"
},
"language": {
"search": "Cerca"
},
"list": {
"add_account": "Aggiungi account alla lista",
"cancel_edit": "Annulla modifica",
"clear_error": "Ignora errore",
"create": "Crea",
"delete": "Elimina lista",
"delete_error": "C'è stato un errore nell'eliminazione della lista",
"edit": "Modifica lista",
"edit_error": "C'è stato un errore nella modifica della lista",
"error": "C'è stato un errore nella creazione della lista",
"error_prefix": "Errore: ",
"list_title_placeholder": "Titolo lista",
"modify_account": "Modifica liste con account",
"remove_account": "Rimuovi account dalla lista",
"save": "Salva modifiche"
},
"magic_keys": {
"dialog_header": "Scorciatoie da tastiera",
"groups": {
"actions": {
"boost": "Potenzia",
"command_mode": "Modalità comando",
"compose": "Componi",
"favourite": "Apprezza",
"title": "Azioni"
},
"media": {
"title": "Media"
},
"navigation": {
"go_to_home": "Home",
"go_to_notifications": "Notifiche",
"next_status": "Post successivo",
"previous_status": "Post precedente",
"shortcut_help": "Aiuto scorciatoie",
"title": "Navigazione"
}
},
"sequence_then": "poi"
},
"menu": {
"add_personal_note": "Aggiungi nota personale a {0}",
"block_account": "Blocca {0}",
"block_domain": "Blocca dominio {0}",
"copy_link_to_post": "Copia link a questo post",
"copy_original_link_to_post": "Copia link originale a questo post",
"delete": "Elimina",
"delete_and_redraft": "Elimina e riscrivi",
"direct_message_account": "Scrivi in privato a {0}",
"edit": "Modifica",
"hide_reblogs": "Nascondi potenziamenti da {0}",
"mention_account": "Menziona {0}",
"mute_account": "Silenzia {0}",
"mute_conversation": "Silenzia questo post",
"open_in_original_site": "Apri nel sito originale",
"pin_on_profile": "Fissa nel profilo",
"remove_personal_note": "Rimuovi nota personale da {0}",
"share_post": "Condividi questo post",
"show_favourited_and_boosted_by": "Mostra chi ha apprezzato e potenziato",
"show_reblogs": "Mostra potenziamenti da {0}",
"show_untranslated": "Mostra versione originale",
"toggle_theme": {
"dark": "Usa tema scuro",
"light": "Usa tema chiaro"
},
"translate_post": "Traduci post",
"unblock_account": "Sblocca {0}",
"unblock_domain": "Sblocca dominio {0}",
"unmute_account": "Riattiva {0}",
"unmute_conversation": "Riattiva questo post",
"unpin_on_profile": "Togli dal profilo"
},
"modals": {
"aria_label_close": "Chiudi"
},
"nav": {
"back": "Torna indietro",
"blocked_domains": "Domini bloccati",
"blocked_users": "Utenti bloccati",
"bookmarks": "Segnalibri",
"built_at": "Sviluppato {0}",
"compose": "Componi",
"conversations": "Conversazioni",
"explore": "Esplora",
"favourites": "Preferiti",
"federated": "Federata",
"home": "Home",
"list": "Lista",
"lists": "Liste",
"local": "Locale",
"muted_users": "Utenti silenziati",
"notifications": "Notifiche",
"privacy": "Privacy",
"profile": "Profilo",
"search": "Cerca",
"select_feature_flags": "Attiva funzioni di prova",
"select_font_size": "Dimensione testo",
"select_language": "Lingua interfaccia",
"settings": "Impostazioni",
"show_intro": "Mostra intro",
"toggle_theme": "Cambia tema",
"zen_mode": "Modalità zen"
},
"notification": {
"favourited_post": "ha apprezzato il tuo post",
"followed_you": "ti ha iniziato a seguire",
"followed_you_count": "{0} persone ti hanno cominciato a seguire|{0} persona ti ha cominciato a seguire|{0} persone ti hanno cominciato a seguire",
"missing_type": "notification.type MANCANTE:",
"reblogged_post": "ha potenziato il tuo post",
"request_to_follow": "ti ha chiesto di seguirti",
"signed_up": "ha effettuato l'iscrizione",
"update_status": "ha aggiornato il suo post"
},
"placeholder": {
"content_warning": "Scrivi il tuo avviso qui",
"default_1": "A cosa pensi?",
"reply_to_account": "Rispondi a {0}",
"replying": "Rispondi",
"the_thread": "la discussione"
},
"pwa": {
"dismiss": "Ignora",
"install": "Installa",
"install_title": "Installa Elk",
"title": "Nuova versione di Elk disponibile!",
"update": "Aggiorna",
"update_available_short": "Aggiorna Elk",
"webmanifest": {
"canary": {
"description": "Un agile client web per Mastodon (canary)",
"name": "Elk (canary)",
"short_name": "Elk (canary)"
},
"dev": {
"description": "Un agile client web per Mastodon (dev)",
"name": "Elk (dev)",
"short_name": "Elk (dev)"
},
"preview": {
"description": "Un agile client web per Mastodon (anteprima)",
"name": "Elk (anteprima)",
"short_name": "Elk (anteprima)"
},
"release": {
"description": "Un agile client web per Mastodon",
"name": "Elk",
"short_name": "Elk"
}
}
},
"search": {
"search_desc": "Cerca persone e hashtag",
"search_empty": "Nessun risultato per questi termini di ricerca"
},
"settings": {
"about": {
"built_at": "Sviluppato",
"label": "Informazioni",
"meet_the_team": "Conosci il team",
"sponsor_action": "Fai una donazione",
"sponsor_action_desc": "Per sostenere il team di Elk",
"sponsors": "Sponsor",
"sponsors_body_1": "Elk è reso possibile grazie alle generose donazioni e all'aiuto di:",
"sponsors_body_2": "E a tutte le aziende e individui che sostengono il team di Elk e i suoi membri.",
"sponsors_body_3": "Se ti sta piacendo la app, potresti diventare nostro sponsor:",
"version": "Versione"
},
"account_settings": {
"description": "Modifica le impostazioni del tuo account su Mastodon",
"label": "Impostazioni account"
},
"interface": {
"color_mode": "Aspetto",
"dark_mode": "Scuro",
"default": " (default)",
"font_size": "Dimensione testo",
"label": "Interfaccia",
"light_mode": "Chiaro",
"system_mode": "Sistema",
"theme_color": "Colore"
},
"language": {
"display_language": "Lingua interfaccia",
"label": "Lingua",
"status": "Stato traduzione: {0}/{1} ({2}%)",
"translations": {
"add": "Aggiungi",
"choose_language": "Scegli lingua",
"heading": "Traduzioni",
"hide_specific": "Nascondi specifiche traduzioni",
"remove": "Rimuovi"
}
},
"notifications": {
"label": "Notifiche",
"notifications": {
"label": "Impostazioni notifiche"
},
"push_notifications": {
"alerts": {
"favourite": "Apprezzamenti",
"follow": "Nuovi seguaci",
"mention": "Menzioni",
"poll": "Votazioni",
"reblog": "Potenziamenti dei tuoi post",
"title": "Quali notifiche vuoi ricevere?"
},
"description": "Ricevi notifiche anche quando non stai utilizzando Elk.",
"instructions": "Ricordati di salvare le tue modifiche usando @:settings.notifications.push_notifications.save_settings button!",
"label": "Impostazioni notifiche push",
"policy": {
"all": "Da chiunque",
"followed": "Dalle persone che seguo",
"follower": "Dalle persone che mi seguono",
"none": "Da nessuno",
"title": "Da chi vuoi ricevere notifiche?"
},
"save_settings": "Salva impostazioni",
"subscription_error": {
"clear_error": "Ignora errore",
"error_hint": "Puoi consultare una lista di domande frequenti per provare a risolvere il problema: {0}.",
"invalid_vapid_key": "La chiave pubblica VAPID sembra non essere valida.",
"permission_denied": "Permesso negato: attiva le notifiche nel tuo browser.",
"repo_link": "La repo di Elk su GitHub",
"request_error": "C'è stato un errore nella richiesta di iscrizione, riprova e se il problema persiste, segnala il problema sulla repo di Elk.",
"title": "Iscrizione alle notifiche push fallita",
"too_many_registrations": "A causa di limitazioni del browser, Elk non può usare il servizio di notifiche push per più account su server diversi. Disattiva le notifiche push su un altro account e riprova.",
"vapid_not_supported": "Il tuo browser supporta le notifiche push, ma sembra non implementare il protocollo VAPID."
},
"title": "Impostazioni notifiche push",
"undo_settings": "Annulla modifiche",
"unsubscribe": "Disattiva notifiche push",
"unsupported": "Il tuo browser non supporta le notifiche push.",
"warning": {
"enable_close": "Chiudi",
"enable_description": "Per ricevere notifiche quando Elk non è aperto, attiva le notifiche push. Puoi controllare precisamente quali interazioni inviano notifiche push dal tasto \"@:settings.notifications.show_btn{'\"'} sopra una volta attivate.",
"enable_description_desktop": "Per ricevere notifiche quando Elk non è aperto, attiva le notifiche push. Puoi controllare precisamente quali interazioni inviano notifiche push in \"Impostazioni > Notifiche > Impostazioni notifiche push\" una volta attivate.",
"enable_description_mobile": "Puoi accedere alle impostazioni anche usando il menu di navigazione \"Impostazioni > Notifiche > Impostazioni notifiche push\".",
"enable_description_settings": "Per ricevere notifiche quando Elk non è aperto, attiva le notifiche push. Puoi controllare precisamente quali interazioni inviano notifiche push una volta attivate.",
"enable_desktop": "Attiva notifiche push",
"enable_title": "Non perderti mai nulla",
"re_auth": "Sembra che il tuo server non supporti le notifiche push. Prova a uscire ed effettuare di nuovo l'accesso, se riappare questo messaggio, contatta l'amministratore del tuo server."
}
},
"show_btn": "Vai alle impostazioni di notifica",
"under_construction": "Lavori in corso"
},
"notifications_settings": "Notifiche",
"preferences": {
"enable_autoplay": "Attiva riproduzione automatica",
"enable_data_saving": "Attiva risparmio dati",
"enable_data_saving_description": "Risparmia dati disattivando il download automatico degli allegati.",
"enable_pinch_to_zoom": "Pizzica per ingrandire",
"github_cards": "GitHub Cards",
"grayscale_mode": "Modalità scala di grigi",
"hide_account_hover_card": "Nascondi anteprima account al passaggio del mouse",
"hide_alt_indi_on_posts": "Nascondi indicatori testo alternativo sui post",
"hide_boost_count": "Nascondi contatore potenziamenti",
"hide_favorite_count": "Nascondi contatore apprezzamenti",
"hide_follower_count": "Nascondi contatore seguaci/seguiti",
"hide_reply_count": "Nascondi contatore risposte",
"hide_translation": "Nascondi traduzione",
"hide_username_emojis": "Nascondi emoji dai nomi utente",
"hide_username_emojis_description": "Nasconde le emoji all'interno dei nomi utente nella cronologia. Le emoji saranno comunque visibili nelle pagine dei profili.",
"label": "Preferenze",
"title": "Funzionalità sperimentali",
"user_picker": "Selettore utente",
"virtual_scroll": "Scorrimento virtuale",
"wellbeing": "Benessere",
"zen_mode": "Modalità zen",
"zen_mode_description": "Nasconde l'interfaccia laterale a meno che il mouse non ci passi sopra. Nasconde anche certi elementi della cronologia."
},
"profile": {
"appearance": {
"bio": "Bio",
"description": "Modifica avatar, nome utente, profilo, ecc.",
"display_name": "Nome",
"label": "Aspetto",
"profile_metadata": "Dati profilo",
"profile_metadata_desc": "Puoi avere fino a {0} elementi esposti in una tabella sul tuo profilo",
"profile_metadata_label": "Etichetta",
"profile_metadata_value": "Contenuto",
"title": "Modifica profilo"
},
"featured_tags": {
"description": "Le altre persone possono sfogliare i tuoi post pubblici raccolti sotto questi hashtag.",
"label": "Hashtag in evidenza"
},
"label": "Profilo"
},
"select_a_settings": "Seleziona un'impostazione'",
"users": {
"export": "Esporta token utente",
"import": "Importa token utente",
"label": "Utenti connessi"
}
},
"share-target": {
"description": "Elk può essere configurato in modo da poter condividere contenuti da altre app, ti basta installare Elk sul tuo dispositivo o computer e accedere.",
"hint": "Per poter condividere contenuti con Elk, Elk deve essere installato e devi aver effettuato l'accesso.",
"title": "Condividi con Elk"
},
"state": {
"attachments_exceed_server_limit": "Il numero di allegati superava il limite per post.",
"attachments_limit_error": "Limite per post superato.",
"edited": "(Modificato)",
"editing": "Modifica",
"loading": "Carico...",
"publish_failed": "Pubblicazione fallita",
"publishing": "Pubblico",
"upload_failed": "Upload fallito",
"uploading": "Upload in corso..."
},
"status": {
"account": {
"suspended_message": "L'account di questo post è stato sospeso.",
"suspended_show": "Mostra comunque contenuto?"
},
"boosted_by": "Potenziato da",
"edited": "Modificato {0}",
"favourited_by": "Apprezzato da",
"filter_hidden_phrase": "Filtrato da",
"filter_removed_phrase": "Rimosso dal filtro",
"filter_show_anyway": "Mostra comunque",
"img_alt": {
"ALT": "ALT",
"desc": "Descrizione",
"dismiss": "Ignora",
"read": "Leggi descrizione {0}"
},
"poll": {
"count": "{0} voti|{0} voto|{0} voti",
"ends": "termina {0}",
"finished": "terminato {0}"
},
"reblogged": "{0} hanno potenziato",
"replying_to": "In risposta a {0}",
"show_full_thread": "Mostra discussione",
"someone": "qualcuno",
"spoiler_show_less": "Mostra meno",
"spoiler_show_more": "Mostra altro",
"thread": "Discussione",
"try_original_site": "Prova sito originale"
},
"status_history": {
"created": "creato {0}",
"edited": "modificato {0}"
},
"tab": {
"accounts": "Account",
"for_you": "Per te",
"hashtags": "Hashtag",
"list": "Lista",
"media": "Media",
"news": "Notizie",
"notifications_all": "Tutte",
"notifications_mention": "Menzioni",
"posts": "Post",
"posts_with_replies": "Post e risposte"
},
"tag": {
"follow": "Segui",
"follow_label": "Segui tag {0}",
"unfollow": "Smetti di seguire",
"unfollow_label": "Smetti di seguire tag {0}"
},
"time_ago_options": {
"day_future": "in 0 giorni|domani|in {n} giorni",
"day_past": "0 giorni fa|ieri|{n} giorni fa",
"hour_future": "in 0 ore|in 1 ora|in {n} ore",
"hour_past": "0 ore fa|1 ora fa|{n} ore fa",
"just_now": "adesso",
"minute_future": "in 0 minuti|in 1 minuto|in {n} minuti",
"minute_past": "0 minuti fa|1 minuto fa|{n} minuti fa",
"month_future": "in 0 mesi|mese prossimo|in {n} mesi",
"month_past": "0 mesi fa|mese scorso|{n} mesi fa",
"second_future": "adesso|in {n} secondo|in {n} secondi",
"second_past": "adesso|{n} secondo fa|{n} secondi fa",
"short_day_future": "in {n}g",
"short_day_past": "{n}g",
"short_hour_future": "in {n}o",
"short_hour_past": "{n}o",
"short_minute_future": "in {n}min",
"short_minute_past": "{n}min",
"short_month_future": "in {n}m",
"short_month_past": "{n}m",
"short_second_future": "in {n}sec",
"short_second_past": "{n}sec",
"short_week_future": "in {n}s",
"short_week_past": "{n}s",
"short_year_future": "in {n}a",
"short_year_past": "{n}a",
"week_future": "in 0 settimane|settimana prossima|in {n} settimane",
"week_past": "0 settimane fa|settimana scorsa|{n} settimane fa",
"year_future": "in 0 anni|anno prossimo|in {n} anni",
"year_past": "0 anni fa|anno scorso|{n} anni fa"
},
"timeline": {
"show_new_items": "Mostra {v} nuovi elementi|Mostra {v} nuovo elemento|Mostra {v} nuovi elementi",
"view_older_posts": "Non è possibile mostrare post passati da altre istanze"
},
"title": {
"federated_timeline": "Cronologia federata",
"local_timeline": "Cronologia locale"
},
"tooltip": {
"add_content_warning": "Aggiungi avviso contenuto",
"add_emojis": "Aggiungi emoji",
"add_media": "Aggiungi immagini, un video o un file audio",
"add_publishable_content": "Aggiungi contenuto da pubblicare",
"change_content_visibility": "Cambia visibilità contenuto",
"change_language": "Cambia lingua",
"emoji": "Emoji",
"explore_links_intro": "Queste novità stanno venendo discusse da persone di questa e di altre istanze della rete decentralizzata in questo momento.",
"explore_posts_intro": "Questi post da questa e da altre istanze della rete decentralizzata stanno acquistando popolarità in questo momento.",
"explore_tags_intro": "Questi hashtag stanno acquistando popolarità fra persone di questa e di altre istanze della rete decentralizzata in questo momento.",
"open_editor_tools": "Formattazione testo",
"pick_an_icon": "Scegli un'icona'",
"publish_failed": "Chiudi i messaggi falliti in cima all'editor per ripubblicare i post",
"toggle_bold": "Grassetto",
"toggle_code_block": "Blocco di codice",
"toggle_italic": "Corsivo"
},
"user": {
"add_existing": "Aggiungi account esistente",
"server_address_label": "Indirizzo server Mastodon",
"sign_in_desc": "Accedi per seguire profili o hashtag, apprezzare, condividere e rispondere a post o interagire dal tuo account su un'altra istanza.",
"sign_in_notice_title": "Visualizzando {0} dati pubblici",
"sign_out_account": "Esci {0}",
"single_instance_sign_in_desc": "Accedi per seguire profili o hastag, apprezzare condividere o rispondere a post.",
"tip_no_account": "Se ancora non hai un account Mastodon, {0}.",
"tip_register_account": "scegli la tua istanza preferita e registrati"
},
"visibility": {
"direct": "Diretto",
"direct_desc": "Solo utenti visibili o menzionati",
"private": "Solo seguaci",
"private_desc": "Visibile solo ai seguaci",
"public": "Pubblico",
"public_desc": "Visibile a tutti",
"unlisted": "Non in lista",
"unlisted_desc": "Visibile a tutti, ma escluso da funzionalità come Esplora"
}
}

484
locales/ko-KR.json Normal file
View File

@ -0,0 +1,484 @@
{
"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}팔로워",
"following": "팔로잉",
"following_count": "{0}팔로잉",
"muted_users": "뮤트된 사용자",
"mutuals": "맞팔로우 중",
"pinned": "고정됨",
"posts": "포스트",
"posts_count": "{0}포스트|{0}포스트|{0}포스트",
"profile_description": "{0}의 프로필 헤더",
"profile_unavailable": "프로필 사용 불가능",
"request_follow": "팔로우 요청",
"unblock": "차단 해제",
"unfollow": "언팔로우",
"unmute": "언뮤트"
},
"action": {
"apply": "적용",
"bookmark": "북마크",
"bookmarked": "북마크 됨",
"boost": "부스트",
"boost_count": "{0}",
"boosted": "부스트됨",
"clear_publish_failed": "게시 오류 클리어",
"clear_upload_failed": "파일 업로드 오류 클리어",
"close": "닫기",
"compose": "작성",
"confirm": "확인",
"edit": "수정",
"favourite": "좋아요",
"favourite_count": "{0}",
"favourited": "좋아요함",
"more": "더 보기",
"next": "다음",
"prev": "이전",
"publish": "게시",
"reply": "답글",
"reply_count": "{0}",
"reset": "리셋",
"save": "서정",
"save_changes": "변경사항이 저장됨",
"sign_in": "로그인",
"sign_in_to": "{0}으로 로그인됨",
"switch_account": "계정 전환",
"vote": "투표"
},
"app_desc_short": "민첩한 마스토돈 웹 클라이언트",
"app_logo": "Elk 로고",
"app_name": "Elk",
"attachment": {
"edit_title": "설명",
"remove_label": "첨부파일 삭제"
},
"command": {
"complete": "완료",
"compose_desc": "새 포스트 쓰기",
"select_lang": "언어 선택",
"sign_in_desc": "기존 계정 추가",
"switch_account": "{0}로 전환",
"switch_account_desc": "다른 계정으로 전환",
"toggle_dark_mode": "다크 모드 토글"
},
"confirm": {
"block_account": {
"cancel": "취소",
"confirm": "차단",
"title": "정말로 {0}을/를 차단할까요?"
},
"block_domain": {
"cancel": "취소",
"confirm": "차단",
"title": "정말로 {0}을/를 차단할까요?"
},
"common": {
"cancel": "아니오",
"confirm": "네"
},
"delete_list": {
"cancel": "취소",
"confirm": "삭제",
"title": "정말로 \"{0}\" 리스트를 삭제할까요?"
},
"delete_posts": {
"cancel": "취소",
"confirm": "삭제",
"title": "정말로 이 포스트를 삭제할까요?"
},
"mute_account": {
"cancel": "취소",
"confirm": "Mute",
"title": "정말로 {0}을.를 뮤트하시겠어요?"
},
"show_reblogs": {
"cancel": "취소",
"confirm": "보기",
"title": "정말로 부스트를 {0}에서 표시할까요?"
},
"unfollow": {
"cancel": "취소",
"confirm": "언팔로우",
"title": "정말로 언팔로우를 하시겠어요?"
}
},
"conversation": {
"with": "함께"
},
"error": {
"account_not_found": "{0} 계정을 찾을 수 없습니다",
"file_size_cannot_exceed_n_mb": "파일 크기는 {0}MB를 초과할 수 없습니다",
"sign_in_error": "서버에 연결할 수 없습니다.",
"status_not_found": "포스트를 찾을 수 없습니다",
"unsupported_file_format": "지원하지 않는 파일 포맷"
},
"language": {
"search": "검색"
},
"list": {
"add_account": "리스트에 계정 추가",
"cancel_edit": "편집 취소",
"create": "생성",
"list_title_placeholder": "리스트 제목"
},
"magic_keys": {
"dialog_header": "키보드 단축키",
"groups": {
"actions": {
"boost": "부스트",
"compose": "작성",
"favourite": "좋아요",
"title": "엑션"
},
"media": {
"title": "미디어"
},
"navigation": {
"go_to_home": "홈",
"go_to_notifications": "알림",
"next_status": "다음 상태",
"previous_status": "이전 상태",
"shortcut_help": "단축키 도움말",
"title": "네비게이션"
}
}
},
"menu": {
"block_account": "차단 {0}",
"block_domain": "도메인 차단 {0}",
"copy_link_to_post": "이 포스트의 링크를 복사했습니다",
"copy_original_link_to_post": "이 포스트의 원래 링크를 복사",
"delete": "삭제",
"delete_and_redraft": "삭제 후 재게시",
"direct_message_account": "다이렉트 메시지 {0}",
"edit": "수정",
"hide_reblogs": "{0} 부스트를 숨기기",
"mention_account": "멘션 {0}",
"mute_account": "뮤트 {0}",
"mute_conversation": "이 포스트를 뮤트",
"open_in_original_site": "원래 사이트에서 열기",
"pin_on_profile": "프로필에 고정",
"share_post": "포스트를 공유",
"show_favourited_and_boosted_by": "누가 좋아요와 부스트를 했는지 보기",
"show_untranslated": "미번역본 보기",
"toggle_theme": {
"dark": "다크 모드 토글",
"light": "라이크 모드 토글"
},
"translate_post": "포스트 번역",
"unblock_account": "차단 해제 {0}",
"unblock_domain": "도메인 차단 해제 {0}",
"unmute_account": "언뮤트 {0}",
"unmute_conversation": "이 포스트를 언뮤트",
"unpin_on_profile": "프로필에 고정 해제"
},
"modals": {
"aria_label_close": "닫기"
},
"nav": {
"back": "뒤로 가기",
"blocked_domains": "차단된 도메인",
"blocked_users": "차단된 유저",
"bookmarks": "북마크",
"built_at": "빌트 {0}",
"compose": "작성",
"conversations": "대화",
"explore": "탐색",
"favourites": "좋아요",
"federated": "연합",
"home": "홈",
"list": "리스트",
"lists": "리스트",
"local": "로컬",
"muted_users": "뮤트한 유저",
"notifications": "알림",
"privacy": "개인정보처리방침",
"profile": "프로필",
"search": "검색",
"select_font_size": "글자 크기",
"select_language": "표시 언어",
"settings": "설정",
"show_intro": "인트로 보기",
"toggle_theme": "테마 토글"
},
"notification": {
"favourited_post": "당신의 포스트를 좋아합니다",
"followed_you": "당신을 팔로우 합니다",
"followed_you_count": "{0}명이 당신을 팔로우 합니다|{0}명이 당신을 팔로우 합니다|{0}명이 당신을 팔로우 합니다",
"missing_type": "MISSING 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": "설치하지 않기",
"install": "설치",
"install_title": "Elk 설치",
"title": "새로운 Elk 업데이트가 가능합니다!",
"update": "업데이트",
"update_available_short": "업데이트 Elk",
"webmanifest": {
"canary": {
"description": "민첩한 마스토돈 웹 클라이언트 (카나리)",
"name": "Elk (카나리)",
"short_name": "Elk (카나리)"
},
"dev": {
"description": "민첩한 마스토돈 웹 클라이언트 (개발)",
"name": "Elk (개발)",
"short_name": "Elk (개발)"
},
"preview": {
"description": "민첩한 마스토돈 웹 클라이언트 (미리보기)",
"name": "Elk (미리보기)",
"short_name": "Elk (미리보기)"
},
"release": {
"description": "민첩한 마스토돈 웹 클라이언트",
"name": "Elk",
"short_name": "Elk"
}
}
},
"search": {
"search_desc": "사람과 해시태크 검색",
"search_empty": "다음 검색어에 대한 내용을 찾을 수 없습니다"
},
"settings": {
"about": {
"built_at": "빌트",
"label": "Elk에 대하여",
"meet_the_team": "팀과 만나기",
"sponsor_action": "우리를 지원하기",
"sponsor_action_desc": "Elk 개발침을 위해 지원하기",
"sponsors": "스폰서",
"sponsors_body_1": "Elk는 다음과 같은 분들의 아낌없는 후원과 도움 덕분에 가능했습니다:",
"sponsors_body_2": "그리고 Elk 팀과 멤버들을 후원하는 모든 기업과 개인에게도 감사드립니다",
"sponsors_body_3": "앱을 즐기고 계신다면 후원을 고려해 보세요:",
"version": "버전"
},
"account_settings": {
"description": "마스토돈 UI에서 계정 설정 수정하기",
"label": "계정 설정"
},
"interface": {
"color_mode": "컬러 모드",
"dark_mode": "다크",
"default": " (기본)",
"font_size": "글자 크기",
"label": "인터페이스",
"light_mode": "라이트",
"system_mode": "시스템",
"theme_color": "테마 컬러"
},
"language": {
"display_language": "표시 언어",
"label": "언어",
"status": "변역 진행도: {0}/{1} ({2}%)",
"translations": {
"add": "추가",
"choose_language": "언어 선택",
"heading": "번역",
"hide_specific": "특정 언어는 번역 숨기기",
"remove": "삭제"
}
},
"notifications": {
"label": "알림",
"notifications": {
"label": "알림 설정"
},
"push_notifications": {
"description": "Elk를 사용하지 않을 때에도 알림을 받습니다.",
"label": "푸시 알림 설정",
"warning": {
"enable_close": "닫기",
"enable_description": "Elk가 열려 있지 않을 때 알림을 받으려면 푸시 알림을 활성화하세요. 푸시 알림을 활성화하면 위의 \"@:settings.notifications.show_btn{'\"'} 버튼을 통해 어떤 유형의 상호작용이 푸시 알림을 생성하는지 정확하게 제어할 수 있습니다.",
"enable_description_settings": "Elk가 열려 있지 않을 때 알림을 받으려면 푸시 알림을 사용 설정하세요. 푸시 알림을 사용 설정하면 동일한 화면에서 푸시 알림을 생성하는 상호 작용 유형을 정확하게 제어할 수 있습니다.",
"enable_desktop": "푸시 알림 활성화",
"enable_title": "어떤 것도 놓치지 마세요",
"re_auth": "사용 중인 서버가 푸시 알림을 지원하지 않는 것 같습니다. 로그아웃했다가 다시 로그인한 후에도 이 메시지가 계속 표시되면 서버 관리자에게 문의하세요."
}
}
},
"notifications_settings": "알림",
"preferences": {
"enable_autoplay": "자동 재생 활성화",
"enable_data_saving": "데이터 절약 활성화",
"enable_data_saving_description": "첨부파일이 자동으로 로드되지 않도록 설정하여 데이터를 절약하세요.",
"enable_pinch_to_zoom": "핀치하여 확대/축소 활성화",
"github_cards": "깃허브 카드",
"grayscale_mode": "그레이스케일 모드",
"hide_account_hover_card": "계정 호버 카드 숨기기",
"hide_alt_indi_on_posts": "포스트에서 대체 표시 숨기기",
"hide_boost_count": "부스트 갯수 숨기기",
"hide_favorite_count": "좋아요 갯수 숨기기",
"hide_follower_count": "팔로잉/팔로워 갯수 숨기기",
"hide_reply_count": "댓글 갯수 숨기기",
"hide_translation": "번역 숨기기",
"hide_username_emojis": "사용자 이름 이모지 숨기기",
"hide_username_emojis_description": "타임라인의 사용자 아이디에서 이모티콘을 숨깁니다. 이모티콘은 프로필에 계속 표시됩니다.",
"label": "개인 설정",
"title": "실험적 기능"
},
"profile": {
"appearance": {
"bio": "바이오",
"description": "아바타, 사용자명, 프로필 등",
"display_name": "표시 이름",
"label": "모양",
"profile_metadata": "프로필 메타데이터",
"profile_metadata_desc": "프로필에 최대 {0}개의 항목을 표로 표시할 수 있습니다",
"profile_metadata_label": "라벨",
"profile_metadata_value": "콘텐트",
"title": "프로필 수정"
},
"featured_tags": {
"description": "사람들은 이러한 해시태그로 공개 게시물을 검색할 수 있습니다.",
"label": "주요 해시태그"
},
"label": "프로필"
},
"select_a_settings": "설정 선택",
"users": {
"export": "사용자 토큰 내보내기",
"import": "사용자 토큰 가져오기",
"label": "로그인된 유저"
}
},
"state": {
"edited": "(수정됨)",
"editing": "수정 중",
"loading": "로딩 중...",
"publish_failed": "게시 실패",
"publishing": "게시 중",
"upload_failed": "업로드 실패",
"uploading": "업로드 중..."
},
"status": {
"boosted_by": "부스트 했습니다",
"edited": "수정함 {0}",
"img_alt": {
"ALT": "ALT",
"desc": "설명",
"dismiss": "닫기",
"read": "{0} 설명 읽기"
},
"poll": {
"count": "{0}투표|{0}투표|{0}투표",
"ends": "{0} 마감",
"finished": "{0} 마감됨"
},
"show_full_thread": "스레드 전체보기",
"someone": "누군가",
"spoiler_show_less": "최소한으로 보기",
"spoiler_show_more": "더 보기",
"thread": "스레드",
"try_original_site": "오리지널 사이트에서 시도하기"
},
"status_history": {
"created": "만듬 {0}",
"edited": "수정함 {0}"
},
"tab": {
"accounts": "계정",
"hashtags": "해시태크",
"list": "리스트",
"media": "미디어",
"news": "뉴스",
"notifications_all": "모두",
"notifications_mention": "멘션",
"posts": "포스트",
"posts_with_replies": "포스트&답글"
},
"tag": {
"follow": "팔로우",
"follow_label": "팔로우 {0}태그",
"unfollow": "언팔로우",
"unfollow_label": "언팔로우 {0}태그"
},
"time_ago_options": {
"day_future": "0일 후|내일|{n}일 후",
"day_past": "0일 전|어제|{n}일 전",
"hour_future": "0시간 후|1시간 후|{n} 시간",
"hour_past": "0시간 전|1시간 전|{n}시간 전",
"just_now": "지금",
"minute_future": "0분 후|1분|in {n}분 후",
"minute_past": "0분 전|1분 전|{n}분 전",
"month_future": "0 달|다음 달|{n}달 후",
"month_past": "0달 전|지난 달|{n}달 전",
"second_future": "지금|{n}초 후| {n}초 후",
"second_past": "지금|{n}초 전|{n}초 전",
"short_day_future": "{n}일",
"short_day_past": "{n}일",
"short_hour_future": "{n}시간",
"short_hour_past": "{n}시간",
"short_minute_future": "{n}분",
"short_minute_past": "{n}분",
"short_month_future": "{n}달",
"short_month_past": "{n}달",
"short_second_future": "{n}초",
"short_second_past": "{n}초",
"short_week_future": "{n}주",
"short_week_past": "{n}주",
"short_year_future": "{n}년",
"short_year_past": "{n}년",
"week_future": "0주 후|다음 주|{n}주 후",
"week_past": "0주 전|저번 주|{n}주 전",
"year_future": "0년 후|내년|{n} 년 후",
"year_past": "0년 전|작년|{n}년 전"
},
"timeline": {
"show_new_items": "{v}개의 새 툿 보기|{v}개의 새 툿 보기|{v}개의 새 툿 보기"
},
"tooltip": {
"add_content_warning": "콘텐츠 경고 추가",
"add_emojis": "이모지 추가",
"add_media": "이미지, 비디오, 오디오 파일 추가",
"add_publishable_content": "콘텐츠를 게시합니다",
"change_content_visibility": "콘텐츠 가시성 변경",
"change_language": "언어 변경",
"emoji": "이모지",
"open_editor_tools": "에디터 툴",
"pick_an_icon": "아이콘 선택",
"toggle_bold": "굵게",
"toggle_code_block": "코드 블록 토글",
"toggle_italic": "이탤릭 토글"
},
"visibility": {
"direct": "다이렉트",
"direct_desc": "멘션된 사용자만 볼 수 있음",
"private": "팔로워 전용",
"private_desc": "팔로워만 볼 수 있음",
"public": "공개",
"public_desc": "모두가 볼 수 있음",
"unlisted": "미등재",
"unlisted_desc": "모든 사용자에게 표시되지만, 발견하기 기능에서는 제외됨"
}
}

View File

@ -193,12 +193,6 @@
"about": {
"label": "Over"
},
"feature_flags": {
"github_cards": "GitHub Cards",
"title": "Experimentele Functies",
"user_picker": "Gebruiker Kiezer",
"virtual_scroll": "Virtueel Scrollen"
},
"interface": {
"color_mode": "Kleur Modus",
"dark_mode": "Donkere Modus",
@ -284,7 +278,6 @@
}
},
"state": {
"attachments_exceed_server_limit": "De hoeveelheid bijlagen is meer dan het limiet per post.",
"attachments_limit_error": "Limiet per post overschreden",
"edited": "(Aangepast)",

View File

@ -34,6 +34,7 @@
"posts": "Wpisy",
"posts_count": "{0} Wpisów|{0} Wpis|{0} Wpisy|{0} Wpisów",
"profile_description": "nagłówek profilu {0}",
"profile_personal_note": "Notatka osobista",
"profile_unavailable": "Profil niedostępny",
"request_follow": "Prośba o śledzenie",
"unblock": "Odblokuj",
@ -200,6 +201,7 @@
"save": "Zapisz zmiany"
},
"menu": {
"add_personal_note": "Dodaj osobistą notatkę do {0}",
"block_account": "Zablokuj {0}",
"block_domain": "Zablokuj domenę {0}",
"copy_link_to_post": "Skopiuj odnośnik do wpisu",
@ -214,6 +216,7 @@
"mute_conversation": "Wycisz ten wpis",
"open_in_original_site": "Otwórz na oryginalnej stronie",
"pin_on_profile": "Przypnij do profilu",
"remove_personal_note": "Usuń osobistą notatkę z {0}",
"share_post": "Udostępnij ten wpis",
"show_favourited_and_boosted_by": "Pokaż, kto dodał do ulubionych i udostępnił",
"show_reblogs": "Pokaż podbicia od {0}",

View File

@ -34,6 +34,7 @@
"posts": "Publicações",
"posts_count": "{0} Publicações|{0} Publicação|{0} Publicações",
"profile_description": "Descrição de perfil de {0}",
"profile_personal_note": "Nota Pessoal",
"profile_unavailable": "Perfil indisponível",
"request_follow": "Pedir para seguir",
"unblock": "Desbloquear",
@ -225,6 +226,7 @@
"sequence_then": "seguido de"
},
"menu": {
"add_personal_note": "Adicionar nota pessoal para {0}",
"block_account": "Bloquear {0}",
"block_domain": "Bloquear domínio {0}",
"copy_link_to_post": "Copiar ligação para esta publicação",
@ -239,6 +241,7 @@
"mute_conversation": "Silenciar esta publicação",
"open_in_original_site": "Abrir no sítio original",
"pin_on_profile": "Fixar no perfil",
"remove_personal_note": "Remover nota pessoal para {0}",
"share_post": "Partilhar esta publicação",
"show_favourited_and_boosted_by": "Mostrar quem adicionou aos favoritos e partilhou",
"show_reblogs": "Mostrar partilhas de {0}",
@ -494,6 +497,10 @@
"uploading": "A carregar..."
},
"status": {
"account": {
"suspended_message": "A conta de estado foi suspensa.",
"suspended_show": "Mostrar conteúdo mesmo assim?"
},
"boosted_by": "Partilhada Por",
"edited": "Editada {0}",
"favourited_by": "Adicionada Aos Favoritos Por",

View File

@ -59,7 +59,6 @@
"more": "Больше",
"next": "Следующее",
"prev": "Предыдущее",
"previous": "Предыдущее",
"publish": "Опубликовать",
"reply": "Ответить",
"reply_count": "{0}",
@ -90,11 +89,6 @@
"toggle_zen_mode": "Переключить режим дзен"
},
"common": {
"confirm_dialog": {
"cancel": "Нет",
"confirm": "Да",
"title": "Вы уверены?"
},
"end_of_list": "Конец списка",
"error": "ОШИБКА",
"in": "в",
@ -171,11 +165,6 @@
"copy_link_to_post": "Скопировать ссылку на этот пост",
"delete": "Удалить",
"delete_and_redraft": "Удалить и переписать",
"delete_confirm": {
"cancel": "Отменить",
"confirm": "Удалить",
"title": "Вы уверены, что хотите удалить этот пост?"
},
"direct_message_account": "Отправьте личное сообщение {0}",
"edit": "Редактировать",
"hide_reblogs": "Скрыть репосты от {0}",
@ -295,13 +284,6 @@
"font_size": "Размер текста",
"label": "Интерфейс",
"light_mode": "Светлая",
"size_label": {
"lg": "Большой",
"md": "Средний",
"sm": "Маленький",
"xl": "Очень большой",
"xs": "Очень маленький"
},
"system_mode": "Системная",
"theme_color": "Цвет"
},

View File

@ -99,8 +99,7 @@
"confirm": {
"common": {
"cancel": "Hayır",
"confirm": "Evet",
"title": "Emin misiniz?"
"confirm": "Evet"
},
"delete_posts": {
"cancel": "İptal et",

View File

@ -216,10 +216,6 @@
"description": "Відредагуйте налаштування облікового запису використовуєчи інтерфейс Mastodon",
"label": "Налаштування облікового запису"
},
"feature_flags": {
"github_cards": "GitHub картки",
"title": "Експериментальні налаштування"
},
"interface": {
"color_mode": "Кольорова тема",
"dark_mode": "Темна",

View File

@ -30,7 +30,6 @@
"mutuals": "互相關注",
"notifications_on_post_disable": "當 {username} 發布時,停止通知我",
"notifications_on_post_enable": "當 {username} 發布時,通知我",
"notify_on_post": "{username} 發文時通知我",
"pinned": "置頂的貼文",
"posts": "貼文",
"posts_count": "{0} 則貼文",
@ -63,7 +62,6 @@
"more": "更多",
"next": "下一個",
"prev": "上一個",
"previous": "之前的",
"publish": "發布",
"reply": "回覆",
"reply_count": "{0}",
@ -94,11 +92,6 @@
"toggle_zen_mode": "切換禪模式"
},
"common": {
"confirm_dialog": {
"cancel": "取消",
"confirm": "確認",
"title": "你確定嗎?"
},
"end_of_list": "清單到底了",
"error": "錯誤",
"in": "在",

View File

@ -93,12 +93,13 @@ export async function createI18n(): Promise<LocalizedWebManifest> {
src: 'pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any',
},
{
src: 'maskable-icon.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable',
purpose: 'maskable',
},
],
share_target: {
@ -140,12 +141,13 @@ export async function createI18n(): Promise<LocalizedWebManifest> {
src: 'pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any',
},
{
src: 'maskable-icon.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable',
purpose: 'maskable',
},
],
share_target: {

View File

@ -1,7 +1,7 @@
{
"name": "@elk-zone/elk",
"type": "module",
"version": "0.8.0",
"version": "0.8.1",
"packageManager": "pnpm@8.2.0",
"license": "MIT",
"homepage": "https://elk.zone/",
@ -23,6 +23,7 @@
"test:typecheck": "stale-dep && vue-tsc --noEmit && vue-tsc --noEmit --project service-worker/tsconfig.json",
"test": "nr test:unit",
"update:team:avatars": "esno scripts/avatars.ts",
"cleanup-translations": "esno scripts/cleanup-translations.ts",
"prepare-translation-status": "esno scripts/prepare-translation-status.ts",
"postinstall": "ignore-dependency-scripts \"stale-dep -u && simple-git-hooks && nuxi prepare && nr prepare-translation-status\"",
"release": "stale-dep && bumpp && esno scripts/release.ts"
@ -73,7 +74,7 @@
"lru-cache": "^9.0.1",
"masto": "^5.11.1",
"nuxt-security": "^0.13.0",
"nuxt-vitest": "^0.6.9",
"nuxt-vitest": "^0.6.10",
"page-lifecycle": "^0.1.2",
"pinia": "^2.0.34",
"postcss-nested": "^6.0.1",
@ -118,7 +119,7 @@
"flat": "^5.0.2",
"fs-extra": "^11.1.1",
"lint-staged": "^13.2.1",
"nuxt": "3.4.0",
"nuxt": "3.4.2",
"prettier": "^2.8.7",
"simple-git-hooks": "^2.8.1",
"typescript": "^5.0.4",

View File

@ -11,7 +11,7 @@ const paginator = account ? useMastoClient().v1.accounts.listFollowers(account.i
const isSelf = useSelfAccount(account)
if (account) {
useHead({
useHydratedHead({
title: () => `${t('account.followers')} | ${getDisplayName(account)} (@${account.acct})`,
})
}

View File

@ -11,7 +11,7 @@ const paginator = account ? useMastoClient().v1.accounts.listFollowing(account.i
const isSelf = useSelfAccount(account)
if (account) {
useHead({
useHydratedHead({
title: () => `${t('account.following')} | ${getDisplayName(account)} (@${account.acct})`,
})
}

View File

@ -17,7 +17,7 @@ function reorderAndFilter(items: mastodon.v1.Status[]) {
const paginator = useMastoClient().v1.accounts.listStatuses(account.id, { limit: 30, excludeReplies: true })
if (account) {
useHead({
useHydratedHead({
title: () => `${t('account.posts')} | ${getDisplayName(account)} (@${account.acct})`,
})
}

View File

@ -10,7 +10,7 @@ const account = await fetchAccountByHandle(handle)
const paginator = useMastoClient().v1.accounts.listStatuses(account.id, { onlyMedia: true, excludeReplies: false })
if (account) {
useHead({
useHydratedHead({
title: () => `${t('tab.media')} | ${getDisplayName(account)} (@${account.acct})`,
})
}

View File

@ -10,7 +10,7 @@ const account = await fetchAccountByHandle(handle)
const paginator = useMastoClient().v1.accounts.listStatuses(account.id, { excludeReplies: false })
if (account) {
useHead({
useHydratedHead({
title: () => `${t('tab.posts_with_replies')} | ${getDisplayName(account)} (@${account.acct})`,
})
}

View File

@ -7,7 +7,7 @@ const paginator = useMastoClient().v1.trends.listStatuses()
const hideNewsTips = useLocalStorage(STORAGE_KEY_HIDE_EXPLORE_POSTS_TIPS, false)
useHead({
useHydratedHead({
title: () => `${t('tab.posts')} | ${t('nav.explore')}`,
})
</script>

View File

@ -7,7 +7,7 @@ const paginator = useMastoClient().v1.trends.listLinks()
const hideNewsTips = useLocalStorage(STORAGE_KEY_HIDE_EXPLORE_NEWS_TIPS, false)
useHead({
useHydratedHead({
title: () => `${t('tab.news')} | ${t('nav.explore')}`,
})
</script>

View File

@ -10,7 +10,7 @@ const paginator = client.v1.trends.listTags({
const hideTagsTips = useLocalStorage(STORAGE_KEY_HIDE_EXPLORE_TAGS_TIPS, false)
useHead({
useHydratedHead({
title: () => `${t('tab.hashtags')} | ${t('nav.explore')}`,
})
</script>

View File

@ -4,7 +4,7 @@ const { t } = useI18n()
// limit: 20 is the default configuration of the official client
const paginator = useMastoClient().v2.suggestions.list({ limit: 20 })
useHead({
useHydratedHead({
title: () => `${t('tab.for_you')} | ${t('nav.explore')}`,
})
</script>

View File

@ -35,7 +35,7 @@ const { client } = $(useMasto())
const { data: listInfo, refresh } = $(await useAsyncData(() => client.v1.lists.fetch(list), { default: () => shallowRef() }))
if (listInfo) {
useHead({
useHydratedHead({
title: () => `${listInfo.title} | ${route.fullPath.endsWith('/accounts') ? t('tab.accounts') : t('tab.posts')} | ${t('nav.lists')}`,
})
}

View File

@ -11,7 +11,7 @@ const client = useMastoClient()
const paginator = client.v1.lists.list()
useHead({
useHydratedHead({
title: () => t('nav.lists'),
})

View File

@ -3,7 +3,7 @@
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('title.federated_timeline'),
})
</script>

View File

@ -2,7 +2,7 @@
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('title.local_timeline'),
})
</script>

View File

@ -13,7 +13,7 @@ const paginator = client.v1.timelines.listHashtag(tagName)
const stream = useStreaming(client => client.v1.stream.streamTagTimeline(tagName))
if (tag) {
useHead({
useHydratedHead({
title: () => `#${tag.name}`,
})
}

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.blocked_users'),
})
</script>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.bookmarks'),
})
</script>

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.compose'),
})
</script>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.conversations'),
})
</script>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.blocked_domains'),
})
</script>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.favourites'),
})
</script>

View File

@ -12,7 +12,7 @@ if (process.client && route.path === '/signin/callback')
router.push('/home')
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.home'),
})
</script>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.muted_users'),
})
</script>

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('tab.notifications_all')} | ${t('nav.notifications')}`,
})
</script>

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('tab.notifications_mention')} | ${t('nav.notifications')}`,
})
</script>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('account.pinned'),
})
</script>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => t('nav.settings'),
})
@ -22,12 +22,12 @@ const isRootPath = computedEager(() => route.name === 'settings')
<template #title>
<div timeline-title-style flex items-center gap-2 @click="$scrollToTop">
<div i-ri:settings-3-line />
<span>{{ $t('nav.settings') }}</span>
<span>{{ isHydrated ? $t('nav.settings') : '' }}</span>
</div>
</template>
<div xl:w-97 lg:w-78 w-full>
<SettingsItem
v-if="isHydrated && currentUser "
v-if="isHydrated && currentUser"
command
icon="i-ri:user-line"
:text="$t('settings.profile.label')"
@ -37,7 +37,7 @@ const isRootPath = computedEager(() => route.name === 'settings')
<SettingsItem
command
icon="i-ri-compasses-2-line"
:text="$t('settings.interface.label')"
:text="isHydrated ? $t('settings.interface.label') : ''"
to="/settings/interface"
:match="$route.path.startsWith('/settings/interface/')"
/>
@ -52,28 +52,28 @@ const isRootPath = computedEager(() => route.name === 'settings')
<SettingsItem
command
icon="i-ri-globe-line"
:text="$t('settings.language.label')"
:text="isHydrated ? $t('settings.language.label') : ''"
to="/settings/language"
:match="$route.path.startsWith('/settings/language/')"
/>
<SettingsItem
command
icon="i-ri-equalizer-line"
:text="$t('settings.preferences.label')"
:text="isHydrated ? $t('settings.preferences.label') : ''"
to="/settings/preferences"
:match="$route.path.startsWith('/settings/preferences/')"
/>
<SettingsItem
command
icon="i-ri-group-line"
:text="$t('settings.users.label')"
:text="isHydrated ? $t('settings.users.label') : ''"
to="/settings/users"
:match="$route.path.startsWith('/settings/users/')"
/>
<SettingsItem
command
icon="i-ri:information-line"
:text="$t('settings.about.label')"
:text="isHydrated ? $t('settings.about.label') : ''"
to="/settings/about"
:match="$route.path.startsWith('/settings/about/')"
/>

View File

@ -2,7 +2,7 @@
const buildInfo = useBuildInfo()
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.about.label')} | ${t('nav.settings')}`,
})

View File

@ -2,7 +2,7 @@
<div min-h-screen flex justify-center items-center>
<div text-center flex="~ col gap-2" items-center>
<div i-ri:settings-3-line text-5xl />
<span text-xl>{{ $t('settings.select_a_settings') }}</span>
<span text-xl>{{ isHydrated ? $t('settings.select_a_settings') : '' }}</span>
</div>
</div>
</template>

View File

@ -1,7 +1,7 @@
<script setup lang="ts">
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.interface.label')} | ${t('nav.settings')}`,
})
</script>

View File

@ -5,7 +5,7 @@ const { t, locale } = useI18n()
const translationStatus: ElkTranslationStatus = await import('~/elk-translation-status.json').then(m => m.default)
useHead({
useHydratedHead({
title: () => `${t('settings.language.label')} | ${t('nav.settings')}`,
})
const status = computed(() => {

View File

@ -6,7 +6,7 @@ definePageMeta({
const { t } = useI18n()
const pwaEnabled = useAppConfig().pwaEnabled
useHead({
useHydratedHead({
title: () => `${t('settings.notifications.label')} | ${t('nav.settings')}`,
})
</script>
@ -15,20 +15,20 @@ useHead({
<MainContent back-on-small-screen>
<template #title>
<div text-lg font-bold flex items-center gap-2 @click="$scrollToTop">
<span>{{ $t('settings.notifications.label') }}</span>
<span>{{ isHydrated ? $t('settings.notifications.label') : '' }}</span>
</div>
</template>
<SettingsItem
command
:text="$t('settings.notifications.notifications.label')"
:text="isHydrated ? $t('settings.notifications.notifications.label') : ''"
to="/settings/notifications/notifications"
/>
<SettingsItem
command
:disabled="!pwaEnabled"
:text="$t('settings.notifications.push_notifications.label')"
:description="$t('settings.notifications.push_notifications.description')"
:text="isHydrated ? $t('settings.notifications.push_notifications.label') : ''"
:description="isHydrated ? $t('settings.notifications.push_notifications.description') : ''"
to="/settings/notifications/push-notifications"
/>
</MainContent>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.notifications.notifications.label')} | ${t('settings.notifications.label')} | ${t('nav.settings')}`,
})
</script>
@ -14,14 +14,14 @@ useHead({
<MainContent back>
<template #title>
<div text-lg font-bold flex items-center gap-2 @click="$scrollToTop">
<span>{{ $t('settings.notifications.notifications.label') }}</span>
<span>{{ isHydrated ? $t('settings.notifications.notifications.label') : '' }}</span>
</div>
</template>
<h3 px6 py4 mt2 font-bold text-xl flex="~ gap-1" items-center>
{{ $t('settings.notifications.notifications.label') }}
{{ isHydrated ? $t('settings.notifications.notifications.label') : '' }}
</h3>
<p text-4xl text-center>
<span sr-only>{{ $t('settings.notifications.under_construction') }}</span> 🚧
<span sr-only>{{ isHydrated ? $t('settings.notifications.under_construction') : '' }}</span> 🚧
</p>
</MainContent>
</template>

View File

@ -8,7 +8,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.notifications.push_notifications.label')} | ${t('settings.notifications.label')} | ${t('nav.settings')}`,
})
</script>
@ -17,7 +17,7 @@ useHead({
<MainContent back>
<template #title>
<div text-lg font-bold flex items-center gap-2 @click="$scrollToTop">
<span>{{ $t('settings.notifications.push_notifications.label') }}</span>
<span>{{ isHydrated ? $t('settings.notifications.push_notifications.label') : '' }}</span>
</div>
</template>
<NotificationPreferences show />

View File

@ -1,7 +1,7 @@
<script setup lang="ts">
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.preferences.label')} | ${t('nav.settings')}`,
})
@ -92,6 +92,15 @@ const userSettings = useUserSettings()
{{ $t('settings.preferences.hide_username_emojis_description') }}
</template>
</SettingsToggleItem>
<SettingsToggleItem
:checked="getPreferences(userSettings, 'zenMode')"
@click="togglePreferences('zenMode')"
>
{{ $t("settings.preferences.zen_mode") }}
<template #description>
{{ $t('settings.preferences.zen_mode_description') }}
</template>
</SettingsToggleItem>
<h2 px6 py4 mt2 font-bold text-xl flex="~ gap-1" items-center>
<div i-ri-flask-line />
{{ $t('settings.preferences.title') }}

View File

@ -9,7 +9,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.profile.appearance.title')} | ${t('nav.settings')}`,
})
@ -71,6 +71,12 @@ const { submit, submitting } = submitter(async ({ dirtyFields }) => {
return
}
const server = currentUser.value!.server
if (!res.account.acct.includes('@'))
res.account.acct = `${res.account.acct}@${server}`
cacheAccount(res.account, server, true)
currentUser.value!.account = res.account
reset()
})

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.profile.featured_tags.label')} | ${t('nav.settings')}`,
})
</script>

View File

@ -5,7 +5,7 @@ definePageMeta({
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.profile.label')} | ${t('nav.settings')}`,
})
</script>
@ -14,22 +14,22 @@ useHead({
<MainContent back-on-small-screen>
<template #title>
<div text-lg font-bold flex items-center gap-2 @click="$scrollToTop">
<span>{{ $t('settings.profile.label') }}</span>
<span>{{ isHydrated ? $t('settings.profile.label') : '' }}</span>
</div>
</template>
<SettingsItem
command large
icon="i-ri:user-settings-line"
:text="$t('settings.profile.appearance.label')"
:description="$t('settings.profile.appearance.description')"
:text="isHydrated ? $t('settings.profile.appearance.label') : ''"
:description="isHydrated ? $t('settings.profile.appearance.description') : ''"
to="/settings/profile/appearance"
/>
<SettingsItem
command large
icon="i-ri:hashtag"
:text="$t('settings.profile.featured_tags.label')"
:description="$t('settings.profile.featured_tags.description')"
:text="isHydrated ? $t('settings.profile.featured_tags.label') : ''"
:description="isHydrated ? $t('settings.profile.featured_tags.description') : ''"
to="/settings/profile/featured-tags"
/>
<SettingsItem

View File

@ -5,7 +5,7 @@ import type { UserLogin } from '~/types'
const { t } = useI18n()
useHead({
useHydratedHead({
title: () => `${t('settings.users.label')} | ${t('nav.settings')}`,
})

View File

@ -2,7 +2,6 @@ import type { RouteLocationRaw } from 'vue-router'
import { useMagicSequence } from '~/composables/magickeys'
export default defineNuxtPlugin(({ $scrollToTop }) => {
const userSettings = useUserSettings()
const keys = useMagicKeys()
const router = useRouter()
@ -23,7 +22,6 @@ export default defineNuxtPlugin(({ $scrollToTop }) => {
}
whenever(logicAnd(notUsingInput, keys['?']), toggleKeyboardShortcuts)
whenever(logicAnd(notUsingInput, keys.z), () => userSettings.value.zenMode = !userSettings.value.zenMode)
const defaultPublishDialog = () => {
const current = keys.current

View File

@ -10,7 +10,7 @@ export default defineNuxtPlugin(() => {
html.style.setProperty('--font-size', fontSize ? (oldFontSizeMap[fontSize as OldFontSize] ?? fontSize) : DEFAULT_FONT_SIZE)
})
watchEffect(() => {
html.classList.toggle('zen', userSettings.value.zenMode)
html.classList.toggle('zen', userSettings.value.preferences.zenMode)
})
watchEffect(() => {
Object.entries(userSettings.value.themeColors || {}).forEach(([k, v]) => html.style.setProperty(k, v))

View File

@ -25,7 +25,7 @@ export default defineNuxtPlugin(() => {
if (settings.language) {
html.setAttribute('lang', settings.language)
}
if (settings.zenMode) {
if (settings.preferences.zenMode) {
html.classList.add('zen')
}
if (settings.themeColors) {

View File

@ -11,6 +11,9 @@ export default defineNuxtPlugin(async (nuxt) => {
if (!supportLanguages.includes(lang))
userSettings.value.language = getDefaultLanguage(supportLanguages)
if (lang !== i18n.locale)
await setLocale(userSettings.value.language)
watch([$$(lang), isHydrated], () => {
if (isHydrated.value && lang !== i18n.locale)
setLocale(lang)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,66 @@
import { Buffer } from 'node:buffer'
import flatten from 'flat'
import { createResolver } from '@nuxt/kit'
import fs from 'fs-extra'
import { currentLocales } from '../config/i18n'
const resolver = createResolver(import.meta.url)
const sourceLanguageLocale = currentLocales.find(l => l.code === 'en-US')!
function merge(src: Record<string, any>, dst: Record<string, any>) {
for (const key in src) {
if (typeof src[key] === 'object') {
if (!dst[key])
dst[key] = {}
merge(src[key], dst[key])
}
else {
dst[key] = src[key]
}
}
}
const sourceFiles: string[] = sourceLanguageLocale.files ? sourceLanguageLocale.files : [sourceLanguageLocale.file!]
const sourceTranslations: Record<string, string> = {}
for (const file of sourceFiles) {
const data = JSON.parse(Buffer.from(
await fs.readFile(resolver.resolve(`../locales/${file}`), 'utf-8'),
).toString()) as Record<string, unknown>
merge(flatten(data), sourceTranslations)
}
async function removeOutdatedTranslations() {
for (const locale of currentLocales.filter(l => l.code !== 'en-US')) {
const files: string[] = locale.files ? locale.files : [locale.file!]
for (const file of files) {
const path = resolver.resolve(`../locales/${file}`)
const data = JSON.parse(Buffer.from(
await fs.readFile(path, 'utf-8'),
).toString())
const targetTranslations: Record<string, string> = flatten(data)
for (const key in targetTranslations) {
if (!sourceTranslations[key])
delete targetTranslations[key]
}
const unflattened = flatten.unflatten(targetTranslations)
await fs.writeFile(
path,
`${JSON.stringify(unflattened, null, 2)}\n`,
{ encoding: 'utf-8' },
)
}
}
}
removeOutdatedTranslations()

View File

@ -34,25 +34,17 @@ body {
display: none;
}
.custom-emoji {
display: inline-block;
vertical-align: text-bottom;
}
.content-editor img.custom-emoji,
.custom-emoji img {
max-height: 1.3em;
max-width: 1.3em;
object-fit: contain;
}
.custom-emoji img,
.iconify-emoji {
display: inline-block;
height: 1.2em;
width: 1.2em;
margin-right: 0.075em;
margin-left: 0.075em;
object-fit: contain;
overflow: hidden;
max-height: 1.2em;
max-width: 1.2em;
vertical-align: text-bottom;
margin: 0 0.1em;
vertical-align: -20%;
}
.iconify-emoji-padded {