mirror of
https://github.com/elk-zone/elk.git
synced 2024-11-21 17:05:22 +03:00
Merge branch 'main' into 1931-filter-for-home-timeline
This commit is contained in:
commit
0495b115e9
88 changed files with 2117 additions and 919 deletions
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 },
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
|
|
@ -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)]"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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')">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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')
|
||||
},
|
||||
})
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -13,6 +13,6 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"@nuxt-themes/docus": "^1.10.1",
|
||||
"nuxt": "^3.4.0"
|
||||
"nuxt": "^3.4.2"
|
||||
}
|
||||
}
|
||||
|
|
116
locales/ar.json
116
locales/ar.json
|
@ -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": "اختر خادم ماستودون الخاص بك وقم بتسجيل حساب"
|
||||
},
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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
630
locales/it-IT.json
Normal 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
484
locales/ko-KR.json
Normal 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": "모든 사용자에게 표시되지만, 발견하기 기능에서는 제외됨"
|
||||
}
|
||||
}
|
|
@ -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)",
|
||||
|
|
|
@ -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}",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "Цвет"
|
||||
},
|
||||
|
|
|
@ -99,8 +99,7 @@
|
|||
"confirm": {
|
||||
"common": {
|
||||
"cancel": "Hayır",
|
||||
"confirm": "Evet",
|
||||
"title": "Emin misiniz?"
|
||||
"confirm": "Evet"
|
||||
},
|
||||
"delete_posts": {
|
||||
"cancel": "İptal et",
|
||||
|
|
|
@ -216,10 +216,6 @@
|
|||
"description": "Відредагуйте налаштування облікового запису використовуєчи інтерфейс Mastodon",
|
||||
"label": "Налаштування облікового запису"
|
||||
},
|
||||
"feature_flags": {
|
||||
"github_cards": "GitHub картки",
|
||||
"title": "Експериментальні налаштування"
|
||||
},
|
||||
"interface": {
|
||||
"color_mode": "Кольорова тема",
|
||||
"dark_mode": "Темна",
|
||||
|
|
|
@ -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": "在",
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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})`,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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})`,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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})`,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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})`,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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})`,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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')}`,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ const client = useMastoClient()
|
|||
|
||||
const paginator = client.v1.lists.list()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.lists'),
|
||||
})
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('title.federated_timeline'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('title.local_timeline'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -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}`,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ definePageMeta({
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.blocked_users'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -5,7 +5,7 @@ definePageMeta({
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.bookmarks'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script setup lang="ts">
|
||||
const { t } = useI18n()
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.compose'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -5,7 +5,7 @@ definePageMeta({
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.conversations'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -5,7 +5,7 @@ definePageMeta({
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.blocked_domains'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -5,7 +5,7 @@ definePageMeta({
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.favourites'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -12,7 +12,7 @@ if (process.client && route.path === '/signin/callback')
|
|||
router.push('/home')
|
||||
|
||||
const { t } = useI18n()
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.home'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -5,7 +5,7 @@ definePageMeta({
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('nav.muted_users'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script setup lang="ts">
|
||||
const { t } = useI18n()
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => `${t('tab.notifications_all')} | ${t('nav.notifications')}`,
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script setup lang="ts">
|
||||
const { t } = useI18n()
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => `${t('tab.notifications_mention')} | ${t('nav.notifications')}`,
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -5,7 +5,7 @@ definePageMeta({
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => t('account.pinned'),
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -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/')"
|
||||
/>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
const buildInfo = useBuildInfo()
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => `${t('settings.about.label')} | ${t('nav.settings')}`,
|
||||
})
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<script setup lang="ts">
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => `${t('settings.interface.label')} | ${t('nav.settings')}`,
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -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(() => {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 />
|
||||
|
|
|
@ -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') }}
|
||||
|
|
|
@ -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()
|
||||
})
|
||||
|
|
|
@ -5,7 +5,7 @@ definePageMeta({
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => `${t('settings.profile.featured_tags.label')} | ${t('nav.settings')}`,
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -5,7 +5,7 @@ import type { UserLogin } from '~/types'
|
|||
|
||||
const { t } = useI18n()
|
||||
|
||||
useHead({
|
||||
useHydratedHead({
|
||||
title: () => `${t('settings.users.label')} | ${t('nav.settings')}`,
|
||||
})
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
|
1149
pnpm-lock.yaml
1149
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
66
scripts/cleanup-translations.ts
Normal file
66
scripts/cleanup-translations.ts
Normal 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()
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue