mirror of
https://github.com/modrinth/code.git
synced 2026-07-31 21:26:40 +00:00
feat: move users page to xplat page system (#6889)
* feat: move users page to xplat * feat: stop doing tauri plugin open for user links * feat: qa * fix: qa * fix: qa * fix: comment * fix: prepr * prepr * prepr * prepr --------- Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
This commit is contained in:
@@ -115,6 +115,7 @@ import { mergeUrlQuery, parseModrinthLink } from '@/helpers/project-links.ts'
|
|||||||
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
|
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
|
||||||
import { get_opening_command, initialize_state } from '@/helpers/state'
|
import { get_opening_command, initialize_state } from '@/helpers/state'
|
||||||
import { hasActivePride26Midas, hasMidasBadge } from '@/helpers/user-campaigns.ts'
|
import { hasActivePride26Midas, hasMidasBadge } from '@/helpers/user-campaigns.ts'
|
||||||
|
import { parse_modrinth_user_link } from '@/helpers/users'
|
||||||
import {
|
import {
|
||||||
areUpdatesEnabled,
|
areUpdatesEnabled,
|
||||||
enqueueUpdateForInstallation,
|
enqueueUpdateForInstallation,
|
||||||
@@ -265,7 +266,7 @@ providePageContext({
|
|||||||
themeStore.getFeatureFlag('server_ram_as_bytes_always_on'),
|
themeStore.getFeatureFlag('server_ram_as_bytes_always_on'),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
openExternalUrl: (url) => openUrl(url),
|
openExternalUrl: (url) => void openUrl(url),
|
||||||
})
|
})
|
||||||
provideModalBehavior({
|
provideModalBehavior({
|
||||||
noblur: computed(() => !themeStore.advancedRendering),
|
noblur: computed(() => !themeStore.advancedRendering),
|
||||||
@@ -966,7 +967,7 @@ async function declineServerInviteNotification(notification) {
|
|||||||
|
|
||||||
function openServerInviteInviterProfile(inviterName) {
|
function openServerInviteInviterProfile(inviterName) {
|
||||||
if (!inviterName) return
|
if (!inviterName) return
|
||||||
openUrl(`${config.siteUrl}/user/${encodeURIComponent(inviterName)}`)
|
void router.push(`/user/${encodeURIComponent(inviterName)}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleLiveNotification(notification) {
|
async function handleLiveNotification(notification) {
|
||||||
@@ -1407,8 +1408,11 @@ function handleClick(e) {
|
|||||||
!target.href.startsWith('https://tauri.localhost') &&
|
!target.href.startsWith('https://tauri.localhost') &&
|
||||||
!target.href.startsWith('http://tauri.localhost')
|
!target.href.startsWith('http://tauri.localhost')
|
||||||
) {
|
) {
|
||||||
|
const userPath = parse_modrinth_user_link(target.href)
|
||||||
const parsed = parseModrinthLink(target.href)
|
const parsed = parseModrinthLink(target.href)
|
||||||
if (target.target !== '_blank' && parsed) {
|
if (userPath) {
|
||||||
|
void router.push(userPath)
|
||||||
|
} else if (target.target !== '_blank' && parsed) {
|
||||||
void openModrinthProjectLinkInApp(parsed)
|
void openModrinthProjectLinkInApp(parsed)
|
||||||
} else {
|
} else {
|
||||||
openUrl(target.href)
|
openUrl(target.href)
|
||||||
@@ -1654,7 +1658,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
:options="[
|
:options="[
|
||||||
{
|
{
|
||||||
id: 'view-profile',
|
id: 'view-profile',
|
||||||
action: () => openUrl('https://modrinth.com/user/' + credentials.user.username),
|
action: () => router.push(`/user/${encodeURIComponent(credentials.user.username)}`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'sign-out',
|
id: 'sign-out',
|
||||||
|
|||||||
@@ -8,13 +8,14 @@ import {
|
|||||||
OverflowMenu,
|
OverflowMenu,
|
||||||
useVIntl,
|
useVIntl,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
|
||||||
import { useTemplateRef } from 'vue'
|
import { useTemplateRef } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
import ContextMenu from '@/components/ui/ContextMenu.vue'
|
import ContextMenu from '@/components/ui/ContextMenu.vue'
|
||||||
import type { FriendWithUserData } from '@/helpers/friends.ts'
|
import type { FriendWithUserData } from '@/helpers/friends.ts'
|
||||||
|
|
||||||
const { formatMessage } = useVIntl()
|
const { formatMessage } = useVIntl()
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
const props = withDefaults(
|
const props = withDefaults(
|
||||||
defineProps<{
|
defineProps<{
|
||||||
@@ -54,7 +55,7 @@ function createContextMenuOptions(friend: FriendWithUserData) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function openProfile(username: string) {
|
function openProfile(username: string) {
|
||||||
openUrl('https://modrinth.com/user/' + username)
|
void router.push(`/user/${encodeURIComponent(username)}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const friendOptions = useTemplateRef('friendOptions')
|
const friendOptions = useTemplateRef('friendOptions')
|
||||||
|
|||||||
@@ -186,8 +186,8 @@ import {
|
|||||||
type TeleportOverflowMenuItem,
|
type TeleportOverflowMenuItem,
|
||||||
useVIntl,
|
useVIntl,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
|
||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
import type { GameInstance } from '@/helpers/types'
|
import type { GameInstance } from '@/helpers/types'
|
||||||
|
|
||||||
@@ -247,6 +247,7 @@ const messages = defineMessages({
|
|||||||
defaultMessage: "This instance's content is being shared to other users.",
|
defaultMessage: "This instance's content is being shared to other users.",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
const props = withDefaults(
|
const props = withDefaults(
|
||||||
defineProps<{
|
defineProps<{
|
||||||
@@ -331,7 +332,7 @@ const sharedInstanceManagerLabel = computed(() =>
|
|||||||
const sharedInstanceManagerAction = computed(() => {
|
const sharedInstanceManagerAction = computed(() => {
|
||||||
const manager = props.sharedInstanceManager
|
const manager = props.sharedInstanceManager
|
||||||
if (manager?.type !== 'user') return undefined
|
if (manager?.type !== 'user') return undefined
|
||||||
return () => openUrl(`https://modrinth.com/user/${encodeURIComponent(manager.name)}`)
|
return () => router.push(`/user/${encodeURIComponent(manager.name)}`)
|
||||||
})
|
})
|
||||||
const playtimeLabel = computed(() => {
|
const playtimeLabel = computed(() => {
|
||||||
if (props.timePlayed <= 0) return formatMessage(messages.neverPlayed)
|
if (props.timePlayed <= 0) return formatMessage(messages.neverPlayed)
|
||||||
|
|||||||
+1
-3
@@ -6,11 +6,9 @@ import {
|
|||||||
injectPopupNotificationManager,
|
injectPopupNotificationManager,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { useQueryClient } from '@tanstack/vue-query'
|
import { useQueryClient } from '@tanstack/vue-query'
|
||||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
|
||||||
import { type Ref, watch } from 'vue'
|
import { type Ref, watch } from 'vue'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
import { config } from '@/config'
|
|
||||||
import { get_user } from '@/helpers/cache'
|
import { get_user } from '@/helpers/cache'
|
||||||
import { toError } from '@/helpers/errors'
|
import { toError } from '@/helpers/errors'
|
||||||
import {
|
import {
|
||||||
@@ -216,7 +214,7 @@ export function useSharedInstanceInviteHandler(
|
|||||||
markNotificationRead(notification).catch((error) => handleError(toError(error))),
|
markNotificationRead(notification).catch((error) => handleError(toError(error))),
|
||||||
onOpenActor: () => {
|
onOpenActor: () => {
|
||||||
if (invite.invitedByUsername) {
|
if (invite.invitedByUsername) {
|
||||||
openUrl(`${config.siteUrl}/user/${encodeURIComponent(invite.invitedByUsername)}`)
|
void router.push(`/user/${encodeURIComponent(invite.invitedByUsername)}`)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,11 +1,56 @@
|
|||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
import { invoke } from '@tauri-apps/api/core'
|
import { invoke } from '@tauri-apps/api/core'
|
||||||
|
|
||||||
export type SearchUser = {
|
// Converts user profile links from rendered Markdown/any dynamic content into app routes.
|
||||||
id: string
|
export function parse_modrinth_user_link(href: string): string | null {
|
||||||
username: string
|
try {
|
||||||
avatar_url: string | null
|
const url = new URL(href)
|
||||||
|
if (url.hostname !== 'modrinth.com' && url.hostname !== 'www.modrinth.com') return null
|
||||||
|
|
||||||
|
const segments = url.pathname.split('/').filter(Boolean)
|
||||||
|
if (segments[0]?.toLowerCase() !== 'user' || !segments[1] || segments.length > 3) return null
|
||||||
|
|
||||||
|
const path = `/user/${encodeURIComponent(decodeURIComponent(segments[1]))}`
|
||||||
|
return segments[2] ? `${path}/${encodeURIComponent(decodeURIComponent(segments[2]))}` : path
|
||||||
|
} catch {
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function search_user(query: string): Promise<SearchUser[]> {
|
export async function search_user(query: string): Promise<Labrinth.Users.v3.SearchUser[]> {
|
||||||
return await invoke<SearchUser[]>('plugin:users|search_user', { query })
|
return await invoke<Labrinth.Users.v3.SearchUser[]>('plugin:users|search_user', { query })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function get_user_profile(userId: string): Promise<Labrinth.Users.v3.User> {
|
||||||
|
return await invoke<Labrinth.Users.v3.User>('plugin:users|get_user_profile', { userId })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function get_user_projects(userId: string): Promise<Labrinth.Projects.v2.Project[]> {
|
||||||
|
return await invoke<Labrinth.Projects.v2.Project[]>('plugin:users|get_user_projects', {
|
||||||
|
userId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function get_user_organizations(
|
||||||
|
userId: string,
|
||||||
|
): Promise<Labrinth.Organizations.v3.Organization[]> {
|
||||||
|
return await invoke<Labrinth.Organizations.v3.Organization[]>(
|
||||||
|
'plugin:users|get_user_organizations',
|
||||||
|
{ userId },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function get_user_collections(
|
||||||
|
userId: string,
|
||||||
|
): Promise<Labrinth.Collections.Collection[]> {
|
||||||
|
return await invoke<Labrinth.Collections.Collection[]>('plugin:users|get_user_collections', {
|
||||||
|
userId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function patch_user(
|
||||||
|
userId: string,
|
||||||
|
patch: Partial<Pick<Labrinth.Users.v3.User, 'badges' | 'role'>>,
|
||||||
|
): Promise<void> {
|
||||||
|
await invoke('plugin:users|patch_user', { userId, patch })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
<template>
|
||||||
|
<div class="w-full pt-2">
|
||||||
|
<UserProfilePageLayout
|
||||||
|
:user-id="userId"
|
||||||
|
:project-type="projectType"
|
||||||
|
variant="app"
|
||||||
|
site-url="https://modrinth.com"
|
||||||
|
project-link-mode="app"
|
||||||
|
external-navigation
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { provideUserProfile, UserProfilePageLayout } from '@modrinth/ui'
|
||||||
|
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||||
|
import { computed, watch } from 'vue'
|
||||||
|
import { onBeforeRouteUpdate, useRoute } from 'vue-router'
|
||||||
|
|
||||||
|
import {
|
||||||
|
get_user_collections,
|
||||||
|
get_user_organizations,
|
||||||
|
get_user_profile,
|
||||||
|
get_user_projects,
|
||||||
|
patch_user,
|
||||||
|
} from '@/helpers/users'
|
||||||
|
import { useBreadcrumbs } from '@/store/breadcrumbs'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
const breadcrumbs = useBreadcrumbs()
|
||||||
|
const userProfile = provideUserProfile({
|
||||||
|
getUser: get_user_profile,
|
||||||
|
getProjects: get_user_projects,
|
||||||
|
getOrganizations: get_user_organizations,
|
||||||
|
getCollections: get_user_collections,
|
||||||
|
patchUser: patch_user,
|
||||||
|
})
|
||||||
|
|
||||||
|
const userId = computed(() => {
|
||||||
|
const value = route.params.user
|
||||||
|
return Array.isArray(value) ? (value[0] ?? '') : (value ?? '')
|
||||||
|
})
|
||||||
|
const projectType = computed(() => {
|
||||||
|
const value = route.params.projectType
|
||||||
|
return Array.isArray(value) ? value[0] : value
|
||||||
|
})
|
||||||
|
|
||||||
|
async function ensureUserProfileData(id: string): Promise<void> {
|
||||||
|
if (!id) return
|
||||||
|
|
||||||
|
let breadcrumbName = id
|
||||||
|
try {
|
||||||
|
const user = await queryClient.ensureQueryData({
|
||||||
|
queryKey: ['user', id],
|
||||||
|
queryFn: () => userProfile.getUser(id),
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
breadcrumbName = user.username
|
||||||
|
} catch {
|
||||||
|
// Let the mounted layout's useQuery surface errors; do not fail route setup.
|
||||||
|
}
|
||||||
|
|
||||||
|
await Promise.allSettled([
|
||||||
|
queryClient.ensureQueryData({
|
||||||
|
queryKey: ['user', id, 'projects'],
|
||||||
|
queryFn: () => userProfile.getProjects(id),
|
||||||
|
staleTime: 30_000,
|
||||||
|
}),
|
||||||
|
queryClient.ensureQueryData({
|
||||||
|
queryKey: ['user', id, 'organizations'],
|
||||||
|
queryFn: () => userProfile.getOrganizations(id),
|
||||||
|
staleTime: 30_000,
|
||||||
|
}),
|
||||||
|
queryClient.ensureQueryData({
|
||||||
|
queryKey: ['user', id, 'collections'],
|
||||||
|
queryFn: () => userProfile.getCollections(id),
|
||||||
|
staleTime: 30_000,
|
||||||
|
}),
|
||||||
|
])
|
||||||
|
|
||||||
|
breadcrumbs.setName('User', breadcrumbName)
|
||||||
|
}
|
||||||
|
|
||||||
|
onBeforeRouteUpdate(async (to) => {
|
||||||
|
const value = to.params.user
|
||||||
|
const id = Array.isArray(value) ? (value[0] ?? '') : (value ?? '')
|
||||||
|
await ensureUserProfileData(id)
|
||||||
|
})
|
||||||
|
|
||||||
|
breadcrumbs.setName('User', userId.value)
|
||||||
|
await ensureUserProfileData(userId.value)
|
||||||
|
|
||||||
|
const { data: user } = useQuery({
|
||||||
|
queryKey: computed(() => ['user', userId.value]),
|
||||||
|
queryFn: () => userProfile.getUser(userId.value),
|
||||||
|
enabled: false,
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(
|
||||||
|
[userId, user],
|
||||||
|
([currentUserId, value]) => {
|
||||||
|
breadcrumbs.setName('User', value?.username ?? currentUserId)
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
||||||
|
</script>
|
||||||
@@ -5,7 +5,6 @@ import {
|
|||||||
ServersManageAccessPage,
|
ServersManageAccessPage,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { useQueryClient } from '@tanstack/vue-query'
|
import { useQueryClient } from '@tanstack/vue-query'
|
||||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
|
||||||
|
|
||||||
const client = injectModrinthClient()
|
const client = injectModrinthClient()
|
||||||
const { serverId } = injectModrinthServerContext()
|
const { serverId } = injectModrinthServerContext()
|
||||||
@@ -29,7 +28,7 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function userProfileLink(username: string) {
|
function userProfileLink(username: string) {
|
||||||
return () => openUrl(`https://modrinth.com/user/${encodeURIComponent(username)}`)
|
return `/user/${encodeURIComponent(username)}`
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import Browse from './Browse.vue'
|
|||||||
import Index from './Index.vue'
|
import Index from './Index.vue'
|
||||||
import Servers from './Servers.vue'
|
import Servers from './Servers.vue'
|
||||||
import Skins from './Skins.vue'
|
import Skins from './Skins.vue'
|
||||||
|
import User from './User.vue'
|
||||||
import Worlds from './Worlds.vue'
|
import Worlds from './Worlds.vue'
|
||||||
|
|
||||||
export { Browse, Index, Servers, Skins, Worlds }
|
export { Browse, Index, Servers, Skins, User, Worlds }
|
||||||
|
|||||||
@@ -198,6 +198,13 @@ const messages = defineMessages({
|
|||||||
|
|
||||||
let savedModalState: ModpackContentModalState | null = null
|
let savedModalState: ModpackContentModalState | null = null
|
||||||
|
|
||||||
|
function contentOwnerLink(owner: ContentOwner): NonNullable<ContentOwner['link']> {
|
||||||
|
if (owner.type === 'user') return `/user/${encodeURIComponent(owner.id)}`
|
||||||
|
return () => {
|
||||||
|
void openUrl(`https://modrinth.com/organization/${owner.id}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const { formatMessage } = useVIntl()
|
const { formatMessage } = useVIntl()
|
||||||
const { handleError, addNotification } = injectNotificationManager()
|
const { handleError, addNotification } = injectNotificationManager()
|
||||||
const { installingItems, installRevisionByInstance, installFailureRevisionByInstance } =
|
const { installingItems, installRevisionByInstance, installFailureRevisionByInstance } =
|
||||||
@@ -1390,10 +1397,7 @@ provideContentManager({
|
|||||||
owner: linkedModpackOwner.value
|
owner: linkedModpackOwner.value
|
||||||
? {
|
? {
|
||||||
...linkedModpackOwner.value,
|
...linkedModpackOwner.value,
|
||||||
link: () =>
|
link: contentOwnerLink(linkedModpackOwner.value),
|
||||||
openUrl(
|
|
||||||
`https://modrinth.com/${linkedModpackOwner.value!.type}/${linkedModpackOwner.value!.id}`,
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
categories: linkedModpackCategories.value,
|
categories: linkedModpackCategories.value,
|
||||||
@@ -1491,7 +1495,7 @@ provideContentManager({
|
|||||||
owner: item.owner
|
owner: item.owner
|
||||||
? {
|
? {
|
||||||
...item.owner,
|
...item.owner,
|
||||||
link: () => openUrl(`https://modrinth.com/${item.owner!.type}/${item.owner!.id}`),
|
link: contentOwnerLink(item.owner),
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
enabled: canMutateContent(item) ? item.enabled : undefined,
|
enabled: canMutateContent(item) ? item.enabled : undefined,
|
||||||
|
|||||||
@@ -138,7 +138,6 @@ import {
|
|||||||
useVIntl,
|
useVIntl,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { useQueryClient } from '@tanstack/vue-query'
|
import { useQueryClient } from '@tanstack/vue-query'
|
||||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
|
||||||
import { computed, ref, toRef, watch } from 'vue'
|
import { computed, ref, toRef, watch } from 'vue'
|
||||||
|
|
||||||
import ModrinthAccountRequiredModal from '@/components/ui/modal/ModrinthAccountRequiredModal.vue'
|
import ModrinthAccountRequiredModal from '@/components/ui/modal/ModrinthAccountRequiredModal.vue'
|
||||||
@@ -342,9 +341,7 @@ function removeMember(row: ShareRow) {
|
|||||||
members.remove(row.id)
|
members.remove(row.id)
|
||||||
}
|
}
|
||||||
function userProfileLink(username: string) {
|
function userProfileLink(username: string) {
|
||||||
return !username || username.includes('@')
|
return !username || username.includes('@') ? undefined : `/user/${encodeURIComponent(username)}`
|
||||||
? undefined
|
|
||||||
: () => openUrl(`https://modrinth.com/user/${encodeURIComponent(username)}`)
|
|
||||||
}
|
}
|
||||||
async function requestAuth(flow: ModrinthAuthFlow) {
|
async function requestAuth(flow: ModrinthAuthFlow) {
|
||||||
await auth.requestSignIn(`/instance/${encodeURIComponent(props.instance.id)}/share`, flow, {
|
await auth.requestSignIn(`/instance/${encodeURIComponent(props.instance.id)}/share`, flow, {
|
||||||
|
|||||||
@@ -157,7 +157,6 @@ import {
|
|||||||
useRelativeTime,
|
useRelativeTime,
|
||||||
useVIntl,
|
useVIntl,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
|
||||||
import { computed, ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -294,9 +293,7 @@ const messages = defineMessages({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
function userProfileLink(username: string) {
|
function userProfileLink(username: string) {
|
||||||
return !username || username.includes('@')
|
return !username || username.includes('@') ? undefined : `/user/${encodeURIComponent(username)}`
|
||||||
? undefined
|
|
||||||
: () => openUrl(`https://modrinth.com/user/${encodeURIComponent(username)}`)
|
|
||||||
}
|
}
|
||||||
function setUsernameRef(id: string, element: Element | null) {
|
function setUsernameRef(id: string, element: Element | null) {
|
||||||
usernameRefs.value[id] = element instanceof HTMLElement ? element : null
|
usernameRefs.value[id] = element instanceof HTMLElement ? element : null
|
||||||
|
|||||||
@@ -31,8 +31,9 @@
|
|||||||
:organization="organization"
|
:organization="organization"
|
||||||
:members="members"
|
:members="members"
|
||||||
:org-link="(slug) => `https://modrinth.com/organization/${slug}`"
|
:org-link="(slug) => `https://modrinth.com/organization/${slug}`"
|
||||||
:user-link="(username) => `https://modrinth.com/user/${username}`"
|
:user-link="(username) => `/user/${encodeURIComponent(username)}`"
|
||||||
link-target="_blank"
|
link-target="_blank"
|
||||||
|
:user-link-target="null"
|
||||||
class="project-sidebar-section"
|
class="project-sidebar-section"
|
||||||
/>
|
/>
|
||||||
<ProjectSidebarDetails
|
<ProjectSidebarDetails
|
||||||
|
|||||||
@@ -475,7 +475,7 @@ export function createContentInstall(opts: {
|
|||||||
name: owner.user.username,
|
name: owner.user.username,
|
||||||
iconUrl: owner.user.avatar_url,
|
iconUrl: owner.user.avatar_url,
|
||||||
circle: true,
|
circle: true,
|
||||||
link: () => openUrl(`https://modrinth.com/user/${owner.user.username}`),
|
link: `/user/${encodeURIComponent(owner.user.username)}`,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ function getQueuedInstallOwnerFallback(project: InstallableSearchResult) {
|
|||||||
id: ownerId,
|
id: ownerId,
|
||||||
name: project.author,
|
name: project.author,
|
||||||
type: 'user' as const,
|
type: 'user' as const,
|
||||||
link: `https://modrinth.com/user/${ownerId}`,
|
link: `/user/${encodeURIComponent(ownerId)}`,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +144,7 @@ async function getQueuedInstallOwner(
|
|||||||
name: owner.username,
|
name: owner.username,
|
||||||
type: 'user' as const,
|
type: 'user' as const,
|
||||||
avatar_url: owner.avatar_url,
|
avatar_url: owner.avatar_url,
|
||||||
link: `https://modrinth.com/user/${owner.username}`,
|
link: `/user/${encodeURIComponent(owner.username)}`,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@@ -100,6 +100,14 @@ export default new createRouter({
|
|||||||
breadcrumb: [{ name: 'Skin selector' }],
|
breadcrumb: [{ name: 'Skin selector' }],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/user/:user/:projectType?',
|
||||||
|
name: 'User',
|
||||||
|
component: Pages.User,
|
||||||
|
meta: {
|
||||||
|
breadcrumb: [{ name: '?User' }],
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/library',
|
path: '/library',
|
||||||
name: 'Library',
|
name: 'Library',
|
||||||
|
|||||||
+8
-1
@@ -276,7 +276,14 @@ fn main() {
|
|||||||
.plugin(
|
.plugin(
|
||||||
"users",
|
"users",
|
||||||
InlinedPlugin::new()
|
InlinedPlugin::new()
|
||||||
.commands(&["search_user"])
|
.commands(&[
|
||||||
|
"search_user",
|
||||||
|
"get_user_profile",
|
||||||
|
"get_user_projects",
|
||||||
|
"get_user_organizations",
|
||||||
|
"get_user_collections",
|
||||||
|
"patch_user",
|
||||||
|
])
|
||||||
.default_permission(
|
.default_permission(
|
||||||
DefaultPermissionRule::AllowAllCommands,
|
DefaultPermissionRule::AllowAllCommands,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use crate::api::Result;
|
use crate::api::Result;
|
||||||
|
use serde_json::Value;
|
||||||
use theseus::users::SearchUser;
|
use theseus::users::SearchUser;
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
@@ -6,8 +7,40 @@ pub async fn search_user(query: &str) -> Result<Vec<SearchUser>> {
|
|||||||
Ok(theseus::users::search_user(query).await?)
|
Ok(theseus::users::search_user(query).await?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn get_user_profile(user_id: &str) -> Result<Value> {
|
||||||
|
Ok(theseus::users::get_user_profile(user_id).await?)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn get_user_projects(user_id: &str) -> Result<Value> {
|
||||||
|
Ok(theseus::users::get_user_projects(user_id).await?)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn get_user_organizations(user_id: &str) -> Result<Value> {
|
||||||
|
Ok(theseus::users::get_user_organizations(user_id).await?)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn get_user_collections(user_id: &str) -> Result<Value> {
|
||||||
|
Ok(theseus::users::get_user_collections(user_id).await?)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn patch_user(user_id: &str, patch: Value) -> Result<()> {
|
||||||
|
Ok(theseus::users::patch_user(user_id, patch).await?)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn init<R: tauri::Runtime>() -> tauri::plugin::TauriPlugin<R> {
|
pub fn init<R: tauri::Runtime>() -> tauri::plugin::TauriPlugin<R> {
|
||||||
tauri::plugin::Builder::new("users")
|
tauri::plugin::Builder::new("users")
|
||||||
.invoke_handler(tauri::generate_handler![search_user])
|
.invoke_handler(tauri::generate_handler![
|
||||||
|
search_user,
|
||||||
|
get_user_profile,
|
||||||
|
get_user_projects,
|
||||||
|
get_user_organizations,
|
||||||
|
get_user_collections,
|
||||||
|
patch_user,
|
||||||
|
])
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1838,9 +1838,6 @@
|
|||||||
"muralpay.placeholder.cuit-cuil": {
|
"muralpay.placeholder.cuit-cuil": {
|
||||||
"message": "أدخل CUIT أو CUIL"
|
"message": "أدخل CUIT أو CUIL"
|
||||||
},
|
},
|
||||||
"profile.user-id": {
|
|
||||||
"message": "معرّف المستخدم: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.success-decline": {
|
"project-member-header.success-decline": {
|
||||||
"message": "لقد رفضت دعوة الفريق"
|
"message": "لقد رفضت دعوة الفريق"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2105,111 +2105,6 @@
|
|||||||
"muralpay.placeholder.account-number": {
|
"muralpay.placeholder.account-number": {
|
||||||
"message": "Zadejte číslo účtu"
|
"message": "Zadejte číslo účtu"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Modrinth tvůrce."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Modrinth uživatel."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Zobrazit analytika uživatele"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Spravujte fakturaci uživatele"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Upravit roli"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Podívejte se na detaily uživatele"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Spravujte projekty"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Odebrat jako partnera"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Nastavit jako partnera"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# projekt} few {# projekty} other {# projektů}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Poskytovatelé přihlášení"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-mail ověřen"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Má heslo"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Má TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Platební metody"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "E-mail není ověřen"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-mail je ověřen"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Uživatel nenalezen"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Partner"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Odznaky"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Kolekce"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Členem od"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Tento uživatel nemá žádné kolekce!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Nemáte žádné kolekce.\nChcete nějakou <create-link>vytvořit</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Tento uživatel nemá žádné projekty!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Nemáte žádné projekty.\nChcete nějaký <create-link>vytvořit</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizace"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Ukládání..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Stáhněte si projekty od {username} na Modrinthu"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Stáhněte si projekty od {username} na Modrinthu"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Oficiální Modrinth účet"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Oficiální uživatelský účet Modrinthu. Podporu získáte na <support-link></support-link> nebo e-mailem na <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> sledující projektu} few {<stat>{count}</stat> sledující projektu} other {<stat>{count}</stat> sledujících projektu}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID uživatele: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Nepodařilo se zamítnout pozvánku do týmu"
|
"message": "Nepodařilo se zamítnout pozvánku do týmu"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2180,87 +2180,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Denne organisation har ikke nogle projekter endnu. Kunnde dig tænke dig at <create-link>oprette et</create-link>?"
|
"message": "Denne organisation har ikke nogle projekter endnu. Kunnde dig tænke dig at <create-link>oprette et</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "En Modrinth skaber."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "En Modrinth bruger."
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Rediger rolle"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Vis bruger detaljer"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Administrer projekter"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Email"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Email bekræftet"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Har adgangskode"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Har TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Betalingsmetoder"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Email ikke bekræftet"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Email bekræftet"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Bruger ikke fundet"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Emblemer"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Samling"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {download} other {downloads}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Tilsluttet"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Denne bruger har ingen samlinger!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Du har ingen samlinger.\nKunne du tænke dig at <create-link>oprette en</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Denne bruger har ingen projekter!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Du har ingen projekter.\nKunne du tænke dig at <create-link>oprette en</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisationer"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Gemmer..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Download {username}'s projekter på Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Download {username}'s projekter på Modrinth"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> projekt følger} other {<stat>{count}</stat> projekt følgere}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Bruger-ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Afvisning af hold invitation fejlede"
|
"message": "Afvisning af hold invitation fejlede"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3320,117 +3320,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Diese Organisation hat noch keine Projekte. Möchtest du <create-link>eins erstellen</create-link>?"
|
"message": "Diese Organisation hat noch keine Projekte. Möchtest du <create-link>eins erstellen</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Ein Modrinth Ersteller."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Ein Modrinth Benutzer."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Nutzungsstatistik anzeigen"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Nutzer Zahlungen verwalten"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Rolle bearbeiten"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Nutzerdetails ansehen"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Projekte verwalten"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Als Partner entfernen"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Als Partner setzen"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# Projekt} other {# Projekte}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Authentifizierungsanbieter"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-Mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-Mail verifiziert"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Hat Passwort"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Hat TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Zahlungsmethoden"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "E-Mail nicht verifiziert"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-Mail verifiziert"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Benutzer nicht gefunden"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Partner"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Abzeichen"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Kollektion"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {Download} other {Downloads}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Beigetreten"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Dieser Nutzer hat keine Kollektionen!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Du hast keine Kollektionen.\nMöchtest du gerne <create-link>eine erstellen</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Dieser Nutzer hat keine Projekte!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Du hast keine Projekte.\nMöchtest du gerne <create-link>eines erstellen</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisationen"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {Projekt} other {Projekte}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Speichert..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Lade {username}'s Projekte auf Modrinth herunter"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Lade {username}'s Projekte auf Modrinth herunter"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Offizielles Modrinth-Konto"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Das offizielle Benutzerkonto von Modrinth. Erhalte Support unter <support-link></support-link> oder per E-Mail an <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat>} other {<stat>{count}</stat>}} Projekt-Follower"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Benutzer ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Ablehnen der Team-Einladung fehlgeschlagen"
|
"message": "Ablehnen der Team-Einladung fehlgeschlagen"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3320,117 +3320,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Diese Organisation hat noch keine Projekte. Möchtest du <create-link>eins erstellen</create-link>?"
|
"message": "Diese Organisation hat noch keine Projekte. Möchtest du <create-link>eins erstellen</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Ein Modrinth-Ersteller."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Ein Modrinth-Benutzer."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Benutzeranalysen anzeigen"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Benutzerabrechnungen verwalten"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Rolle bearbeiten"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Nutzerdetails ansehen"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Projekte verwalten"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Als Partner entfernen"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Als Partner setzen"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# Projekt} other {# Projekte}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Authentifizierungsanbieter"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-Mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-Mail verifiziert"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Hat Passwort"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Hat TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Zahlungsmethoden"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "E-Mail nicht verifiziert"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-Mail verifiziert"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Benutzer nicht gefunden"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Partner"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Abzeichen"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Kollektion"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {Download} other {Downloads}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Beigetreten"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Dieser Nutzer hat keine Kollektionen!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Du hast keine Kollektionen.\nMöchtest du eine <create-link>erstellen</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Dieser Nutzer hat keine Projekte!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Du hast keine Projekte.\nMöchtest du eins <create-link>erstellen</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisationen"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {Projekt} other {Projekte}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Speichert..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Lade Projekte von {username} auf Modrinth herunter"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Lade Projekte von {username} auf Modrinth herunter"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Offizielles Konto von Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Das offizielle Benutzerkonto von Modrinth. Erhalte Hilfe unter <support-link></support-link> oder per E-Mail unter <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat>} other {<stat>{count}</stat>}} Projekt-Follower"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Benutzer ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Teameinladung konnte nicht abgelehnt werden"
|
"message": "Teameinladung konnte nicht abgelehnt werden"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3344,132 +3344,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "This organization doesn't have any projects yet. Would you like to <create-link>create one</create-link>?"
|
"message": "This organization doesn't have any projects yet. Would you like to <create-link>create one</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "A Modrinth creator."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "A Modrinth user."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "View user analytics"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Manage user billing"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Edit role"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "View user details"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Manage projects"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Remove as affiliate"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Set as affiliate"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# project} other {# projects}}"
|
|
||||||
},
|
|
||||||
"profile.details.error.github-popup-blocked": {
|
|
||||||
"message": "Allow pop-ups for Modrinth, then try again."
|
|
||||||
},
|
|
||||||
"profile.details.error.github-profile-message": {
|
|
||||||
"message": "The GitHub profile could not be retrieved. Please try again."
|
|
||||||
},
|
|
||||||
"profile.details.error.github-profile-title": {
|
|
||||||
"message": "Unable to open GitHub profile"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Auth providers"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Email"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Email verified"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Has password"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Has TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.loading-github-profile": {
|
|
||||||
"message": "Loading..."
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Payment methods"
|
|
||||||
},
|
|
||||||
"profile.details.label.view-github-profile": {
|
|
||||||
"message": "View profile"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Email not verified"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Email verified"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "User not found"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Affiliate"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Badges"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Collection"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {download} other {downloads}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Joined"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "This user has no collections!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "You don't have any collections.\nWould you like to <create-link>create one</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "This user has no projects!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "You don't have any projects.\nWould you like to <create-link>create one</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizations"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {project} other {projects}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Saving..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Download {username}'s projects on Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Download {username}'s projects on Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Official Modrinth account"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "The official user account of Modrinth. Get support at <support-link></support-link> or via email at <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> project follower} other {<stat>{count}</stat> project followers}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "User ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Failed to decline team invitation"
|
"message": "Failed to decline team invitation"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2996,111 +2996,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Verifica dos veces la dirección de tu billetera. Los fondos enviados a una dirección incorrecta no se pueden recuperar."
|
"message": "Verifica dos veces la dirección de tu billetera. Los fondos enviados a una dirección incorrecta no se pueden recuperar."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Un creador de Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Un usuario de Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Ver estadísticas de usuario"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Gestionar la facturación de usuario"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Editar rol"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Ver detalles de usuario"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Gestionar proyectos"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Remover como afiliado"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Configurar como afiliado"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# proyecto} other {# proyectos}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Proveedores de autenticación"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Correo electrónico"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Correo electrónico verificado"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Tiene contraseña"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Tiene TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Métodos de pago"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Correo electrónico no verificado"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Correo electrónico verificado"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Usuario no encontrado"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Afiliado"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Insignias"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Colección"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Se unió"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "¡Este usuario no tiene colecciones!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "No tienes ninguna colección.\n¿Te gustaría <create-link>crear una</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "¡Este usuario no tiene proyectos!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "No tienes ningún proyecto.\n¿Te gustaría <create-link>crear uno</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizaciones"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Guardando..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Descarga proyectos de {username} en Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Descarga proyectos de {username} en Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Cuenta oficial de Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "La cuenta de usuario oficial de Modrinth. Obtén soporte en <support-link></support-link> o vía correo en <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> seguidor del proyecto} other {<stat>{count}</stat> seguidores del proyecto}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID de usuario: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Error al rechazar la invitación del equipo"
|
"message": "Error al rechazar la invitación del equipo"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2822,111 +2822,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Verifique la dirección de su billetera. Los fondos enviados a una dirección incorrecta no se pueden recuperar."
|
"message": "Verifique la dirección de su billetera. Los fondos enviados a una dirección incorrecta no se pueden recuperar."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Creador en Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Usuario de Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Ver analíticas de usuario"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Gestionar la facturación de los usuarios"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Editar rol"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Ver detalles del usuario"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Gestionar proyectos"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Borrar como afiliado"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Establecer como afiliado"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# proyecto} other {# proyectos}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Autentificar proveedores"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Correo electrónico"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Email verificado"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Tiene contraseña"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Tiene autentificación de doble factor"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Métodos de pago"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Correo electrónico no verificado"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Correo electrónico verificado"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Usuario no encontrado"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Afiliado"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Medallas"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Colección"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Se unió hace"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "¡Este usuario no tiene colecciones!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "No tienes ninguna colección.\n¿Te gustaría <create-link>crear una</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "¡Este usuario no tiene proyectos!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "No tienes ningún proyecto.\n¿Te gustaría <create-link>crear uno</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizaciones"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Guardando..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Descargar los proyectos de {username} en Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Descarga los proyectos en Modrinth de {username}"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Cuenta oficial de Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "La cuenta de usuario oficial de Modrinth. Obtén soporte en <support-link></support-link> o vía correo en <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> seguidor} other {<stat>{count}</stat> seguidores}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID de usuario: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "No se ha podido rechazar la invitación del equipo"
|
"message": "No se ha podido rechazar la invitación del equipo"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -908,15 +908,6 @@
|
|||||||
"moderation.page.reports": {
|
"moderation.page.reports": {
|
||||||
"message": "Raportit"
|
"message": "Raportit"
|
||||||
},
|
},
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Arvomerkit"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisaatiot"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Käyttäjätunnus: {id}"
|
|
||||||
},
|
|
||||||
"project-moderation-nags.required": {
|
"project-moderation-nags.required": {
|
||||||
"message": "Vaadittu"
|
"message": "Vaadittu"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2153,99 +2153,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Pakisuri muli ng iyong wallet address. Ang mga pundong nahatid sa maling address ay hindi na mababawi."
|
"message": "Pakisuri muli ng iyong wallet address. Ang mga pundong nahatid sa maling address ay hindi na mababawi."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Isang tagagawa sa Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Isang tagagamit sa Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Pamahalaan ang billing ng tagagamit"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Baguhin ang tungkulin"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Tingang ang mga detalye ng tagagamit"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Pamahalaan ang mga proyekto"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Tanggalin bilang affiliate"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Itakda bilang affiliate"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Mga auth provider"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Email"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Napatunayan na email"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "May password"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "May TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Mga paraan ng pagbabayad"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Hindi napatunayang email"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Napatunayan na email"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Hindi mahanap na tagagamit"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Affiliate"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Tsapa"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Koleksiyon"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Sumali"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Walang mga koleksiyon ang tagagamit na ito!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Wala kang koleksiyon.\nNais mo bang <create-link>lumikha ng isa</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Walang mga proyekto ang tagagmit na ito!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Wala kang proyekto.\nNais mo bang <create-link>lumikha ng isa</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Mga organisasyon"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Sine-save..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Magdownload ng mga proyekto ni {username} sa Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Magdownload ng mga proyekto ni {username} sa Modrinth"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> follower ng proyekto} other {<stat>{count}</stat> na follower ng proyekto}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "User ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Bigong matanggihan ang anyaya sa koponan"
|
"message": "Bigong matanggihan ang anyaya sa koponan"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3323,117 +3323,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Cette organisation n'a pas encore de projet. Souhaitez-vous en <create-link>créer un</create-link> ?"
|
"message": "Cette organisation n'a pas encore de projet. Souhaitez-vous en <create-link>créer un</create-link> ?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Un créateur Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Un utilisateur Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Voir les analyses de l'utilisateur"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Gérer la facturation de l’utilisateur"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Modifier le rôle"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Afficher les détails de l’utilisateur"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Gérer les projets"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Se Désaffilié"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Se mettre comme affilié"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural,one {# projet} other {# projets}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Fournisseurs d’authentification"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Adresse e-mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Adresse e-mail vérifiée"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Dispose d'un mot de passe"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Dispose d'un TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Moyens de paiements"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Adresse e-mail non vérifiée"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Adresse e-mail vérifiée"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Utilisateur introuvable"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Affilié"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Badges"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Collection"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {téléchargement} other {téléchargements}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Rejoint"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Cet utilisateur n'a aucune collection !"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Vous n'avez aucune collection.\nVoulez-vous en <create-link>créer une</create-link> ?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Cet utilisateur n'a aucun projet !"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Vous n'avez aucun projet.\nVoulez-vous en <create-link>créer un</create-link> ?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisations"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {projet} other {projets}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Sauvegarde en cours..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Téléchargez les projets de {username} sur Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Téléchargez les projets de {username} sur Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Compte Modrinth Officiel"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Le compte utilisateur officiel de Modrinth. Obtenez de l’aide via <support-link></support-link> ou par e-mail à <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> personne adore} other {<stat>{count}</stat> personnes adorent}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID utilisateur : {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Échec du refus de l’invitation à l’équipe"
|
"message": "Échec du refus de l’invitation à l’équipe"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1778,99 +1778,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "בדוק היטב את כתובת הארנק שלך. לא ניתן לשחזר כספים שנשלחו לכתובת שגויה."
|
"message": "בדוק היטב את כתובת הארנק שלך. לא ניתן לשחזר כספים שנשלחו לכתובת שגויה."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "יוצר ב-Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "משתמש ב-Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "נהל את חיוב המשתמש"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "עריכת תפקיד"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "הצג את הפרטים של המשתמש"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "ניהול פרויקטים"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "הסרה מתוכנית השותפים"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "הגדר כשותף"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "ספקי אימות זהות"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "אימייל"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "כתובת האימייל אומתה"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "יש סיסמה"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "אימות דו-שלבי פעיל"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "שיטת תשלום"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "כתובת האימייל טרם אומתה"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "כתובת האימייל אומתה"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "המשתמש לא נמצא"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "שותף או משתמש שותף"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "תגים"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "אוסף"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "הצטרף ב-"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "למשתמש זה אין אוספים!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "אין לך אוספים.\nהאם תרצה <create-link>ליצור אחד</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "למשתמש זה אין פרויקטים!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "אין לך פרויקטים.\nהאם תרצה <create-link>ליצור אחד</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "ארגונים"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "שומר..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "הורד את הפרויקטים של {username} ב-Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - הורד את הפרויקטים של {username} ב-Modrinth"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> project follower} other {<stat>{count}</stat> project followers}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "מזהה משתמש: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "הפעולה לדחיית ההזמנה לצוות נכשלה"
|
"message": "הפעולה לדחיית ההזמנה לצוות נכשלה"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3068,117 +3068,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Ennek a szervezetnek még nincsenek projektjei. Szeretnél <create-link>létrehozni egyet</create-link>?"
|
"message": "Ennek a szervezetnek még nincsenek projektjei. Szeretnél <create-link>létrehozni egyet</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Egy Modrinth fejlesztő."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Egy Modrinth felhasználó."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Felhasználó statisztikáinak megtekintése"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Felhasználói számlázás kezelése"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Szerep szerkesztése"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Felhasználói adatok megtekintése"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Projektek kezelése"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Társult vállalkozás törlése"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Beállítás társult vállalkozás ként"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count} projekt"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Auth szolgáltatók"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-mail cím ellenőrizve"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Van jelszó"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Van TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Kifizetési módok"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Nem hitelesített e-mail"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-mail cím hitelesítve"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Felhasználó nem található"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Társult vállalkozás"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Jelvények"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Gyűjtemény"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "letöltés"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Csatlakozott"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Ennek a felhasználónak nincsenek gyűjteményei!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Nincsenek gyűjteményeid.\nSzeretnél <create-link>létrehozni egyet</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Ennek a felhasználónak nincsenek projektjei!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Nincsenek projektjeid.\nSzeretnél <create-link>létrehozni egyet</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Szervezetek"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "projekt"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Mentés..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Töltsd le {username} projektjeit a Modrinthon"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Töltsd le {username} projektjeit a Modrinthon"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Hivatalos Modrinth fiók"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "A hivatalos Modrinth fiók. Kérj segítséget a <support-link></support-link> oldalon, vagy e-mailben: <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "<stat>{count}</stat> projektkövető"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Felhasználói azonosító: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Nem sikerült elutasítani a meghívást"
|
"message": "Nem sikerült elutasítani a meghívást"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2159,99 +2159,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Periksa ulang alamat dompet Anda. Dana yang terkirim ke alamat yang salah tidak dapat dipulihkan."
|
"message": "Periksa ulang alamat dompet Anda. Dana yang terkirim ke alamat yang salah tidak dapat dipulihkan."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Seorang kreator Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Seorang pengguna Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Kelola penagihan pengguna"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Ubah peran"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Lihat perincian pengguna"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Kelola proyek"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Hapus sebagai afiliasi"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Tetapkan sebagai afiliasi"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Penyedia autentikasi"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Sur-el"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Sur-el terverifikasi"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Memiliki kata sandi"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Memiliki TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Metode pembayaran"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Sur-el tidak terverifikasi"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Sur-el terverifikasi"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Pengguna tidak ditemukan"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Afiliasi"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Lencana"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Koleksi"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Telah bergabung"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Pengguna ini tidak memiliki koleksi!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Anda tidak memiliki koleksi apa pun.\nApakah Anda ingin <create-link>membuatnya</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Pengguna ini tidak memiliki proyek!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Anda tidak memiliki proyek apa pun.\nApakah Anda ingin <create-link>membuatnya</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisasi"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Menyimpan..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Unduh proyek milik {username} di Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Unduh proyek milik {username} di Modrinth"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, other {<stat>{count}</stat> pengikut proyek}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Pengenal Pengguna: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Gagal menolak undangan tim"
|
"message": "Gagal menolak undangan tim"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3335,117 +3335,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Questa organizzazione non ha alcun progetto. Vorresti <create-link>crearne uno</create-link>?"
|
"message": "Questa organizzazione non ha alcun progetto. Vorresti <create-link>crearne uno</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Creatore su Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Utente di Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Mostra analitiche"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Gestisci pagamento utente"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Modifica ruolo"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Mostra dettagli utente"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Gestisci progetti"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Rimuovi da affiliato"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Imposta come affiliato"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# progetto} other {# progetti}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Fornitori autenticazione"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Email"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Email verificata"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Usa una password"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Usa TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Metodi di pagamento"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Email non verificata"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Email verificata"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Utente non trovato"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Affiliato"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Distintivi"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Raccolta"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "download"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Iscrizione"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Questo utente non ha raccolte!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Non hai alcuna raccolta.\nNe vorresti <create-link>creare una</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Questo utente non ha progetti!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Non hai alcun progetto. Ne vorresti <create-link>creare uno</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizzazioni"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {progetto} other {progetti}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Salvataggio..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Scarica i progetti di {username} su Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Scarica i progetti di {username} su Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Account Modrinth ufficiale"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "L'account ufficiale di Modrinth. Ricevi assistenza presso <support-link></support-link> o tramite mail presso <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "<stat>{count, plural, =0 {Nessun} other {{count}}}</stat> follower del progetto"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID utente: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Errore nel rifiutare l'invito al team"
|
"message": "Errore nel rifiutare l'invito al team"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2729,96 +2729,6 @@
|
|||||||
"organization.project-transfer.type-column": {
|
"organization.project-transfer.type-column": {
|
||||||
"message": "タイプ"
|
"message": "タイプ"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Modrinthの作成者。"
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Modrinthのユーザー。"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "ユーザー課金管理"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "ロールを編集"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "ユーザー情報を表示"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "プロジェクトを管理"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "アフィリエイトを解除する"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "アフィリエイトとして設定する"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "認証プロバイダー"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "メールドレス"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "メールアドレス認証済み"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "パスワードがすでにあります"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "TOTPがあります"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "支払い方法"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "メールアドレス未認証"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "メールアドレス認証済み"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "ユーザーが見つかりませんでした"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "アフィリエイト"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "バッジ"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "コレクション"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "参加: "
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "このユーザーのコレクションはありません!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "コレクションがありません。\n <create-link>コレクションを作成しますか</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "このユーザーのプロジェクトはありません!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "プロジェクトがありません\nプロジェクトを<create-link>作成しますか</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "組織"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "保存中…"
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Modrinthで{username}のプロジェクトをダウンロードする"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Modrinthで{username}のプロジェクトをダウンロードする"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ユーザーID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "チームへの招待の辞退に失敗しました"
|
"message": "チームへの招待の辞退に失敗しました"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3290,117 +3290,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "이 조직에는 아직 프로젝트가 없습니다. <create-link>하나 생성하시겠습니까?</create-link>?"
|
"message": "이 조직에는 아직 프로젝트가 없습니다. <create-link>하나 생성하시겠습니까?</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Modrinth 창작자입니다."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Modrinth 사용자입니다."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "사용자 분석 보기"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "사용자 청구 관리"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "역할 수정"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "사용자 상세 정보 보기"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "프로젝트 관리"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "제휴 취소"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "제휴사로 설정"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {프로젝트 #개} other {프로젝트 #개}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "인증 제공자"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "이메일"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "이메일 인증됨"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "비밀번호 사용"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "TOTP 사용"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "결제 수단"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "이메일이 인증되지 않음"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "이메일 인증됨"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "사용자를 찾을 수 없습니다"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "제휴"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "배지"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "컬렉션"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": ""
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "가입"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "이 사용자는 컬렉션이 없습니다!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "아직 컬렉션이 없습니다.\n<create-link>새 컬렉션</create-link>을 생성하시겠습니까?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "이 사용자는 프로젝트가 없습니다!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "아직 프로젝트가 없습니다.\n<create-link>새 프로젝트</create-link>를 생성하시겠습니까?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "조직"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": ""
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "저장..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Modrinth에서 {username}의 프로젝트 다운로드"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Modrinth에서 {username}의 프로젝트 다운로드"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "공식 Modrinth 계정"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Modrinth의 공식 사용자 계정입니다. <support-link></support-link> 또는 <email></email> 이메일을 통해 지원을 받으실 수 있습니다"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, other {<stat>{count}</stat> 프로젝트 팔로워}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "사용자 ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "팀 초대를 거절하지 못했습니다"
|
"message": "팀 초대를 거절하지 못했습니다"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2684,105 +2684,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Semak semula alamat dompet anda. Dana yang dihantar ke alamat yang salah tidak boleh dipulihkan."
|
"message": "Semak semula alamat dompet anda. Dana yang dihantar ke alamat yang salah tidak boleh dipulihkan."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Seorang pencipta Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Seorang pengguna Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Urus pengebilan pengguna"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Sunting peranan"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Lihat butiran pengguna"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Urus projek"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Alih keluar rakan afiliasi"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Tetapkan sebagai rakan afiliasi"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, other {# projek}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Penyedia pengesahan"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-mel"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-mel disahkan"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Mempunyai kata laluan"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Mempunyai TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Kaedah pembayaran"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "E-mel tidak disahkan"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-mel disahkan"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Pengguna tidak dijumpai"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Afiliasi"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Lencana"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Koleksi"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Telah menyertai"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Pengguna ini tidak memiliki sebarang koleksi!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Anda tidak memiliki sebarang koleksi.\nAdakah anda mahu <create-link>mencipta sebuah koleksi</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Pengguna ini tidak memiliki sebarang projek!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Anda tidak memiliki sebarang projek.\nAdakah anda mahu <create-link>mencipta sebuah projek</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisasi"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Sedang menyimpan..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Muat turun projek milik {username} di Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Muat turun projek milik {username} di Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Akaun pengguna rasmi Modrinth. Dapatkan sokongan di <support-link></support-link> atau melalui e-mel di <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, other {<stat>{count}</stat> pengikut projek}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID Pengguna: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Gagal menolak jemputan pasukan"
|
"message": "Gagal menolak jemputan pasukan"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3341,117 +3341,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Deze organisatie heeft nog geen projecten. Wil je er <create-link>een aanmaken</create-link>?"
|
"message": "Deze organisatie heeft nog geen projecten. Wil je er <create-link>een aanmaken</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Een Modrinth creator."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Een Modrinth gebruiker."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Gebruikersstatistieken bekijken"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Gebruikers facturering beheren"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Bewerk rol"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Bekijk gebruikersdetails"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Beheer projecten"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Verwijderen als partner"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Zet als partner"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# project} other {# projecten}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Beveiliging providers"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Email"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Email geverifieerd"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Heeft wachtwoord"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Heeft TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Betaalmethodes"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Email niet geverifieerd"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Email geverifieerd"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Gebruiker niet gevonden"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Partners"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Badges"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Collectie"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {download} other {downloads}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Lid geworden"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Deze gebruiker heeft geen collecties!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Je hebt geen collecties.\n<create-link>Wil je er een aanmaken?</create-link>"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Deze gebruiker heeft geen projecten!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Je hebt geen projecten.\n<create-link>Wil je er een aanmaken?</create-link>"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisaties"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {project} other {projecten}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Opslaan..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Download {username} z'n projecten via Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Download {username}'s projecten op Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Officieel Modrinth-account"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Het officiële gebruikersaccount van Modrinth. Neem contact op met het Helpcentrum via <support-link></support-link> of per e-mail via <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> project volger}other {<stat>{count}</stat> project volgers}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Gebruiker ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Team uitnodiging niet afgeslagen"
|
"message": "Team uitnodiging niet afgeslagen"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2609,108 +2609,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Dobbeltsjekk lommeboksadressa di. Penger sendt til feil adresse kan ikke bli gjenoppretta."
|
"message": "Dobbeltsjekk lommeboksadressa di. Penger sendt til feil adresse kan ikke bli gjenoppretta."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "En Modrinth-skaper."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "En Modrinth-bruker."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Vis brukerstatistikk"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Hold styr på brukerfakturering"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Rediger rolle"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Vis brukerdetaljer"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Hold styr på prosjekt"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Fjern tilknyting"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Sett som tilknyting"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# prosjekt} other {# prosjekter}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Autoriseringsgivere"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Epost"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Epostbekreftelse"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Har passord"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Har TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Betalingsmetoder"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Epost ikke bekrefta"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Epost bekrefta"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Bruker ikke funnet"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Tilknytt"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Merker"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Samling"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Blei med"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Denne brukeren har ingen samlinger!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Du har ikke noen samlinger.\nHar du lyst å <create-link>lage en</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Denne brukeren har ingen prosjekt!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Du har ikke noen prosjekt.\nHar du lyst å <create-link>lage en</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisasjoner"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Lagrer..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Last ned prosjekta til {username} på Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Last ned prosjekta til {username} på Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Offisiell Modrinth-bruker"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> prosjektfølger} other {<stat>{count}</stat> prosjektfølgere}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Bruker-ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Kunne ikke avslå laginvitasjonen"
|
"message": "Kunne ikke avslå laginvitasjonen"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3317,117 +3317,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Ta organizacja nie ma jeszcze żadnych projektów. Czy chcesz <create-link>utworzyć nowy</create-link>?"
|
"message": "Ta organizacja nie ma jeszcze żadnych projektów. Czy chcesz <create-link>utworzyć nowy</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Twórca na Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Użytkownik Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Pokaż dane analityczne użytkownika"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Zarządzaj rozliczaniem użytkownika"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Edytuj rolę"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Otwórz szczegóły użytkownika"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Zarządzaj projektami"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Usuń afiliację"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Ustaw jako afiliację"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# projekt} few {# projekty} other {# projektów}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Dostawcy uwierzytelniania"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Zweryfikowano e-mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Ma hasło"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Ma TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Metody płatności"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "E-mail nie jest zweryfikowany"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-mail jest zweryfikowany"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Nie znaleziono użytkownika"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Afiliacja"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Odznaki"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Kolekcja"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {pobranie} few {pobrania} other {pobrań}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Dołączył(-a)"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Ten użytkownik nie ma żadnych kolekcji!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Nie masz żadnych kolekcji.\nCzy chcesz <create-link>utworzyć jedną</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Ten użytkownik nie ma żadnych projektów!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Nie masz żadnych projektów.\nCzy chcesz <create-link>utworzyć nowy</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizacje"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {projekt} few {projekty} other {projektów}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Zapisywanie..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Pobieraj projekty {username} na Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Pobieraj projekty {username} na Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Oficjalne konto Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Oficjalne konto Modrinth. Otrzymaj wsparcie na stronie <support-link></support-link> lub poprzez e-mail <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> obserwujący projekt} other {<stat>{count}</stat> obserwujących projekt}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID użytkownika: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Odrzucenie zaproszenia do zespołu nie powiodło się"
|
"message": "Odrzucenie zaproszenia do zespołu nie powiodło się"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3344,117 +3344,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Esta organização ainda não tem nenhum projeto. Gostaria de <create-link>criar um</create-link>?"
|
"message": "Esta organização ainda não tem nenhum projeto. Gostaria de <create-link>criar um</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Um criador Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Usuário comum."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Ver estatísticas do usuário"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Gerenciar cobrança do usuário"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Editar cargo"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Ver detalhes do usuário"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Gerenciar projetos"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Remover como afiliado"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Configurar como afiliado"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# projeto} other {# projetos}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Provedores de autenticação"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-mail verificado"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Possui senha"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Possui TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Métodos de pagamento"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "E-mail não verificado"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-mail verificado"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Usuário não encontrado"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Afiliado"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Emblemas"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Coleção"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {download} other {downloads}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Entrou"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Este usuário não possui coleções!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Você não tem nenhuma coleção.\nGostaria de <create-link>criar uma</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Este usuário não tem projetos!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Você não tem nenhum projeto.\nGostaria de <create-link>criar um</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizações"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {projeto} other {projetos}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Salvando..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Baixe os projetos de {username} no Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} — Baixe os projetos de {username} no Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Conta oficial do Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Conta oficial do Modrinth. Obtenha suporte em<support-link></support-link> ou por e-mail via <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, =0 {{count} seguidores} one {<stat>{count}</stat> seguidor} other {<stat>{count}</stat> seguidores}} do projeto"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID do usuário: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Falha ao recusar o convite da equipe"
|
"message": "Falha ao recusar o convite da equipe"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2501,99 +2501,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Confirme o endereço da carteira. Fundos enviados para um endereço errado não podem ser recuperados."
|
"message": "Confirme o endereço da carteira. Fundos enviados para um endereço errado não podem ser recuperados."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Um criador Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Um utilizador Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Gerir faturação do utilizador"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Editar cargo"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Ver detalhes de utilizador"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Gerir projetos"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Remover como afiliado"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Definir como afiliado"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Fornecedores de Autenticação"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-mail"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-mail verificado"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Tem password"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Tem TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Métodos de pagamento"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "E-mail não verificado"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-mail verificado"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Utilizador não encontrado"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Afiliado"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Emblemas"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Coleção"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Entrou"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Este utilizador não tem coleções!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Não tens nenhuma coleção.\nQueres <create-link>criar uma</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Este utilizador não tem projetos!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Não tens nenhum projeto.\nQueres <create-link>criar um</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizações"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "A guardar..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Transfere os projetos de {username} no Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Transfere os projetos de {username} no Modrinth"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> seguidor do projeto} other {<stat>{count}</stat> seguidores do projeto}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID do utilizador: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Falha a rejeitar o convite de equipa"
|
"message": "Falha a rejeitar o convite de equipa"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1214,60 +1214,6 @@
|
|||||||
"muralpay.rail.fiat-usd.name": {
|
"muralpay.rail.fiat-usd.name": {
|
||||||
"message": "Transfer bancar (USD)"
|
"message": "Transfer bancar (USD)"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Un creator Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Un utilizator Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Administrează facturarea utilizatorului"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Editează rolul"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Vizualizează detaliile utilizatorului"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Administrează proiectele"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Utilizatorul nu a fost găsit"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Insigne"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Acest utilizator nu are colecții!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Nu ai nicio colecție.\nVrei să <create-link>creezi una</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Acest utilizator nu are proiecte!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Nu aveți proiecte.\nDoriți să <create-link>creați unul</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizații"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Salvare..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Descarcă proiectele lui {username} pe Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Descarcă proiectele lui {username} pe Modrinth"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> urmăritor} other {<stat>{count}</stat> urmăritori}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID-ul utilizatorului: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Refuzarea invitației în echipă a eșuat"
|
"message": "Refuzarea invitației în echipă a eșuat"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3320,117 +3320,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "У этой организации ещё нет проектов. Хотите <create-link>создать новый</create-link>?"
|
"message": "У этой организации ещё нет проектов. Хотите <create-link>создать новый</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Автор на Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Пользователь Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Посмотреть аналитику"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Управление платежами"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Изменить роль"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Посмотреть подробности"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Управление проектами"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Убрать из партнёров"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Сделать партнёром"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# проект} few {# проекта} other {# проектов}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Сервисы входа"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Почта"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Почта подтверждена"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Есть пароль"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Есть TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Способы оплаты"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Почта не подтверждена"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Почта подтверждена"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Пользователь не найден"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Партнёр"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Значки"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Коллекция"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {скачивание} few {скачивания} other {скачиваний}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Регистрация:"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "У этого пользователя нет коллекций!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "У вас ещё нет коллекций.\nХотите <create-link>создать новую</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "У этого пользователя нет проектов!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "У вас ещё нет проектов.\nХотите <create-link>создать новый</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Организации"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {проект} few {проекта} other {проектов}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Сохранение..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Скачать проекты {username} на Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} — Скачать проекты {username} на Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Официальный аккаунт Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Официальный аккаунт Modrinth. Связаться с поддержкой можно по ссылке <support-link></support-link> или по электронной почте: <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> подписчик} few {<stat>{count}</stat> подписчика} other {<stat>{count}</stat> подписчиков}} у проектов"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID пользователя: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Не удалось отклонить приглашение в команду"
|
"message": "Не удалось отклонить приглашение в команду"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1220,51 +1220,6 @@
|
|||||||
"muralpay.field.phone-number": {
|
"muralpay.field.phone-number": {
|
||||||
"message": "Broj telefona"
|
"message": "Broj telefona"
|
||||||
},
|
},
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Pregled analitike korisnika"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Upravljaj naplatom korisnika"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Prikaži podatke o korisniku"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Upravljaj projektima"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Korisnik nije pronađen"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Bedževi"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Ovaj korisnik nema kolekcija!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Nemaš nijednu kolekciju.\nDa li želiš da <create-link>kreiraš jednu</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Ovaj korisnik nema projekata!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Nemaš nijedan projekat.\nDa li želiš da <create-link>kreiraš jedan</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizacije"
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Preuzmi projekte korisnika {username} na Modrinthu"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Preuzmi projekte korisnika {username} na Modrinthu"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> pratilac projekta} few {<stat>{count}</stat> pratioca projekta} other {<stat>{count}</stat> pratilaca projekta}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID korisnika: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Neuspešno odbijanje poziva tima"
|
"message": "Neuspešno odbijanje poziva tima"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2819,99 +2819,6 @@
|
|||||||
"organization.project-transfer.type-column": {
|
"organization.project-transfer.type-column": {
|
||||||
"message": "Typ"
|
"message": "Typ"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "En Modrinth kreatör."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "En Modrinth användare."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Visa användarstatistik"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Hantera användarfakturering"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Redigera roll"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Visa användardetaljer"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Hantera projekt"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count} projekt"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Autentiseringsleverantörer"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "E-post"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-post verifierad"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Har lösenord"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Har TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Betalningsmetoder"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "E-post ej verifierad"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "E-post verifierad"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Användare hittades inte"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Affiliate"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Märken"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Samling"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Gick med"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Denna användare har inga samlingar!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Du har inga samlingar.\nVill du <create-link>skapa en</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Denna användare har inga projekt!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Du har inga projekt.\nVill du <create-link>skapa ett</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organisationer"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Sparar..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Ladda ner {username}s projekt på Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Ladda ned {username}s projekt på Modrinth"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> följare} other {<stat>{count}</stat> följare}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Användar-ID: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Misslyckades att neka inbjudan"
|
"message": "Misslyckades att neka inbjudan"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2996,111 +2996,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Cüzdan adresinizi iki kez kontrol edin. Yanlış adrese gönderilen fonlar kurtarılamaz."
|
"message": "Cüzdan adresinizi iki kez kontrol edin. Yanlış adrese gönderilen fonlar kurtarılamaz."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Bir Modrinth içerik üreticisi."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Bir Modrinth kullanıcısı."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Kullanıcı analizlerini görüntüle"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Kullanıcı faturasını yönet"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Rolü düzenle"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Kullanıcı ayrıntılarını görüntüle"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Projeleri yönet"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Ortaklıktan kaldır"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Ortak olarak ayarla"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# project} other {# projects}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Kimlik doğrulama sağlayıcıları"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Eposta"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "E-posta doğrulandı"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Parola var"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "TOTP var"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Ödeme yöntemleri"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Eposta doğrulanmadı"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Eposta doğrulandı"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Kullanıcı bulunamadı"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Ortak"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Rozetler"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Koleksiyon"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Katılma:"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Bu kullanıcının hiç koleksiyonu yok!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Hiç koleksiyonun yok.\n<create-link>Oluşturmak</create-link> ister misin?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Bu kullanıcının hiç projesi yok!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Hiç projen yok.\n<create-link>Oluşturmak</create-link> ister misin?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Organizasyonlar"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Kaydediliyor..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "{username} kullanıcısının Modrinth'teki projelerini indir"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - {username} kullanıcısının Modrinth'teki projelerini indir"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Resmi Modrinth hesabı"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Modrinth'in resmi kullanıcı hesabı Destek için<support-link></support-link> adresinden veya <email></email> e-posta adresinden iletişime geçebilirsiniz"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> proje takipçisi} other {<stat>{count}</stat> proje takipçisi}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "Kullanıcı Kimliği: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Ekip daveti reddedilemedi"
|
"message": "Ekip daveti reddedilemedi"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3299,117 +3299,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "Ця організація ще не має проєктів. Бажаєте <create-link>створити новий</create-link>?"
|
"message": "Ця організація ще не має проєктів. Бажаєте <create-link>створити новий</create-link>?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Творець Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Користувач Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Переглянути аналітику користувача"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Керувати розрахунками користувача"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Редагувати роль"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Переглянути дані користувача"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Керувати проєктами"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Усунути як партнера"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Установити як партнера"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, one {# проєкт} few {# проєкти} many {# проєктів} other {# проєкту}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Провайдери автентифікації"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Електронна пошта"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Електронна адреса підтверджена"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Має пароль"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Має TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Способи оплати"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Електронна пошта не перевірена"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Електронна пошта перевірена"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Користувача не знайдено"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Партнер"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Значки"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Добірка"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, one {завантаження} few {завантаження} many {завантажень} other {завантаження}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Приєднався"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "У цього користувача немає добірок!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "У вас немає жодної добірки.\nБажаєте <create-link>створити її</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "У цього користувача немає проєктів!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "У вас немає жодного проєкту.\nБажаєте <create-link>створити якийсь</create-link>?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Організації"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, one {проєкт} few {проєкти} many {проєктів} other {проєктів}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Збереження…"
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Завантажте проєкти {username} на Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} — Завантажуйте проєкти {username} на Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Офіційний обліковий запис Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Офіційний обліковий запис Modrinth. Зв'язатися з підтримкою можна за <support-link></support-link> або через електронну пошту за <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, one {<stat>{count}</stat> відстежує} few {<stat>{count}</stat> відстежує} other {<stat>{count}</stat> відстежують}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID користувача: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Не вдалося відхилити запрошення до команди"
|
"message": "Не вдалося відхилити запрошення до команди"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2843,111 +2843,6 @@
|
|||||||
"muralpay.warning.wallet-address": {
|
"muralpay.warning.wallet-address": {
|
||||||
"message": "Hãy kiểm tra kỹ địa chỉ ví. Số tiền gửi đến địa chỉ không chính xác sẽ không thể khôi phục."
|
"message": "Hãy kiểm tra kỹ địa chỉ ví. Số tiền gửi đến địa chỉ không chính xác sẽ không thể khôi phục."
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "Một nhà sáng tạo trên Modrinth."
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "Một người dùng Modrinth."
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "Xem phân tích người dùng"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "Quản lý thanh toán người dùng"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "Chỉnh sửa vai trò"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "Xem chi tiết người dùng"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "Quản lý dự án"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "Xóa affiliate"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "Đặt làm affiliate"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, other {# dự án}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "Nhà cung cấp xác thực"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "Email"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "Email đã được xác minh"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "Có mật khẩu"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "Có TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "Phương thức thanh toán"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "Email chưa được xác minh"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "Email đã được xác minh"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "Không tìm thấy người dùng"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "Affiliate"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "Huy hiệu"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "Bộ sưu tập"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "Đã tham gia"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "Người dùng này chưa có bộ sưu tập nào!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "Bạn chưa có bộ sưu tập nào.\nBạn có muốn <create-link>tạo một bộ sưu tập</create-link> không?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "Người dùng này chưa có dự án nào!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "Bạn chưa có dự án nào.\nBạn có muốn <create-link>tạo một dự án</create-link> không?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "Tổ chức"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "Đang lưu..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "Tải xuống các dự án của {username} trên Modrinth"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - Tải xuống các dự án của {username} trên Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Tài khoản chính thúc bởi Modrinth"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Tài khoản chính thức của Modrinth. Nhận hỗ trợ từ <support-link></support-link> hoặc qua email tại <email></email>"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, other {<stat>{count}</stat> người theo dõi dự án}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "ID người dùng: {id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "Không thể từ chối lời mời vào nhóm"
|
"message": "Không thể từ chối lời mời vào nhóm"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3344,114 +3344,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "该组织还没有项目。想要<create-link>创建一个</create-link>吗?"
|
"message": "该组织还没有项目。想要<create-link>创建一个</create-link>吗?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "一位 Modrinth 创作者。"
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "一位 Modrinth 用户。"
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "查看用户分析"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "管理用户财务"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "编辑角色"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "查看用户详情"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "管理项目"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "解除作为联盟伙伴"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "设置为联盟伙伴"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "身份验证提供者"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "电子邮箱"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "电子邮箱已验证"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "已设置密码"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "已设置动态令牌"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "支付方式"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "电子邮箱未验证"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "电子邮箱验证成功"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "未找到用户"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "联盟"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "徽章"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "收藏夹"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, other {下载量}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "加入于"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "该用户没有收藏夹!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "你还没有收藏夹。\n想要<create-link>创建一个</create-link>吗?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "该用户没有项目!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "你还没有项目。\n想要<create-link>创建一个</create-link>吗?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "组织"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, other {项目}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "正在保存……"
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "前往 Modrinth 下载 {username} 的项目"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} - 前往 Modrinth 下载 {username} 的项目"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Modrinth 官方账户"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Modrinth的官方用户账号。在<support-link></support-link>处获取支持或通过电子邮件<email></email>获取支持"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, other {<stat>{count}</stat>项目关注者}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "用户ID:{id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "拒绝团队邀请时失败"
|
"message": "拒绝团队邀请时失败"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3344,117 +3344,6 @@
|
|||||||
"organization.projects.none-with-create-prompt": {
|
"organization.projects.none-with-create-prompt": {
|
||||||
"message": "這個組織還沒有任何專案。你想要<create-link>建立一個</create-link>嗎?"
|
"message": "這個組織還沒有任何專案。你想要<create-link>建立一個</create-link>嗎?"
|
||||||
},
|
},
|
||||||
"profile.bio.fallback.creator": {
|
|
||||||
"message": "一位 Modrinth 創作者。"
|
|
||||||
},
|
|
||||||
"profile.bio.fallback.user": {
|
|
||||||
"message": "一位 Modrinth 使用者。"
|
|
||||||
},
|
|
||||||
"profile.button.analytics": {
|
|
||||||
"message": "檢視使用者數據分析"
|
|
||||||
},
|
|
||||||
"profile.button.billing": {
|
|
||||||
"message": "管理使用者帳務"
|
|
||||||
},
|
|
||||||
"profile.button.edit-role": {
|
|
||||||
"message": "編輯角色"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
|
||||||
"message": "檢視使用者詳細資訊"
|
|
||||||
},
|
|
||||||
"profile.button.manage-projects": {
|
|
||||||
"message": "管理專案"
|
|
||||||
},
|
|
||||||
"profile.button.remove-affiliate": {
|
|
||||||
"message": "移除聯盟行銷夥伴資格"
|
|
||||||
},
|
|
||||||
"profile.button.set-affiliate": {
|
|
||||||
"message": "設為聯盟行銷夥伴"
|
|
||||||
},
|
|
||||||
"profile.collection.projects-count": {
|
|
||||||
"message": "{count, plural, other {# 個專案}}"
|
|
||||||
},
|
|
||||||
"profile.details.label.auth-providers": {
|
|
||||||
"message": "驗證提供者"
|
|
||||||
},
|
|
||||||
"profile.details.label.email": {
|
|
||||||
"message": "電子郵件"
|
|
||||||
},
|
|
||||||
"profile.details.label.email-verified": {
|
|
||||||
"message": "電子郵件已驗證"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-password": {
|
|
||||||
"message": "是否有密碼"
|
|
||||||
},
|
|
||||||
"profile.details.label.has-totp": {
|
|
||||||
"message": "是否有 TOTP"
|
|
||||||
},
|
|
||||||
"profile.details.label.payment-methods": {
|
|
||||||
"message": "付款方式"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-not-verified": {
|
|
||||||
"message": "電子郵件尚未驗證"
|
|
||||||
},
|
|
||||||
"profile.details.tooltip.email-verified": {
|
|
||||||
"message": "電子郵件已驗證"
|
|
||||||
},
|
|
||||||
"profile.error.not-found": {
|
|
||||||
"message": "找不到使用者"
|
|
||||||
},
|
|
||||||
"profile.label.affiliate": {
|
|
||||||
"message": "聯盟行銷"
|
|
||||||
},
|
|
||||||
"profile.label.badges": {
|
|
||||||
"message": "徽章"
|
|
||||||
},
|
|
||||||
"profile.label.collection": {
|
|
||||||
"message": "收藏"
|
|
||||||
},
|
|
||||||
"profile.label.download-count": {
|
|
||||||
"message": "{count, plural, other {次下載}}"
|
|
||||||
},
|
|
||||||
"profile.label.joined": {
|
|
||||||
"message": "加入時間:"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
|
||||||
"message": "這個使用者沒有任何收藏!"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections-auth": {
|
|
||||||
"message": "你還沒有任何收藏。\n你想要<create-link>建立一個</create-link>嗎?"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects": {
|
|
||||||
"message": "這個使用者沒有任何專案!"
|
|
||||||
},
|
|
||||||
"profile.label.no-projects-auth": {
|
|
||||||
"message": "你還沒有任何專案。\n你想要<create-link>建立一個</create-link>嗎?"
|
|
||||||
},
|
|
||||||
"profile.label.organizations": {
|
|
||||||
"message": "組織"
|
|
||||||
},
|
|
||||||
"profile.label.project-count": {
|
|
||||||
"message": "{count, plural, other {個專案}}"
|
|
||||||
},
|
|
||||||
"profile.label.saving": {
|
|
||||||
"message": "儲存中..."
|
|
||||||
},
|
|
||||||
"profile.meta.description": {
|
|
||||||
"message": "前往 Modrinth 下載 {username} 的專案"
|
|
||||||
},
|
|
||||||
"profile.meta.description-with-bio": {
|
|
||||||
"message": "{bio} — 前往 Modrinth 下載 {username} 的專案"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
|
||||||
"message": "Modrinth 官方帳號"
|
|
||||||
},
|
|
||||||
"profile.official-account.bio": {
|
|
||||||
"message": "Modrinth 的官方使用者帳號。請至 <support-link></support-link> 取得支援,或透過電子郵件 <email></email> 聯絡客服團隊"
|
|
||||||
},
|
|
||||||
"profile.stats.projects-followers": {
|
|
||||||
"message": "{count, plural, other {<stat>{count}</stat> 位專案追蹤者}}"
|
|
||||||
},
|
|
||||||
"profile.user-id": {
|
|
||||||
"message": "使用者 ID:{id}"
|
|
||||||
},
|
|
||||||
"project-member-header.error-decline": {
|
"project-member-header.error-decline": {
|
||||||
"message": "拒絕團隊邀請失敗"
|
"message": "拒絕團隊邀請失敗"
|
||||||
},
|
},
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,8 @@
|
|||||||
use crate::State;
|
use crate::State;
|
||||||
use crate::util::fetch::fetch_json;
|
use crate::util::fetch::{fetch_advanced, fetch_json};
|
||||||
use reqwest::Method;
|
use reqwest::Method;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
pub struct SearchUser {
|
pub struct SearchUser {
|
||||||
@@ -30,3 +31,101 @@ pub async fn search_user(query: &str) -> crate::Result<Vec<SearchUser>> {
|
|||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument]
|
||||||
|
pub async fn get_user_profile(user_id: &str) -> crate::Result<Value> {
|
||||||
|
let state = State::get().await?;
|
||||||
|
let user_id = urlencoding::encode(user_id);
|
||||||
|
|
||||||
|
fetch_json(
|
||||||
|
Method::GET,
|
||||||
|
&format!("{}user/{}", env!("MODRINTH_API_URL_V3"), user_id),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some("/v3/user/:id"),
|
||||||
|
&state.api_semaphore,
|
||||||
|
&state.pool,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument]
|
||||||
|
pub async fn get_user_projects(user_id: &str) -> crate::Result<Value> {
|
||||||
|
let state = State::get().await?;
|
||||||
|
let user_id = urlencoding::encode(user_id);
|
||||||
|
|
||||||
|
fetch_json(
|
||||||
|
Method::GET,
|
||||||
|
&format!("{}user/{}/projects", env!("MODRINTH_API_URL"), user_id),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some("/v2/user/:id/projects"),
|
||||||
|
&state.api_semaphore,
|
||||||
|
&state.pool,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument]
|
||||||
|
pub async fn get_user_organizations(user_id: &str) -> crate::Result<Value> {
|
||||||
|
let state = State::get().await?;
|
||||||
|
let user_id = urlencoding::encode(user_id);
|
||||||
|
|
||||||
|
fetch_json(
|
||||||
|
Method::GET,
|
||||||
|
&format!(
|
||||||
|
"{}user/{}/organizations",
|
||||||
|
env!("MODRINTH_API_URL_V3"),
|
||||||
|
user_id
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some("/v3/user/:id/organizations"),
|
||||||
|
&state.api_semaphore,
|
||||||
|
&state.pool,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument]
|
||||||
|
pub async fn get_user_collections(user_id: &str) -> crate::Result<Value> {
|
||||||
|
let state = State::get().await?;
|
||||||
|
let user_id = urlencoding::encode(user_id);
|
||||||
|
|
||||||
|
fetch_json(
|
||||||
|
Method::GET,
|
||||||
|
&format!(
|
||||||
|
"{}user/{}/collections",
|
||||||
|
env!("MODRINTH_API_URL_V3"),
|
||||||
|
user_id
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some("/v3/user/:id/collections"),
|
||||||
|
&state.api_semaphore,
|
||||||
|
&state.pool,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(skip(patch))]
|
||||||
|
pub async fn patch_user(user_id: &str, patch: Value) -> crate::Result<()> {
|
||||||
|
let state = State::get().await?;
|
||||||
|
let user_id = urlencoding::encode(user_id);
|
||||||
|
|
||||||
|
fetch_advanced(
|
||||||
|
Method::PATCH,
|
||||||
|
&format!("{}user/{}", env!("MODRINTH_API_URL"), user_id),
|
||||||
|
None,
|
||||||
|
Some(patch),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some("/v2/user/:id"),
|
||||||
|
&state.api_semaphore,
|
||||||
|
&state.pool,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
:key="`member-${member.id}`"
|
:key="`member-${member.id}`"
|
||||||
class="flex gap-2 items-center w-fit text-primary leading-[1.2] group"
|
class="flex gap-2 items-center w-fit text-primary leading-[1.2] group"
|
||||||
:to="userLink(member.user.username)"
|
:to="userLink(member.user.username)"
|
||||||
:target="linkTarget ?? null"
|
:target="resolveLinkTarget(userLinkTarget)"
|
||||||
>
|
>
|
||||||
<Avatar :src="member.user.avatar_url" :alt="member.user.username" size="32px" circle />
|
<Avatar :src="member.user.avatar_url" :alt="member.user.username" size="32px" circle />
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
v-tooltip="formatMessage(messages.owner)"
|
v-tooltip="formatMessage(messages.owner)"
|
||||||
class="text-brand-orange"
|
class="text-brand-orange"
|
||||||
/>
|
/>
|
||||||
<ExternalIcon v-if="linkTarget === '_blank'" />
|
<ExternalIcon v-if="resolveLinkTarget(userLinkTarget) === '_blank'" />
|
||||||
</span>
|
</span>
|
||||||
<span class="text-sm font-normal text-secondary">{{ member.role }}</span>
|
<span class="text-sm font-normal text-secondary">{{ member.role }}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -79,8 +79,13 @@ const props = defineProps<{
|
|||||||
orgLink: (slug: string) => string
|
orgLink: (slug: string) => string
|
||||||
userLink: (username: string) => string
|
userLink: (username: string) => string
|
||||||
linkTarget?: string
|
linkTarget?: string
|
||||||
|
userLinkTarget?: string | null
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
|
function resolveLinkTarget(target: string | null | undefined): string | null {
|
||||||
|
return target === undefined ? (props.linkTarget ?? null) : target
|
||||||
|
}
|
||||||
|
|
||||||
// Members should be an array of all members, without the accepted ones, and with the user with the Owner role at the start
|
// Members should be an array of all members, without the accepted ones, and with the user with the Owner role at the start
|
||||||
// The rest of the members should be sorted by role, then by name
|
// The rest of the members should be sorted by role, then by name
|
||||||
const sortedMembers = computed(() => {
|
const sortedMembers = computed(() => {
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ const backupCreator = computed(() => {
|
|||||||
|
|
||||||
const creatorProfileLink = computed(() =>
|
const creatorProfileLink = computed(() =>
|
||||||
backupCreator.value && backupCreator.value.id !== 'support'
|
backupCreator.value && backupCreator.value.id !== 'support'
|
||||||
? `https://modrinth.com/user/${encodeURIComponent(backupCreator.value.username)}`
|
? `/user/${encodeURIComponent(backupCreator.value.username)}`
|
||||||
: undefined,
|
: undefined,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -224,8 +224,6 @@ const creatorAvatarSrc = computed(() =>
|
|||||||
<template v-else-if="backupCreator">
|
<template v-else-if="backupCreator">
|
||||||
<AutoLink
|
<AutoLink
|
||||||
:to="creatorProfileLink"
|
:to="creatorProfileLink"
|
||||||
:target="creatorProfileLink ? '_blank' : undefined"
|
|
||||||
:rel="creatorProfileLink ? 'noopener noreferrer' : undefined"
|
|
||||||
class="group flex min-w-0 items-center gap-1.5"
|
class="group flex min-w-0 items-center gap-1.5"
|
||||||
:class="creatorProfileLink ? 'text-secondary hover:underline' : 'text-primary'"
|
:class="creatorProfileLink ? 'text-secondary hover:underline' : 'text-primary'"
|
||||||
>
|
>
|
||||||
|
|||||||
+28
-27
@@ -58,10 +58,10 @@
|
|||||||
<template #actions>
|
<template #actions>
|
||||||
<PageHeaderActions>
|
<PageHeaderActions>
|
||||||
<ButtonStyled v-if="isSelf" size="large">
|
<ButtonStyled v-if="isSelf" size="large">
|
||||||
<nuxt-link to="/settings/profile">
|
<AutoLink :to="editProfileLink">
|
||||||
<EditIcon />
|
<EditIcon />
|
||||||
{{ formatMessage(commonMessages.editButton) }}
|
{{ formatMessage(commonMessages.editButton) }}
|
||||||
</nuxt-link>
|
</AutoLink>
|
||||||
</ButtonStyled>
|
</ButtonStyled>
|
||||||
<ButtonStyled circular size="large" type="transparent">
|
<ButtonStyled circular size="large" type="transparent">
|
||||||
<TeleportOverflowMenu
|
<TeleportOverflowMenu
|
||||||
@@ -93,25 +93,23 @@ import {
|
|||||||
MoreVerticalIcon,
|
MoreVerticalIcon,
|
||||||
ReportIcon,
|
ReportIcon,
|
||||||
} from '@modrinth/assets'
|
} from '@modrinth/assets'
|
||||||
import {
|
|
||||||
Avatar,
|
|
||||||
ButtonStyled,
|
|
||||||
commonMessages,
|
|
||||||
defineMessages,
|
|
||||||
PageHeader,
|
|
||||||
PageHeaderActions,
|
|
||||||
PageHeaderBadgeItem,
|
|
||||||
PageHeaderMetadata,
|
|
||||||
PageHeaderMetadataNumberItem,
|
|
||||||
PageHeaderMetadataTimeItem,
|
|
||||||
TeleportOverflowMenu,
|
|
||||||
type TeleportOverflowMenuItem,
|
|
||||||
useFormatDateTime,
|
|
||||||
useFormatNumber,
|
|
||||||
useVIntl,
|
|
||||||
} from '@modrinth/ui'
|
|
||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
|
|
||||||
|
import AutoLink from '#ui/components/base/AutoLink.vue'
|
||||||
|
import Avatar from '#ui/components/base/Avatar.vue'
|
||||||
|
import ButtonStyled from '#ui/components/base/ButtonStyled.vue'
|
||||||
|
import PageHeader from '#ui/components/base/page-header/index.vue'
|
||||||
|
import PageHeaderMetadata from '#ui/components/base/page-header/metadata/index.vue'
|
||||||
|
import PageHeaderMetadataNumberItem from '#ui/components/base/page-header/metadata/page-header-metadata-number-item.vue'
|
||||||
|
import PageHeaderMetadataTimeItem from '#ui/components/base/page-header/metadata/page-header-metadata-time-item.vue'
|
||||||
|
import PageHeaderActions from '#ui/components/base/page-header/page-header-actions.vue'
|
||||||
|
import PageHeaderBadgeItem from '#ui/components/base/page-header/page-header-badge-item.vue'
|
||||||
|
import type { Item as TeleportOverflowMenuItem } from '#ui/components/base/TeleportOverflowMenu.vue'
|
||||||
|
import TeleportOverflowMenu from '#ui/components/base/TeleportOverflowMenu.vue'
|
||||||
|
import { defineMessages, useFormatDateTime, useFormatNumber, useVIntl } from '#ui/composables'
|
||||||
|
import type { AuthUser } from '#ui/providers/auth'
|
||||||
|
import { commonMessages } from '#ui/utils'
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
affiliateLabel: {
|
affiliateLabel: {
|
||||||
id: 'profile.label.affiliate',
|
id: 'profile.label.affiliate',
|
||||||
@@ -167,7 +165,8 @@ const props = withDefaults(
|
|||||||
defineProps<{
|
defineProps<{
|
||||||
user: Labrinth.Users.v3.User
|
user: Labrinth.Users.v3.User
|
||||||
summary?: string | null
|
summary?: string | null
|
||||||
authUser?: Labrinth.Users.v3.User | null
|
authUser?: AuthUser | null
|
||||||
|
editProfileLink?: string | (() => void)
|
||||||
isModrinthUser?: boolean
|
isModrinthUser?: boolean
|
||||||
isOfficialAccount?: boolean
|
isOfficialAccount?: boolean
|
||||||
showAffiliateBadge?: boolean
|
showAffiliateBadge?: boolean
|
||||||
@@ -175,12 +174,14 @@ const props = withDefaults(
|
|||||||
isSelf?: boolean
|
isSelf?: boolean
|
||||||
isAdmin?: boolean
|
isAdmin?: boolean
|
||||||
isStaff?: boolean
|
isStaff?: boolean
|
||||||
|
showStaffActions?: boolean
|
||||||
projectsCount?: number
|
projectsCount?: number
|
||||||
downloads?: number
|
downloads?: number
|
||||||
}>(),
|
}>(),
|
||||||
{
|
{
|
||||||
summary: null,
|
summary: null,
|
||||||
authUser: null,
|
authUser: null,
|
||||||
|
editProfileLink: '/settings/profile',
|
||||||
isModrinthUser: false,
|
isModrinthUser: false,
|
||||||
isOfficialAccount: false,
|
isOfficialAccount: false,
|
||||||
showAffiliateBadge: false,
|
showAffiliateBadge: false,
|
||||||
@@ -188,6 +189,7 @@ const props = withDefaults(
|
|||||||
isSelf: false,
|
isSelf: false,
|
||||||
isAdmin: false,
|
isAdmin: false,
|
||||||
isStaff: false,
|
isStaff: false,
|
||||||
|
showStaffActions: false,
|
||||||
projectsCount: 0,
|
projectsCount: 0,
|
||||||
downloads: 0,
|
downloads: 0,
|
||||||
},
|
},
|
||||||
@@ -206,7 +208,6 @@ const emit = defineEmits<{
|
|||||||
}>()
|
}>()
|
||||||
|
|
||||||
const { formatMessage } = useVIntl()
|
const { formatMessage } = useVIntl()
|
||||||
|
|
||||||
const formatNumber = useFormatNumber()
|
const formatNumber = useFormatNumber()
|
||||||
const formatDateTime = useFormatDateTime({
|
const formatDateTime = useFormatDateTime({
|
||||||
timeStyle: 'short',
|
timeStyle: 'short',
|
||||||
@@ -249,14 +250,14 @@ const moreActions = computed<TeleportOverflowMenuItem[]>(() => [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
divider: true,
|
divider: true,
|
||||||
shown: props.isAdmin,
|
shown: props.showStaffActions && (props.isAdmin || props.isStaff),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'open-billing',
|
id: 'open-billing',
|
||||||
label: formatMessage(messages.billingButton),
|
label: formatMessage(messages.billingButton),
|
||||||
icon: CurrencyIcon,
|
icon: CurrencyIcon,
|
||||||
action: () => emit('openBilling'),
|
action: () => emit('openBilling'),
|
||||||
shown: props.isStaff,
|
shown: props.showStaffActions && props.isStaff,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'toggle-affiliate',
|
id: 'toggle-affiliate',
|
||||||
@@ -265,7 +266,7 @@ const moreActions = computed<TeleportOverflowMenuItem[]>(() => [
|
|||||||
: formatMessage(messages.setAffiliateButton),
|
: formatMessage(messages.setAffiliateButton),
|
||||||
icon: AffiliateIcon,
|
icon: AffiliateIcon,
|
||||||
action: () => emit('toggleAffiliate'),
|
action: () => emit('toggleAffiliate'),
|
||||||
shown: props.isAdmin,
|
shown: props.showStaffActions && props.isAdmin,
|
||||||
remainOnClick: true,
|
remainOnClick: true,
|
||||||
color: props.isAffiliate ? 'red' : 'orange',
|
color: props.isAffiliate ? 'red' : 'orange',
|
||||||
},
|
},
|
||||||
@@ -274,21 +275,21 @@ const moreActions = computed<TeleportOverflowMenuItem[]>(() => [
|
|||||||
label: formatMessage(messages.infoButton),
|
label: formatMessage(messages.infoButton),
|
||||||
icon: InfoIcon,
|
icon: InfoIcon,
|
||||||
action: () => emit('openInfo'),
|
action: () => emit('openInfo'),
|
||||||
shown: props.isStaff,
|
shown: props.showStaffActions && props.isStaff,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'open-analytics',
|
id: 'open-analytics',
|
||||||
label: formatMessage(messages.analyticsButton),
|
label: formatMessage(messages.analyticsButton),
|
||||||
icon: ChartIcon,
|
icon: ChartIcon,
|
||||||
action: () => emit('openAnalytics'),
|
action: () => emit('openAnalytics'),
|
||||||
shown: props.isAdmin,
|
shown: props.showStaffActions && props.isAdmin,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'edit-role',
|
id: 'edit-role',
|
||||||
label: formatMessage(messages.editRoleButton),
|
label: formatMessage(messages.editRoleButton),
|
||||||
icon: EditIcon,
|
icon: EditIcon,
|
||||||
action: () => emit('editRole'),
|
action: () => emit('editRole'),
|
||||||
shown: props.isAdmin,
|
shown: props.showStaffActions && props.isAdmin,
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
</script>
|
</script>
|
||||||
@@ -1 +1,2 @@
|
|||||||
export { default as UserBadges } from './UserBadges.vue'
|
export { default as UserBadges } from './UserBadges.vue'
|
||||||
|
export { default as UserPageHeader } from './UserPageHeader.vue'
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ export * from './shared/content-tab'
|
|||||||
export * from './shared/files-tab'
|
export * from './shared/files-tab'
|
||||||
export * from './shared/installation-settings'
|
export * from './shared/installation-settings'
|
||||||
export * from './shared/server-settings'
|
export * from './shared/server-settings'
|
||||||
|
export * from './shared/user-profile'
|
||||||
export * from './wrapped'
|
export * from './wrapped'
|
||||||
|
|||||||
@@ -280,9 +280,7 @@ function getProjectCardTags(result: Labrinth.Search.v3.ResultSearchProject, disp
|
|||||||
name: result.organization == null ? result.author : result.organization,
|
name: result.organization == null ? result.author : result.organization,
|
||||||
link:
|
link:
|
||||||
result.organization_id == null
|
result.organization_id == null
|
||||||
? ctx.variant === 'web'
|
? `/user/${encodeURIComponent(result.author_id ?? result.author)}`
|
||||||
? `/user/${result.author_id ?? result.author}`
|
|
||||||
: `https://modrinth.com/user/${result.author_id ?? result.author}`
|
|
||||||
: ctx.variant === 'web'
|
: ctx.variant === 'web'
|
||||||
? `/organization/${result.organization_id}`
|
? `/organization/${result.organization_id}`
|
||||||
: `https://modrinth.com/organization/${result.organization_id}`,
|
: `https://modrinth.com/organization/${result.organization_id}`,
|
||||||
|
|||||||
+4
-1
@@ -260,7 +260,10 @@ const tableItems = computed<ContentCardTableItem[]>(() =>
|
|||||||
owner: item.owner
|
owner: item.owner
|
||||||
? {
|
? {
|
||||||
...item.owner,
|
...item.owner,
|
||||||
link: `https://modrinth.com/${item.owner.type}/${item.owner.id}`,
|
link:
|
||||||
|
item.owner.type === 'user'
|
||||||
|
? `/user/${encodeURIComponent(item.owner.id)}`
|
||||||
|
: `https://modrinth.com/organization/${item.owner.id}`,
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
...(props.enableToggle ? { enabled: item.enabled } : {}),
|
...(props.enableToggle ? { enabled: item.enabled } : {}),
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export { default as UserProfilePageLayout } from './layout.vue'
|
||||||
|
export * from './providers'
|
||||||
@@ -0,0 +1,881 @@
|
|||||||
|
<template>
|
||||||
|
<template v-if="user">
|
||||||
|
<NewModal
|
||||||
|
v-if="variant === 'web'"
|
||||||
|
ref="editRoleModal"
|
||||||
|
:header="formatMessage(messages.editRoleButton)"
|
||||||
|
>
|
||||||
|
<div class="flex w-80 flex-col gap-4">
|
||||||
|
<Combobox
|
||||||
|
v-model="selectedRole"
|
||||||
|
:options="roleOptions"
|
||||||
|
:placeholder="formatMessage(messages.selectRolePlaceholder)"
|
||||||
|
/>
|
||||||
|
<div class="flex justify-end gap-2">
|
||||||
|
<ButtonStyled>
|
||||||
|
<button type="button" @click="cancelRoleEdit">
|
||||||
|
<XIcon />
|
||||||
|
{{ formatMessage(commonMessages.cancelButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
:disabled="!selectedRole || selectedRole === user.role || isSavingRole"
|
||||||
|
@click="saveRoleEdit"
|
||||||
|
>
|
||||||
|
<template v-if="isSavingRole">
|
||||||
|
<SpinnerIcon class="animate-spin" />
|
||||||
|
{{ formatMessage(messages.savingLabel) }}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<SaveIcon />
|
||||||
|
{{ formatMessage(commonMessages.saveChangesButton) }}
|
||||||
|
</template>
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</NewModal>
|
||||||
|
|
||||||
|
<NewModal
|
||||||
|
v-if="variant === 'web' && isStaffViewing"
|
||||||
|
ref="userDetailsModal"
|
||||||
|
:header="formatMessage(messages.userDetailsTitle)"
|
||||||
|
>
|
||||||
|
<div class="flex flex-col gap-3">
|
||||||
|
<div v-if="isAdminViewing" class="flex flex-col gap-1">
|
||||||
|
<span class="text-lg font-bold text-primary">
|
||||||
|
{{ formatMessage(commonMessages.emailLabel) }}
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
v-tooltip="
|
||||||
|
user.email_verified
|
||||||
|
? formatMessage(messages.emailVerifiedTooltip)
|
||||||
|
: formatMessage(messages.emailNotVerifiedTooltip)
|
||||||
|
"
|
||||||
|
class="flex w-fit items-center gap-1"
|
||||||
|
>
|
||||||
|
<span>{{ user.email }}</span>
|
||||||
|
<CheckIcon v-if="user.email_verified" class="h-4 w-4 text-brand" />
|
||||||
|
<XIcon v-else class="h-4 w-4 text-red" />
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-else class="flex flex-col gap-1">
|
||||||
|
<span class="text-lg font-bold text-primary">
|
||||||
|
{{ formatMessage(messages.emailVerifiedLabel) }}
|
||||||
|
</span>
|
||||||
|
<span class="flex w-fit items-center gap-1">
|
||||||
|
<CheckIcon v-if="user.email_verified" class="h-4 w-4 text-brand" />
|
||||||
|
<XIcon v-else class="h-4 w-4 text-red" />
|
||||||
|
{{
|
||||||
|
user.email_verified
|
||||||
|
? formatMessage(commonMessages.yesLabel)
|
||||||
|
: formatMessage(commonMessages.noLabel)
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="isAdminViewing" class="flex flex-col gap-1">
|
||||||
|
<span class="text-lg font-bold text-primary">
|
||||||
|
{{ formatMessage(messages.authProvidersLabel) }}
|
||||||
|
</span>
|
||||||
|
<span>{{ user.auth_providers?.join(', ') || '—' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="isAdminViewing" class="flex flex-col gap-1">
|
||||||
|
<span class="text-lg font-bold text-primary">
|
||||||
|
{{ formatMessage(messages.paymentMethodsLabel) }}
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
<template v-if="user.payout_data?.paypal_address">
|
||||||
|
Paypal ({{ user.payout_data.paypal_address }}
|
||||||
|
<template v-if="user.payout_data.paypal_country">
|
||||||
|
- {{ user.payout_data.paypal_country }}
|
||||||
|
</template>
|
||||||
|
)
|
||||||
|
</template>
|
||||||
|
<template v-if="user.payout_data?.paypal_address && user.payout_data?.venmo_handle">
|
||||||
|
,
|
||||||
|
</template>
|
||||||
|
<template v-if="user.payout_data?.venmo_handle">
|
||||||
|
Venmo ({{ user.payout_data.venmo_handle }})
|
||||||
|
</template>
|
||||||
|
<template v-if="!user.payout_data?.paypal_address && !user.payout_data?.venmo_handle">
|
||||||
|
—
|
||||||
|
</template>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-1">
|
||||||
|
<span class="text-lg font-bold text-primary">
|
||||||
|
{{ formatMessage(messages.hasPasswordLabel) }}
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
{{
|
||||||
|
user.has_password
|
||||||
|
? formatMessage(commonMessages.yesLabel)
|
||||||
|
: formatMessage(commonMessages.noLabel)
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-1">
|
||||||
|
<span class="text-lg font-bold text-primary">
|
||||||
|
{{ formatMessage(messages.hasTotpLabel) }}
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
{{
|
||||||
|
user.has_totp
|
||||||
|
? formatMessage(commonMessages.yesLabel)
|
||||||
|
: formatMessage(commonMessages.noLabel)
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</NewModal>
|
||||||
|
|
||||||
|
<NormalPage :sidebar="sidebarPosition">
|
||||||
|
<template #header>
|
||||||
|
<UserPageHeader
|
||||||
|
:user="user"
|
||||||
|
:summary="isModrinthUser ? null : profileHeaderSummary"
|
||||||
|
:auth-user="auth.user.value"
|
||||||
|
:edit-profile-link="editProfileLink"
|
||||||
|
:is-modrinth-user="isModrinthUser"
|
||||||
|
:is-official-account="isOfficialAccount"
|
||||||
|
:show-affiliate-badge="isAdminViewing && isAffiliate"
|
||||||
|
:is-affiliate="isAffiliate"
|
||||||
|
:is-self="isSelf"
|
||||||
|
:is-admin="isAdminViewing"
|
||||||
|
:is-staff="isStaffViewing"
|
||||||
|
:show-staff-actions="variant === 'web'"
|
||||||
|
:projects-count="projects.length"
|
||||||
|
:downloads="sumDownloads"
|
||||||
|
@manage-projects="openPath('/dashboard/projects')"
|
||||||
|
@report="reportProfile"
|
||||||
|
@copy-id="copyId"
|
||||||
|
@copy-permalink="copyPermalink"
|
||||||
|
@open-billing="openPath(`/admin/billing/${user.id}`)"
|
||||||
|
@toggle-affiliate="toggleAffiliate"
|
||||||
|
@open-info="openUserDetails"
|
||||||
|
@open-analytics="
|
||||||
|
openPath(`/dashboard/analytics?user=${encodeURIComponent(user.username)}`)
|
||||||
|
"
|
||||||
|
@edit-role="openRoleEditModal"
|
||||||
|
>
|
||||||
|
<template v-if="isModrinthUser" #summary>
|
||||||
|
<IntlFormatted :message-id="messages.officialAccountBio">
|
||||||
|
<template #support-link>
|
||||||
|
<a
|
||||||
|
href="https://support.modrinth.com"
|
||||||
|
class="text-link"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
https://support.modrinth.com
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
<template #email>
|
||||||
|
<a
|
||||||
|
href="mailto:support@modrinth.com"
|
||||||
|
class="text-link"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
support@modrinth.com
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
</IntlFormatted>
|
||||||
|
</template>
|
||||||
|
</UserPageHeader>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-4">
|
||||||
|
<div v-if="navLinks.length > 2" class="max-w-full overflow-x-auto">
|
||||||
|
<NavTabs :links="navLinks" replace />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-3">
|
||||||
|
<ProjectCardList
|
||||||
|
v-if="selectedProjectType !== 'collection' && filteredProjects.length > 0"
|
||||||
|
:layout="displayMode"
|
||||||
|
>
|
||||||
|
<ProjectCard
|
||||||
|
v-for="project in filteredProjects"
|
||||||
|
:key="project.id"
|
||||||
|
:link="projectLink(project)"
|
||||||
|
:title="project.title"
|
||||||
|
:icon-url="project.icon_url"
|
||||||
|
:date-updated="project.updated"
|
||||||
|
:downloads="project.downloads"
|
||||||
|
:summary="project.description"
|
||||||
|
:tags="[...project.categories, ...project.loaders]"
|
||||||
|
:all-tags="[
|
||||||
|
...project.categories,
|
||||||
|
...project.loaders,
|
||||||
|
...project.additional_categories,
|
||||||
|
]"
|
||||||
|
:followers="project.followers"
|
||||||
|
:banner="project.gallery?.find((image) => image.featured)?.url"
|
||||||
|
:color="project.color"
|
||||||
|
:environment="{
|
||||||
|
clientSide: project.client_side,
|
||||||
|
serverSide: project.server_side,
|
||||||
|
}"
|
||||||
|
:layout="displayMode === 'list' ? 'list' : 'grid'"
|
||||||
|
:status="project.status"
|
||||||
|
/>
|
||||||
|
</ProjectCardList>
|
||||||
|
|
||||||
|
<EmptyState
|
||||||
|
v-if="showProjectsEmptyState"
|
||||||
|
type="empty"
|
||||||
|
:heading="formatMessage(messages.profileNoProjectsLabel)"
|
||||||
|
:description="
|
||||||
|
isSelf ? formatMessage(messages.profileNoProjectsAuthDescription) : undefined
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<template v-if="isSelf" #actions>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button type="button" @click="createProject">
|
||||||
|
{{ formatMessage(messages.createProjectButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
</EmptyState>
|
||||||
|
|
||||||
|
<ProjectCardList
|
||||||
|
v-if="selectedProjectType === null || selectedProjectType === 'collection'"
|
||||||
|
layout="grid"
|
||||||
|
>
|
||||||
|
<SmartClickable
|
||||||
|
v-for="collection in sortedCollections"
|
||||||
|
:key="collection.id"
|
||||||
|
class="h-full w-full"
|
||||||
|
>
|
||||||
|
<template #clickable>
|
||||||
|
<AutoLink
|
||||||
|
:to="collectionLink(collection.id)"
|
||||||
|
class="no-click-animation custom-focus-indicator rounded-xl no-outline"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<div
|
||||||
|
class="smart-clickable:outline-on-focus smart-clickable:highlight-on-hover flex h-full w-full flex-col gap-4 overflow-hidden rounded-2xl border-[1px] border-solid border-surface-4 bg-surface-3 p-4 text-left transition-all"
|
||||||
|
>
|
||||||
|
<div class="grid grid-cols-[auto_1fr] gap-4">
|
||||||
|
<Avatar :src="collection.icon_url" size="64px" no-shadow />
|
||||||
|
<div class="flex min-w-0 flex-col gap-2">
|
||||||
|
<h2
|
||||||
|
class="smart-clickable:underline-on-hover m-0 truncate text-lg font-semibold text-contrast"
|
||||||
|
>
|
||||||
|
{{ collection.name }}
|
||||||
|
</h2>
|
||||||
|
<div class="flex items-center gap-1">
|
||||||
|
<LibraryIcon aria-hidden="true" />
|
||||||
|
{{ formatMessage(messages.collectionLabel) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="grow text-primary">
|
||||||
|
{{ collection.description }}
|
||||||
|
</div>
|
||||||
|
<div class="mt-auto flex flex-wrap items-center gap-4">
|
||||||
|
<div class="flex items-center gap-1">
|
||||||
|
<BoxIcon />
|
||||||
|
{{
|
||||||
|
formatMessage(messages.collectionProjectsCount, {
|
||||||
|
count: collection.projects.length,
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-1">
|
||||||
|
<template v-if="collection.status === 'listed'">
|
||||||
|
<GlobeIcon />
|
||||||
|
{{ formatMessage(commonMessages.publicLabel) }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="collection.status === 'unlisted'">
|
||||||
|
<LinkIcon />
|
||||||
|
{{ formatMessage(commonMessages.unlistedLabel) }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="collection.status === 'private'">
|
||||||
|
<LockIcon />
|
||||||
|
{{ formatMessage(commonMessages.privateLabel) }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="collection.status === 'rejected'">
|
||||||
|
<XIcon />
|
||||||
|
{{ formatMessage(commonMessages.rejectedLabel) }}
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</SmartClickable>
|
||||||
|
</ProjectCardList>
|
||||||
|
|
||||||
|
<EmptyState
|
||||||
|
v-if="showCollectionsEmptyState"
|
||||||
|
type="empty"
|
||||||
|
:heading="formatMessage(messages.profileNoCollectionsLabel)"
|
||||||
|
:description="
|
||||||
|
isSelf ? formatMessage(messages.profileNoCollectionsAuthDescription) : undefined
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<template v-if="isSelf" #actions>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button type="button" @click="createCollection">
|
||||||
|
{{ formatMessage(messages.createCollectionButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
</EmptyState>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #sidebar>
|
||||||
|
<div class="flex flex-col" :class="{ 'gap-4': variant === 'web' }">
|
||||||
|
<div v-if="sortedOrganizations.length > 0" :class="sidebarSectionClass">
|
||||||
|
<h2 class="m-0 mb-2 text-lg font-semibold text-contrast">
|
||||||
|
{{ formatMessage(messages.profileOrganizations) }}
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-wrap gap-2">
|
||||||
|
<AutoLink
|
||||||
|
v-for="organization in sortedOrganizations"
|
||||||
|
:key="organization.id"
|
||||||
|
v-tooltip="organization.name"
|
||||||
|
:to="organizationLink(organization.slug)"
|
||||||
|
link-class="!inline-flex"
|
||||||
|
>
|
||||||
|
<Avatar
|
||||||
|
:src="organization.icon_url"
|
||||||
|
:alt="`Icon for ${organization.name}`"
|
||||||
|
size="3rem"
|
||||||
|
/>
|
||||||
|
</AutoLink>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<UserBadges
|
||||||
|
:downloads="sumDownloads"
|
||||||
|
:join-date="new Date(user.created)"
|
||||||
|
:role="user.role"
|
||||||
|
:badges="user.badges"
|
||||||
|
:has-midas="hasMidas"
|
||||||
|
:has-pride="hasPride26Badge(user)"
|
||||||
|
:earliest-project-by-type="earliestProjectByType"
|
||||||
|
:class="sidebarSectionClass"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<slot name="sidebar" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</NormalPage>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div v-else class="flex min-h-[24rem] items-center justify-center p-6">
|
||||||
|
<EmptyState
|
||||||
|
type="error"
|
||||||
|
:heading="formatMessage(messages.userNotFoundError)"
|
||||||
|
:description="formatMessage(messages.userLoadErrorDescription)"
|
||||||
|
>
|
||||||
|
<template #actions>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button type="button" @click="retryQueries">
|
||||||
|
{{ formatMessage(commonMessages.retryButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
</EmptyState>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
|
import {
|
||||||
|
BoxIcon,
|
||||||
|
CheckIcon,
|
||||||
|
GlobeIcon,
|
||||||
|
LibraryIcon,
|
||||||
|
LinkIcon,
|
||||||
|
LockIcon,
|
||||||
|
SaveIcon,
|
||||||
|
SpinnerIcon,
|
||||||
|
XIcon,
|
||||||
|
} from '@modrinth/assets'
|
||||||
|
import { UserBadge } from '@modrinth/utils'
|
||||||
|
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||||
|
import { computed, ref, watch } from 'vue'
|
||||||
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
|
|
||||||
|
import AutoLink from '#ui/components/base/AutoLink.vue'
|
||||||
|
import Avatar from '#ui/components/base/Avatar.vue'
|
||||||
|
import ButtonStyled from '#ui/components/base/ButtonStyled.vue'
|
||||||
|
import Combobox from '#ui/components/base/Combobox.vue'
|
||||||
|
import EmptyState from '#ui/components/base/EmptyState.vue'
|
||||||
|
import IntlFormatted from '#ui/components/base/IntlFormatted.vue'
|
||||||
|
import NavTabs from '#ui/components/base/NavTabs.vue'
|
||||||
|
import SmartClickable from '#ui/components/base/SmartClickable.vue'
|
||||||
|
import NewModal from '#ui/components/modal/NewModal.vue'
|
||||||
|
import NormalPage from '#ui/components/page/NormalPage.vue'
|
||||||
|
import ProjectCard from '#ui/components/project/card/ProjectCard.vue'
|
||||||
|
import ProjectCardList from '#ui/components/project/ProjectCardList.vue'
|
||||||
|
import UserBadges from '#ui/components/user/UserBadges.vue'
|
||||||
|
import UserPageHeader from '#ui/components/user/UserPageHeader.vue'
|
||||||
|
import { defineMessages, useVIntl } from '#ui/composables'
|
||||||
|
import { injectAuth, injectNotificationManager, injectPageContext, injectTags } from '#ui/providers'
|
||||||
|
import { commonMessages, getProjectTypeTitleMessage } from '#ui/utils'
|
||||||
|
|
||||||
|
import { injectUserProfile } from './providers'
|
||||||
|
import {
|
||||||
|
hasActivePride26Midas,
|
||||||
|
hasPride26Badge,
|
||||||
|
projectUserSorting,
|
||||||
|
resolveProjectType,
|
||||||
|
} from './utils'
|
||||||
|
|
||||||
|
type DisplayMode = 'list' | 'grid' | 'gallery'
|
||||||
|
type ModalRef = {
|
||||||
|
show: () => void
|
||||||
|
hide: () => void
|
||||||
|
}
|
||||||
|
type ResolvedProject = Labrinth.Projects.v2.Project & {
|
||||||
|
resolvedProjectType: string
|
||||||
|
}
|
||||||
|
type EarlyAdopterProjectType =
|
||||||
|
| 'modpack'
|
||||||
|
| 'resourcepack'
|
||||||
|
| 'plugin'
|
||||||
|
| 'datapack'
|
||||||
|
| 'shader'
|
||||||
|
| 'server'
|
||||||
|
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
userId: string
|
||||||
|
projectType?: string
|
||||||
|
displayMode?: DisplayMode
|
||||||
|
sidebarPosition?: 'left' | 'right'
|
||||||
|
variant?: 'web' | 'app'
|
||||||
|
siteUrl?: string
|
||||||
|
externalNavigation?: boolean
|
||||||
|
projectLinkMode?: 'website' | 'app'
|
||||||
|
onCreateProject?: (event?: MouseEvent) => void
|
||||||
|
onCreateCollection?: (event?: MouseEvent) => void
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
projectType: undefined,
|
||||||
|
displayMode: 'list',
|
||||||
|
sidebarPosition: 'right',
|
||||||
|
variant: 'web',
|
||||||
|
siteUrl: 'https://modrinth.com',
|
||||||
|
externalNavigation: false,
|
||||||
|
projectLinkMode: 'website',
|
||||||
|
onCreateProject: undefined,
|
||||||
|
onCreateCollection: undefined,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
const userProfile = injectUserProfile()
|
||||||
|
const auth = injectAuth()
|
||||||
|
const tags = injectTags(null)
|
||||||
|
const pageContext = injectPageContext()
|
||||||
|
const notificationManager = injectNotificationManager()
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
const route = useRoute()
|
||||||
|
const router = useRouter()
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const sidebarSectionClass = computed(() =>
|
||||||
|
props.variant === 'app'
|
||||||
|
? 'border-0 border-b-[1px] border-solid border-[--brand-gradient-border] p-4'
|
||||||
|
: 'rounded-2xl border border-solid border-surface-4 bg-surface-3 p-4',
|
||||||
|
)
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
collectionProjectsCount: {
|
||||||
|
id: 'profile.collection.projects-count',
|
||||||
|
defaultMessage: '{count, plural, one {# project} other {# projects}}',
|
||||||
|
},
|
||||||
|
savingLabel: {
|
||||||
|
id: 'profile.label.saving',
|
||||||
|
defaultMessage: 'Saving...',
|
||||||
|
},
|
||||||
|
editRoleButton: {
|
||||||
|
id: 'profile.button.edit-role',
|
||||||
|
defaultMessage: 'Edit role',
|
||||||
|
},
|
||||||
|
selectRolePlaceholder: {
|
||||||
|
id: 'profile.role.select-placeholder',
|
||||||
|
defaultMessage: 'Select a role',
|
||||||
|
},
|
||||||
|
userDetailsTitle: {
|
||||||
|
id: 'profile.details.title',
|
||||||
|
defaultMessage: 'User details',
|
||||||
|
},
|
||||||
|
emailVerifiedLabel: {
|
||||||
|
id: 'profile.details.label.email-verified',
|
||||||
|
defaultMessage: 'Email verified',
|
||||||
|
},
|
||||||
|
emailVerifiedTooltip: {
|
||||||
|
id: 'profile.details.tooltip.email-verified',
|
||||||
|
defaultMessage: 'Email verified',
|
||||||
|
},
|
||||||
|
emailNotVerifiedTooltip: {
|
||||||
|
id: 'profile.details.tooltip.email-not-verified',
|
||||||
|
defaultMessage: 'Email not verified',
|
||||||
|
},
|
||||||
|
authProvidersLabel: {
|
||||||
|
id: 'profile.details.label.auth-providers',
|
||||||
|
defaultMessage: 'Auth providers',
|
||||||
|
},
|
||||||
|
paymentMethodsLabel: {
|
||||||
|
id: 'profile.details.label.payment-methods',
|
||||||
|
defaultMessage: 'Payment methods',
|
||||||
|
},
|
||||||
|
hasPasswordLabel: {
|
||||||
|
id: 'profile.details.label.has-password',
|
||||||
|
defaultMessage: 'Has password',
|
||||||
|
},
|
||||||
|
hasTotpLabel: {
|
||||||
|
id: 'profile.details.label.has-totp',
|
||||||
|
defaultMessage: 'Has TOTP',
|
||||||
|
},
|
||||||
|
bioFallbackUser: {
|
||||||
|
id: 'profile.bio.fallback.user',
|
||||||
|
defaultMessage: 'A Modrinth user.',
|
||||||
|
},
|
||||||
|
bioFallbackCreator: {
|
||||||
|
id: 'profile.bio.fallback.creator',
|
||||||
|
defaultMessage: 'A Modrinth creator.',
|
||||||
|
},
|
||||||
|
collectionLabel: {
|
||||||
|
id: 'profile.label.collection',
|
||||||
|
defaultMessage: 'Collection',
|
||||||
|
},
|
||||||
|
collectionsLabel: {
|
||||||
|
id: 'project-type.collection.plural',
|
||||||
|
defaultMessage: 'Collections',
|
||||||
|
},
|
||||||
|
profileOrganizations: {
|
||||||
|
id: 'profile.label.organizations',
|
||||||
|
defaultMessage: 'Organizations',
|
||||||
|
},
|
||||||
|
profileNoProjectsLabel: {
|
||||||
|
id: 'profile.label.no-projects',
|
||||||
|
defaultMessage: 'This user has no projects!',
|
||||||
|
},
|
||||||
|
profileNoProjectsAuthDescription: {
|
||||||
|
id: 'profile.label.no-projects-auth-description',
|
||||||
|
defaultMessage: "You don't have any projects yet.",
|
||||||
|
},
|
||||||
|
createProjectButton: {
|
||||||
|
id: 'profile.button.create-project',
|
||||||
|
defaultMessage: 'Create a project',
|
||||||
|
},
|
||||||
|
profileNoCollectionsLabel: {
|
||||||
|
id: 'profile.label.no-collections',
|
||||||
|
defaultMessage: 'This user has no collections!',
|
||||||
|
},
|
||||||
|
profileNoCollectionsAuthDescription: {
|
||||||
|
id: 'profile.label.no-collections-auth-description',
|
||||||
|
defaultMessage: "You don't have any collections yet.",
|
||||||
|
},
|
||||||
|
createCollectionButton: {
|
||||||
|
id: 'profile.button.create-collection',
|
||||||
|
defaultMessage: 'Create a collection',
|
||||||
|
},
|
||||||
|
userNotFoundError: {
|
||||||
|
id: 'profile.error.not-found',
|
||||||
|
defaultMessage: 'User not found',
|
||||||
|
},
|
||||||
|
userLoadErrorDescription: {
|
||||||
|
id: 'profile.error.load-description',
|
||||||
|
defaultMessage: 'The user profile could not be loaded.',
|
||||||
|
},
|
||||||
|
officialAccountBio: {
|
||||||
|
id: 'profile.official-account.bio',
|
||||||
|
defaultMessage:
|
||||||
|
'The official user account of Modrinth. Get support at <support-link></support-link> or via email at <email></email>',
|
||||||
|
},
|
||||||
|
roleUpdateErrorTitle: {
|
||||||
|
id: 'profile.role.update-error-title',
|
||||||
|
defaultMessage: 'Failed to update role',
|
||||||
|
},
|
||||||
|
roleUpdateErrorDescription: {
|
||||||
|
id: 'profile.role.update-error-description',
|
||||||
|
defaultMessage: 'An error occurred while updating the user role. Please try again.',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const userQuery = useQuery({
|
||||||
|
queryKey: computed(() => ['user', props.userId]),
|
||||||
|
queryFn: () => userProfile.getUser(props.userId),
|
||||||
|
enabled: computed(() => Boolean(props.userId)),
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
const projectsQuery = useQuery({
|
||||||
|
queryKey: computed(() => ['user', props.userId, 'projects']),
|
||||||
|
queryFn: () => userProfile.getProjects(props.userId),
|
||||||
|
enabled: computed(() => Boolean(props.userId)),
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
const organizationsQuery = useQuery({
|
||||||
|
queryKey: computed(() => ['user', props.userId, 'organizations']),
|
||||||
|
queryFn: () => userProfile.getOrganizations(props.userId),
|
||||||
|
enabled: computed(() => Boolean(props.userId)),
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
const collectionsQuery = useQuery({
|
||||||
|
queryKey: computed(() => ['user', props.userId, 'collections']),
|
||||||
|
queryFn: () => userProfile.getCollections(props.userId),
|
||||||
|
enabled: computed(() => Boolean(props.userId)),
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
|
||||||
|
const user = computed(() => userQuery.data.value)
|
||||||
|
const projects = computed<ResolvedProject[]>(() =>
|
||||||
|
(projectsQuery.data.value ?? []).map((project) => ({
|
||||||
|
...project,
|
||||||
|
resolvedProjectType: resolveProjectType(project, tags?.loaders.value ?? []),
|
||||||
|
})),
|
||||||
|
)
|
||||||
|
const organizations = computed(() => organizationsQuery.data.value ?? [])
|
||||||
|
const collections = computed(() => collectionsQuery.data.value ?? [])
|
||||||
|
|
||||||
|
const selectedProjectType = computed(() => {
|
||||||
|
const projectType = props.projectType
|
||||||
|
if (!projectType) return null
|
||||||
|
if (projectType === 'collections' || projectType === 'collection') return 'collection'
|
||||||
|
return projectType.endsWith('s') ? projectType.slice(0, -1) : projectType
|
||||||
|
})
|
||||||
|
|
||||||
|
const filteredProjects = computed(() => {
|
||||||
|
const selected = selectedProjectType.value
|
||||||
|
return projects.value
|
||||||
|
.filter((project) => !selected || project.resolvedProjectType === selected)
|
||||||
|
.slice()
|
||||||
|
.sort(projectUserSorting)
|
||||||
|
})
|
||||||
|
|
||||||
|
const sortedOrganizations = computed(() =>
|
||||||
|
organizations.value.slice().sort((first, second) => first.name.localeCompare(second.name)),
|
||||||
|
)
|
||||||
|
const sortedCollections = computed(() =>
|
||||||
|
collections.value.slice().sort((first, second) => {
|
||||||
|
const updatedDifference = new Date(second.updated).getTime() - new Date(first.updated).getTime()
|
||||||
|
if (updatedDifference !== 0) return updatedDifference
|
||||||
|
return new Date(second.created).getTime() - new Date(first.created).getTime()
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
const projectTypes = computed(() => {
|
||||||
|
const types = new Set(projects.value.map((project) => project.resolvedProjectType))
|
||||||
|
if (collections.value.length > 0) types.add('collection')
|
||||||
|
types.delete('project')
|
||||||
|
return [...types]
|
||||||
|
})
|
||||||
|
|
||||||
|
const navLinks = computed(() => {
|
||||||
|
if (!user.value) return []
|
||||||
|
const profilePath = `/user/${encodeURIComponent(props.userId)}`
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: formatMessage(commonMessages.allProjectType),
|
||||||
|
href: profilePath,
|
||||||
|
},
|
||||||
|
...projectTypes.value
|
||||||
|
.map((projectType) => ({
|
||||||
|
label:
|
||||||
|
projectType === 'collection'
|
||||||
|
? formatMessage(messages.collectionsLabel)
|
||||||
|
: formatMessage(getProjectTypeTitleMessage(projectType), { count: 2 }),
|
||||||
|
href: `${profilePath}/${projectType}s`,
|
||||||
|
}))
|
||||||
|
.sort((first, second) => first.label.localeCompare(second.label)),
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
const sumDownloads = computed(() =>
|
||||||
|
projects.value.reduce((total, project) => total + project.downloads, 0),
|
||||||
|
)
|
||||||
|
const profileHeaderSummary = computed(() => {
|
||||||
|
if (!user.value) return ''
|
||||||
|
if (user.value.bio) return user.value.bio
|
||||||
|
return projects.value.length === 0
|
||||||
|
? formatMessage(messages.bioFallbackUser)
|
||||||
|
: formatMessage(messages.bioFallbackCreator)
|
||||||
|
})
|
||||||
|
const earliestProjectByType = computed(() => {
|
||||||
|
const earliest = {} as Record<EarlyAdopterProjectType, Date>
|
||||||
|
for (const project of projects.value) {
|
||||||
|
const projectType = project.resolvedProjectType as EarlyAdopterProjectType
|
||||||
|
const published = new Date(project.published)
|
||||||
|
if (!earliest[projectType] || published < earliest[projectType]) {
|
||||||
|
earliest[projectType] = published
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return earliest
|
||||||
|
})
|
||||||
|
|
||||||
|
const isModrinthUser = computed(() => user.value?.id === '2REoufqX')
|
||||||
|
const isOfficialAccount = computed(() => isModrinthUser.value || user.value?.id === 'GVFjtWTf')
|
||||||
|
const isSelf = computed(() => auth.user.value?.id === user.value?.id)
|
||||||
|
const isAdminViewing = computed(() => auth.user.value?.role === 'admin')
|
||||||
|
const isStaffViewing = computed(
|
||||||
|
() => auth.user.value?.role === 'admin' || auth.user.value?.role === 'moderator',
|
||||||
|
)
|
||||||
|
const isAffiliate = computed(() => Boolean((user.value?.badges ?? 0) & UserBadge.AFFILIATE))
|
||||||
|
const hasMidas = computed(
|
||||||
|
() => Boolean((user.value?.badges ?? 0) & UserBadge.MIDAS) || hasActivePride26Midas(user.value),
|
||||||
|
)
|
||||||
|
const showProjectsEmptyState = computed(
|
||||||
|
() =>
|
||||||
|
selectedProjectType.value !== 'collection' &&
|
||||||
|
filteredProjects.value.length === 0 &&
|
||||||
|
(selectedProjectType.value !== null || collections.value.length === 0),
|
||||||
|
)
|
||||||
|
const showCollectionsEmptyState = computed(
|
||||||
|
() => selectedProjectType.value === 'collection' && collections.value.length === 0,
|
||||||
|
)
|
||||||
|
|
||||||
|
const normalizedSiteUrl = computed(() => props.siteUrl.replace(/\/$/, ''))
|
||||||
|
const editProfileLink = computed(() => linkTarget('/settings/profile'))
|
||||||
|
|
||||||
|
function externalUrl(path: string): string {
|
||||||
|
return `${normalizedSiteUrl.value}${path.startsWith('/') ? path : `/${path}`}`
|
||||||
|
}
|
||||||
|
|
||||||
|
function linkTarget(path: string): string | (() => void) {
|
||||||
|
if (!props.externalNavigation) return path
|
||||||
|
return () => pageContext.openExternalUrl(externalUrl(path))
|
||||||
|
}
|
||||||
|
|
||||||
|
function openPath(path: string): void {
|
||||||
|
const target = linkTarget(path)
|
||||||
|
if (typeof target === 'function') {
|
||||||
|
target()
|
||||||
|
} else {
|
||||||
|
void router.push(target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function projectLink(project: ResolvedProject): string | (() => void) {
|
||||||
|
if (props.projectLinkMode === 'app') {
|
||||||
|
return `/project/${project.id}`
|
||||||
|
}
|
||||||
|
return `/${project.resolvedProjectType}/${project.slug || project.id}`
|
||||||
|
}
|
||||||
|
|
||||||
|
function organizationLink(slug: string): string | (() => void) {
|
||||||
|
return linkTarget(`/organization/${encodeURIComponent(slug)}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
function collectionLink(id: string): string | (() => void) {
|
||||||
|
return linkTarget(`/collection/${encodeURIComponent(id)}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function copyId(): Promise<void> {
|
||||||
|
if (user.value) await navigator.clipboard.writeText(user.value.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function copyPermalink(): Promise<void> {
|
||||||
|
if (user.value) {
|
||||||
|
await navigator.clipboard.writeText(externalUrl(`/user/${user.value.id}`))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function reportProfile(): void {
|
||||||
|
if (!user.value) return
|
||||||
|
const reportPath = `/report?item=user&itemID=${encodeURIComponent(user.value.id)}`
|
||||||
|
if (props.externalNavigation) {
|
||||||
|
pageContext.openExternalUrl(externalUrl(reportPath))
|
||||||
|
} else if (auth.user.value) {
|
||||||
|
void router.push(reportPath)
|
||||||
|
} else {
|
||||||
|
void auth.requestSignIn(route.fullPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createProject(event?: MouseEvent): void {
|
||||||
|
if (props.onCreateProject) {
|
||||||
|
props.onCreateProject(event)
|
||||||
|
} else {
|
||||||
|
openPath('/dashboard/projects')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCollection(event?: MouseEvent): void {
|
||||||
|
if (props.onCreateCollection) {
|
||||||
|
props.onCreateCollection(event)
|
||||||
|
} else {
|
||||||
|
openPath('/dashboard/collections')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function retryQueries(): Promise<void> {
|
||||||
|
await Promise.allSettled([
|
||||||
|
userQuery.refetch(),
|
||||||
|
projectsQuery.refetch(),
|
||||||
|
organizationsQuery.refetch(),
|
||||||
|
collectionsQuery.refetch(),
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
const userDetailsModal = ref<ModalRef | null>(null)
|
||||||
|
const editRoleModal = ref<ModalRef | null>(null)
|
||||||
|
const selectedRole = ref<Labrinth.Users.v3.Role | null>(null)
|
||||||
|
const isSavingRole = ref(false)
|
||||||
|
const roleOptions = [
|
||||||
|
{ value: 'developer', label: 'Developer' },
|
||||||
|
{ value: 'moderator', label: 'Moderator' },
|
||||||
|
{ value: 'admin', label: 'Admin' },
|
||||||
|
] satisfies { value: Labrinth.Users.v3.Role; label: string }[]
|
||||||
|
|
||||||
|
watch(
|
||||||
|
user,
|
||||||
|
(currentUser) => {
|
||||||
|
selectedRole.value = currentUser?.role ?? null
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
||||||
|
|
||||||
|
function openUserDetails(): void {
|
||||||
|
userDetailsModal.value?.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
function openRoleEditModal(): void {
|
||||||
|
selectedRole.value = user.value?.role ?? null
|
||||||
|
editRoleModal.value?.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancelRoleEdit(): void {
|
||||||
|
selectedRole.value = user.value?.role ?? null
|
||||||
|
editRoleModal.value?.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function toggleAffiliate(): Promise<void> {
|
||||||
|
if (!user.value) return
|
||||||
|
await userProfile.patchUser(user.value.id, {
|
||||||
|
badges: user.value.badges ^ UserBadge.AFFILIATE,
|
||||||
|
})
|
||||||
|
await queryClient.invalidateQueries({ queryKey: ['user', props.userId] })
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveRoleEdit(): Promise<void> {
|
||||||
|
if (!user.value || !selectedRole.value || selectedRole.value === user.value.role) return
|
||||||
|
|
||||||
|
isSavingRole.value = true
|
||||||
|
try {
|
||||||
|
await userProfile.patchUser(user.value.id, { role: selectedRole.value })
|
||||||
|
await queryClient.invalidateQueries({ queryKey: ['user', props.userId] })
|
||||||
|
editRoleModal.value?.hide()
|
||||||
|
} catch {
|
||||||
|
notificationManager.addNotification({
|
||||||
|
type: 'error',
|
||||||
|
title: formatMessage(messages.roleUpdateErrorTitle),
|
||||||
|
text: formatMessage(messages.roleUpdateErrorDescription),
|
||||||
|
})
|
||||||
|
} finally {
|
||||||
|
isSavingRole.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from './user-profile'
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
|
|
||||||
|
import { createContext } from '#ui/providers/create-context'
|
||||||
|
|
||||||
|
export interface UserProfileContext {
|
||||||
|
getUser: (userId: string) => Promise<Labrinth.Users.v3.User>
|
||||||
|
getProjects: (userId: string) => Promise<Labrinth.Projects.v2.Project[]>
|
||||||
|
getOrganizations: (userId: string) => Promise<Labrinth.Organizations.v3.Organization[]>
|
||||||
|
getCollections: (userId: string) => Promise<Labrinth.Collections.Collection[]>
|
||||||
|
patchUser: (
|
||||||
|
userId: string,
|
||||||
|
patch: Partial<Pick<Labrinth.Users.v3.User, 'badges' | 'role'>>,
|
||||||
|
) => Promise<void>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const [injectUserProfile, provideUserProfile] = createContext<UserProfileContext>(
|
||||||
|
'UserProfilePageLayout',
|
||||||
|
'userProfileContext',
|
||||||
|
)
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
|
|
||||||
|
type ProjectSorting = 'publish_time' | 'queue_time' | 'downloads'
|
||||||
|
type ProjectStatusPriority = { order: number; sort: ProjectSorting }
|
||||||
|
|
||||||
|
const projectStatusPriority: Record<Labrinth.Projects.v2.ProjectStatus, ProjectStatusPriority> = {
|
||||||
|
approved: { order: 1, sort: 'downloads' },
|
||||||
|
scheduled: { order: 1, sort: 'downloads' },
|
||||||
|
archived: { order: 2, sort: 'downloads' },
|
||||||
|
unlisted: { order: 3, sort: 'downloads' },
|
||||||
|
private: { order: 4, sort: 'downloads' },
|
||||||
|
processing: { order: 5, sort: 'queue_time' },
|
||||||
|
withheld: { order: 6, sort: 'publish_time' },
|
||||||
|
rejected: { order: 7, sort: 'publish_time' },
|
||||||
|
draft: { order: 8, sort: 'publish_time' },
|
||||||
|
unknown: { order: 9, sort: 'publish_time' },
|
||||||
|
}
|
||||||
|
|
||||||
|
function getProjectSortValue(
|
||||||
|
project: Labrinth.Projects.v2.Project,
|
||||||
|
sorting: ProjectSorting,
|
||||||
|
): number {
|
||||||
|
switch (sorting) {
|
||||||
|
case 'publish_time':
|
||||||
|
return new Date(project.published).getTime()
|
||||||
|
case 'queue_time':
|
||||||
|
return new Date(project.queued || project.published).getTime()
|
||||||
|
case 'downloads':
|
||||||
|
return project.downloads
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function projectUserSorting(
|
||||||
|
first: Labrinth.Projects.v2.Project,
|
||||||
|
second: Labrinth.Projects.v2.Project,
|
||||||
|
): number {
|
||||||
|
const firstPriority = projectStatusPriority[first.status] ?? projectStatusPriority.unknown
|
||||||
|
const secondPriority = projectStatusPriority[second.status] ?? projectStatusPriority.unknown
|
||||||
|
|
||||||
|
if (firstPriority.order !== secondPriority.order) {
|
||||||
|
return firstPriority.order - secondPriority.order
|
||||||
|
}
|
||||||
|
if (firstPriority.sort !== secondPriority.sort) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
getProjectSortValue(second, secondPriority.sort) -
|
||||||
|
getProjectSortValue(first, firstPriority.sort)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function resolveProjectType(
|
||||||
|
project: Labrinth.Projects.v2.Project,
|
||||||
|
loaders: Labrinth.Tags.v2.Loader[],
|
||||||
|
): string {
|
||||||
|
if (project.project_type !== 'mod') {
|
||||||
|
return project.project_type
|
||||||
|
}
|
||||||
|
|
||||||
|
const projectLoaders = new Set(project.loaders)
|
||||||
|
const supportsType = (type: string) =>
|
||||||
|
loaders.some(
|
||||||
|
(loader) => projectLoaders.has(loader.name) && loader.supported_project_types.includes(type),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (supportsType('datapack')) return 'datapack'
|
||||||
|
if (supportsType('plugin')) return 'plugin'
|
||||||
|
return 'mod'
|
||||||
|
}
|
||||||
|
|
||||||
|
const PRIDE_26_MIDAS_DURATION_MS = 30 * 24 * 60 * 60 * 1000
|
||||||
|
|
||||||
|
export function hasPride26Badge(user?: Labrinth.Users.v3.User | null): boolean {
|
||||||
|
return user?.campaigns?.pride_26?.has_badge === true
|
||||||
|
}
|
||||||
|
|
||||||
|
export function hasActivePride26Midas(
|
||||||
|
user?: Labrinth.Users.v3.User | null,
|
||||||
|
now = Date.now(),
|
||||||
|
): boolean {
|
||||||
|
const campaign = user?.campaigns?.pride_26
|
||||||
|
if (!campaign?.has_midas) return false
|
||||||
|
|
||||||
|
const donatedAt = Date.parse(campaign.last_donated_at)
|
||||||
|
return Number.isFinite(donatedAt) && donatedAt + PRIDE_26_MIDAS_DURATION_MS > now
|
||||||
|
}
|
||||||
@@ -2849,9 +2849,123 @@
|
|||||||
"payment-method.visa": {
|
"payment-method.visa": {
|
||||||
"defaultMessage": "Visa"
|
"defaultMessage": "Visa"
|
||||||
},
|
},
|
||||||
|
"profile.bio.fallback.creator": {
|
||||||
|
"defaultMessage": "A Modrinth creator."
|
||||||
|
},
|
||||||
|
"profile.bio.fallback.user": {
|
||||||
|
"defaultMessage": "A Modrinth user."
|
||||||
|
},
|
||||||
|
"profile.button.analytics": {
|
||||||
|
"defaultMessage": "View user analytics"
|
||||||
|
},
|
||||||
|
"profile.button.billing": {
|
||||||
|
"defaultMessage": "Manage user billing"
|
||||||
|
},
|
||||||
|
"profile.button.create-collection": {
|
||||||
|
"defaultMessage": "Create a collection"
|
||||||
|
},
|
||||||
|
"profile.button.create-project": {
|
||||||
|
"defaultMessage": "Create a project"
|
||||||
|
},
|
||||||
|
"profile.button.edit-role": {
|
||||||
|
"defaultMessage": "Edit role"
|
||||||
|
},
|
||||||
|
"profile.button.info": {
|
||||||
|
"defaultMessage": "View user details"
|
||||||
|
},
|
||||||
|
"profile.button.manage-projects": {
|
||||||
|
"defaultMessage": "Manage projects"
|
||||||
|
},
|
||||||
|
"profile.button.remove-affiliate": {
|
||||||
|
"defaultMessage": "Remove as affiliate"
|
||||||
|
},
|
||||||
|
"profile.button.set-affiliate": {
|
||||||
|
"defaultMessage": "Set as affiliate"
|
||||||
|
},
|
||||||
|
"profile.collection.projects-count": {
|
||||||
|
"defaultMessage": "{count, plural, one {# project} other {# projects}}"
|
||||||
|
},
|
||||||
|
"profile.details.label.auth-providers": {
|
||||||
|
"defaultMessage": "Auth providers"
|
||||||
|
},
|
||||||
|
"profile.details.label.email-verified": {
|
||||||
|
"defaultMessage": "Email verified"
|
||||||
|
},
|
||||||
|
"profile.details.label.has-password": {
|
||||||
|
"defaultMessage": "Has password"
|
||||||
|
},
|
||||||
|
"profile.details.label.has-totp": {
|
||||||
|
"defaultMessage": "Has TOTP"
|
||||||
|
},
|
||||||
|
"profile.details.label.payment-methods": {
|
||||||
|
"defaultMessage": "Payment methods"
|
||||||
|
},
|
||||||
|
"profile.details.title": {
|
||||||
|
"defaultMessage": "User details"
|
||||||
|
},
|
||||||
|
"profile.details.tooltip.email-not-verified": {
|
||||||
|
"defaultMessage": "Email not verified"
|
||||||
|
},
|
||||||
|
"profile.details.tooltip.email-verified": {
|
||||||
|
"defaultMessage": "Email verified"
|
||||||
|
},
|
||||||
|
"profile.error.load-description": {
|
||||||
|
"defaultMessage": "The user profile could not be loaded."
|
||||||
|
},
|
||||||
|
"profile.error.not-found": {
|
||||||
|
"defaultMessage": "User not found"
|
||||||
|
},
|
||||||
|
"profile.label.affiliate": {
|
||||||
|
"defaultMessage": "Affiliate"
|
||||||
|
},
|
||||||
"profile.label.badges": {
|
"profile.label.badges": {
|
||||||
"defaultMessage": "Badges"
|
"defaultMessage": "Badges"
|
||||||
},
|
},
|
||||||
|
"profile.label.collection": {
|
||||||
|
"defaultMessage": "Collection"
|
||||||
|
},
|
||||||
|
"profile.label.download-count": {
|
||||||
|
"defaultMessage": "{count, plural, one {download} other {downloads}}"
|
||||||
|
},
|
||||||
|
"profile.label.joined": {
|
||||||
|
"defaultMessage": "Joined"
|
||||||
|
},
|
||||||
|
"profile.label.no-collections": {
|
||||||
|
"defaultMessage": "This user has no collections!"
|
||||||
|
},
|
||||||
|
"profile.label.no-collections-auth-description": {
|
||||||
|
"defaultMessage": "You don't have any collections yet."
|
||||||
|
},
|
||||||
|
"profile.label.no-projects": {
|
||||||
|
"defaultMessage": "This user has no projects!"
|
||||||
|
},
|
||||||
|
"profile.label.no-projects-auth-description": {
|
||||||
|
"defaultMessage": "You don't have any projects yet."
|
||||||
|
},
|
||||||
|
"profile.label.organizations": {
|
||||||
|
"defaultMessage": "Organizations"
|
||||||
|
},
|
||||||
|
"profile.label.project-count": {
|
||||||
|
"defaultMessage": "{count, plural, one {project} other {projects}}"
|
||||||
|
},
|
||||||
|
"profile.label.saving": {
|
||||||
|
"defaultMessage": "Saving..."
|
||||||
|
},
|
||||||
|
"profile.official-account": {
|
||||||
|
"defaultMessage": "Official Modrinth account"
|
||||||
|
},
|
||||||
|
"profile.official-account.bio": {
|
||||||
|
"defaultMessage": "The official user account of Modrinth. Get support at <support-link></support-link> or via email at <email></email>"
|
||||||
|
},
|
||||||
|
"profile.role.select-placeholder": {
|
||||||
|
"defaultMessage": "Select a role"
|
||||||
|
},
|
||||||
|
"profile.role.update-error-description": {
|
||||||
|
"defaultMessage": "An error occurred while updating the user role. Please try again."
|
||||||
|
},
|
||||||
|
"profile.role.update-error-title": {
|
||||||
|
"defaultMessage": "Failed to update role"
|
||||||
|
},
|
||||||
"project-card.date.published.tooltip": {
|
"project-card.date.published.tooltip": {
|
||||||
"defaultMessage": "Published {date}"
|
"defaultMessage": "Published {date}"
|
||||||
},
|
},
|
||||||
@@ -2879,6 +2993,9 @@
|
|||||||
"project-type.all": {
|
"project-type.all": {
|
||||||
"defaultMessage": "All"
|
"defaultMessage": "All"
|
||||||
},
|
},
|
||||||
|
"project-type.collection.plural": {
|
||||||
|
"defaultMessage": "Collections"
|
||||||
|
},
|
||||||
"project-type.datapack.capital": {
|
"project-type.datapack.capital": {
|
||||||
"defaultMessage": "{count, plural, one {Data Pack} other {Data Packs}}"
|
"defaultMessage": "{count, plural, one {Data Pack} other {Data Packs}}"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user