Compare commits

...
Author SHA1 Message Date
aecsocketandGitHub d3d37ab268 Merge branch 'main' into boris/dev-1105 2026-05-26 22:51:34 +01:00
ThatGravyBoatandGitHub f96520638b feat: Add user-images.githubusercontent.com in allowedHostnames (#6210)
feat: Allow user-images.githubusercontent.com in descriptions
2026-05-26 14:52:35 +00:00
aecsocket eadaf5504d Also run Daedalus manifest uploads when there's a new game version 2026-05-26 12:33:12 +01:00
Prospector 9e5d29ced6 hotfix 2026-05-24 12:14:13 -07:00
Prospector 3e15d0b287 changelog 2026-05-24 10:46:35 -07:00
ProspectorandGitHub bcce7e28fd fix: guard against non-strings when decorating download urls (#6194) 2026-05-24 10:42:27 -07:00
ProspectorandGitHub 3889d0f5ec fix: simplify preview banner translation key (#6192) 2026-05-24 10:39:39 -07:00
ProspectorandGitHub 6f44c5b039 feat: add 2 second auto close on skipped notifications (#6191) 2026-05-24 10:39:27 -07:00
Modrinth BotandGitHub ea967845d9 New translations from Crowdin (main) (#6193) 2026-05-24 17:25:25 +00:00
Prospector a6967cf9cb changelog 2026-05-24 09:26:36 -07:00
ProspectorandGitHub 5bf92863b0 fix: spanish locale (#6189) 2026-05-24 09:21:14 -07:00
Prospector 71b6ecc10c fix changelog... 2026-05-23 23:26:34 -07:00
Prospector ed28bc7551 remove april fools redirect 2026-05-23 22:03:59 -07:00
Prospector 3e4197db7c changelog 2026-05-23 22:02:49 -07:00
ProspectorandGitHub e12230ff59 feat: update default memory from 2GB to 4GB (#6172)
* feat: update default memory from 2GB to 4GB

* prepr
2026-05-23 21:26:51 -07:00
ProspectorandGitHub aeb9f5a075 fix: invalid auth cookie causing page not to load (#6186) 2026-05-23 21:26:13 -07:00
Calum H.andGitHub 8b17441f40 feat: compact logs if they have logspam to prevent app crashing (#6181)
* feat: compact logs if they have logspam to prevent app crashing

* fix: lint
2026-05-23 18:22:15 +00:00
f9d47e8edc feat: Add new "Enabled" sorting button next to "Disabled" (#6000)
* feat: Added new "Enabled" sorting button next to "Disabled"

* Updated when filter buttons show

- When all mods are disabled, only "Disabled" shows
- When all mods are enabled, only "Enabled" shows
- When there disabled and enabled mods, then only both buttons show.

* Updated when filter buttons show

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-05-23 16:12:14 +00:00
a58bc3dc21 feat: java installation ui improvements (#5731)
* Clean impl of java installation ui improvements

* Migrate composable to ts

* Migrate to ButtonStyled, fix coloring

* Fix lint

* Fix clearing java path not refreshing state

* fix: use Table component + install btn disabled state tooltip

---------

Signed-off-by: Arthur <creeperkatze.dev@gmail.com>
Signed-off-by: Arthur <contact@creeperkatze.dev>
Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
Co-authored-by: Calum H. <calum@modrinth.com>
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-05-23 14:46:12 +00:00
ProspectorandGitHub 1e46444fb0 fix: checklist forcing redirects (#6173) 2026-05-22 15:53:22 -07:00
ProspectorandGitHub 1511e55597 fix: skip reviewed projects in queue (#6171) 2026-05-22 14:54:50 -07:00
aecsocketandGitHub 5727e156ed Fetch project analytics events on analytics get (#6143)
* Fetch project analytics events

* fix

* post-query ua bucketing

* fmt
2026-05-22 18:32:33 +00:00
Calum H.andGitHub 657186398d fix: remove broken roadmap reference (#6165)
Signed-off-by: Calum H. <calum@modrinth.com>
2026-05-22 18:10:01 +00:00
Michael H. 3ab2273782 chore: prepr 2026-05-22 19:58:11 +02:00
ProspectorandGitHub 893ec00fc6 feat: add external dep sorting to moderation queue (#6161)
* feat: add external dep sorting to moderation queue

* prepr
2026-05-21 16:40:13 -07:00
Prospector aa7dd1d210 web 2026-05-21 16:23:30 -07:00
Calum H.andGitHub f8733b0488 feat: changelog 21st may 2026 (#6158)
* feat: changelog 21st may 2026

* fix: changelog
2026-05-21 22:27:14 +00:00
Calum H.andGitHub d077d44540 fix: content tab uniqueness regression (#6156)
* fix: content tab uniqueness regression

Closes: #6154

* fix: further regressions

* fix: lint

* fix: lint
2026-05-21 22:03:35 +00:00
aecsocketandGitHub 4e1a61d8b6 Adjust window occlusion threshold (#6157) 2026-05-21 21:48:39 +00:00
aecsocketandGitHub 71dee4de40 Add modpacks with external files filter to moderation queue (#6155)
* simplify query

* make it a tristate

* external deps count
2026-05-21 20:21:54 +00:00
SychicandGitHub f74fad0cae fix: typo in version changelog (#6153) 2026-05-21 19:38:11 +00:00
Truman GaoandGitHub 07e81ac036 fix: project embeds (#6152)
* fix: project embeds

* remove: params.id
2026-05-21 17:02:53 +00:00
Calum H.andGitHub 6e7835fb35 feat: implement kryos upload sessions (#6145)
* feat: implement upload sessions

* fix: files not scoped

* feat: hide staging files folder and proper cancel feedback

* fix: lint
2026-05-21 16:49:48 +00:00
Calum H.andGitHub 2f95c4c441 feat: changelog 20th may 2026 (#6148) 2026-05-20 12:51:36 -07:00
aecsocketandGitHub 451b2d0e44 Window occlusion checks on MacOS (#6135)
* wip: window occlusion checks on MacOS

* wip: occlusion works

* occlusion notification

* fix ci

* fix

* wire in hiding into macos occlusion

* remove debug logs

* fix

* clean up
2026-05-20 19:31:12 +00:00
Truman GaoandGitHub 215643c846 fix: server project type page title (#6147)
* fix: server project type page title

* pnpm prepr
2026-05-20 19:01:19 +00:00
Truman GaoandGitHub d8b1415f9c feat: swap date input to use date picker (#6146)
* feat: swap date input to use date picker

* feat: update date picker to analytics branch changes

* feat: polish date picker usage
2026-05-20 17:50:46 +00:00
Calum H.andGitHub 3eeb549d20 fix: intercom bubble positioning properly (#6111)
* feat: fix intercom properly

* fix: positioning size + css transition

* fix: lint

* fix: ts

* fix: nitpick
2026-05-20 17:15:46 +00:00
Calum H.andGitHub c3fe7b4232 feat: content management changes (#6104)
* feat: change modpack updating flow

* fix: pending install state loss

* fix: mods.vue perf problems

* chore: todo doc

* draft: try preload/fix suspense

* fix: lint
2026-05-20 17:07:35 +00:00
Prospector 079a10bba9 changelog 2026-05-20 09:01:26 -07:00
Prospector 3c3d5702ba fix: permissions page being displayed 2026-05-20 08:59:50 -07:00
Prospector a34576a2c3 changelog 2026-05-19 12:51:59 -07:00
ProspectorandGitHub d8e4915a31 fix: 404 error when changing project slug (#6139) 2026-05-19 19:21:23 +00:00
Prospector ed723fa186 changelog 2026-05-19 11:50:49 -07:00
ProspectorandGitHub d6c8d4475b feat: new north american region info (#6091) 2026-05-19 11:49:41 -07:00
ProspectorandGitHub 302b60d89c fix: random 404s (#6138)
* fix: random 404s when navigating from user, org, or collection page to project

* more

* revert server

* clean names

* prepr
2026-05-19 18:11:48 +00:00
aecsocketandGitHub f106dc580f Restrict what tokens can be used for auth init flows (#6137) 2026-05-19 15:45:58 +00:00
aecsocketandGitHub 244c263e40 Implement analytics marker events (#6090)
* Analytics events

* prepare

* change route prefix

* update route return

* Add mod launcher analytics

* more UA strings

* fix ci

* caching on analytics events

* Return parent modpack versions for playtime queries

* sqlx prepare

* fmt

* dummy fixtures
2026-05-19 13:06:04 +00:00
48bb44155d New translations from Crowdin (main) (#6127)
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-05-18 14:53:39 +00:00
Calum H.andGitHub 3f2e76ae7e fix: table i18n bug (#6129) 2026-05-18 14:53:25 +00:00
6479eca0e9 fix: pix withdrawals (#6128)
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-05-18 14:51:55 +00:00
Calum H.andGitHub 8767bc9184 fix: changelog lint (#6130)
fix: changelog
2026-05-18 14:46:31 +00:00
aecsocketandGitHub d1185414b6 Fix changelog (#6125)
fix changelog
2026-05-17 23:21:10 +02:00
aecsocketandGitHub 510439acbf Changelog (#6124)
changelog
2026-05-17 22:50:23 +02:00
aecsocketandGitHub c564495e11 Ad webview occlusion handling (#6116)
* wip: ad webview occlusion

* Ad webview window occlusion testing

* revert refresh test
2026-05-17 20:27:04 +00:00
simonLeary42andGitHub 8dd1490c8a disable Stable loader version type if there are no stable loader versions available (#6114)
* disable Stable loader version if there are no stable loader versions

* deselect stable if stable is disabled
2026-05-16 17:07:00 +00:00
François-Xavier TalbotandGitHub b72bc18a6b Add moderator notes to users & organizations (#6094)
* Moderator notes

* Use macros

* Improve queries

* Query cache

* Accept missing If-Match if no existing note

* Undo v2 compat changes

* Fix tests

* Remove CONSTRAINT CHECK on moderation_notes

* Respect 1-indexing on moderation_notes.version default in DB migration

* Remove double Option

* .body("") -> .finish()

* .remove() -> .get().clone()

* cloned

* Review comments

* moderation_notes everywhere
2026-05-16 16:30:36 +00:00
aecsocketandGitHub cee942dcef Fix file version updates not considering visibility (#6105) 2026-05-16 16:18:18 +00:00
02a7774722 fix: add download attribute to fix JAR files saving as ZIP in Chromium (#6065)
* fix: add download attribute to fix JAR files saving as ZIP in Chromium

- JAR files were downloading with a `.zip` extension in Chromium-based browsers (Chrome, Edge, Arc, Brave, Opera, Vivaldi)
- Root cause: JAR files are ZIP archives internally, so Chromium sniffs the `Content-Type` as `application/zip` and overrides the filename extension when no `download` attribute is present
- Fix: add `download="<filename>"` to all file download `<a>` tags so the browser uses the original filename from the API

* fix: add download attribute to remaining download links

Missed in initial pass: changelog page button, versions overflow
menu, settings/versions overflow menu. Also adds `download` prop
to Button and OverflowMenu to support dropdown link items.

Adds missing `getPrimaryFile` definition in changelog.vue.

---------

Co-authored-by: Mr_chank <180248271+chank-op@users.noreply.github.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-05-15 14:58:26 +00:00
285 changed files with 16298 additions and 2443 deletions
@@ -9,8 +9,6 @@ body:
options:
- label: I checked the [existing issues](https://github.com/modrinth/code/issues?q=is%3Aissue) for duplicate feature requests
required: true
- label: I have checked that this feature request is not on our [roadmap](https://roadmap.modrinth.com)
required: true
- type: dropdown
id: projects
attributes:
Generated
+4
View File
@@ -10565,6 +10565,8 @@ version = "1.0.0-local"
dependencies = [
"async_zip",
"chrono",
"core-foundation 0.10.1",
"core-graphics",
"daedalus",
"dashmap",
"either",
@@ -10572,6 +10574,7 @@ dependencies = [
"hyper 1.7.0",
"hyper-util",
"native-dialog",
"objc2-app-kit",
"paste",
"path-util",
"serde",
@@ -10597,6 +10600,7 @@ dependencies = [
"urlencoding",
"uuid 1.18.1",
"webview2-com",
"windows",
"windows-core 0.61.2",
]
+3
View File
@@ -64,6 +64,8 @@ clickhouse = "0.14.0"
color-eyre = "0.6.5"
color-thief = "0.2.2"
const_format = "0.2.34"
core-foundation = "0.10.1"
core-graphics = "0.24.0"
daedalus = { path = "packages/daedalus" }
darling = { version = "0.23" }
dashmap = "6.1.0"
@@ -123,6 +125,7 @@ murmur2 = "0.1.0"
native-dialog = "0.9.2"
notify = { version = "8.2.0", default-features = false }
notify-debouncer-mini = { version = "0.7.0", default-features = false }
objc2-app-kit = { version = "0.3.2", default-features = false }
p256 = "0.13.2"
parking_lot = "0.12.5"
paste = "1.0.15"
-1
View File
@@ -13,7 +13,6 @@
"test": "vue-tsc --noEmit"
},
"dependencies": {
"@intercom/messenger-js-sdk": "^0.0.14",
"@modrinth/api-client": "workspace:^",
"@modrinth/assets": "workspace:*",
"@modrinth/ui": "workspace:*",
+41 -93
View File
@@ -1,5 +1,4 @@
<script setup>
import { Intercom, shutdown as shutdownIntercom } from '@intercom/messenger-js-sdk'
import {
AuthFeature,
ModrinthApiError,
@@ -53,6 +52,7 @@ import {
providePopupNotificationManager,
useDebugLogger,
useFormatBytes,
useHostingIntercom,
useVIntl,
} from '@modrinth/ui'
import { renderString } from '@modrinth/utils'
@@ -88,7 +88,6 @@ import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
import SplashScreen from '@/components/ui/SplashScreen.vue'
import WindowControls from '@/components/ui/WindowControls.vue'
import { useIntercomPositioning } from '@/composables/intercom-positioning'
import { useCheckDisableMouseover } from '@/composables/macCssFix.js'
import { config } from '@/config'
import { hide_ads_window, init_ads_window, show_ads_window } from '@/helpers/ads.js'
@@ -132,15 +131,36 @@ import { AppPopupNotificationManager } from './providers/app-popup-notifications
const themeStore = useTheming()
const router = useRouter()
const route = useRoute()
const intercomBubblePositioning = useIntercomPositioning({ route, themeStore })
const {
sidebarToggled,
forceSidebar,
sidebarVisible,
intercomBubblePosition,
updateIntercomBubbleStyles,
clearIntercomBubbleStyles,
} = intercomBubblePositioning
const APP_LEFT_NAV_WIDTH = '4rem'
const APP_SIDEBAR_WIDTH = 300
const INTERCOM_BUBBLE_DEFAULT_PADDING = 20
const credentials = ref()
const sidebarToggled = ref(true)
const unsubscribeSidebarToggle = themeStore.$subscribe(() => {
sidebarToggled.value = !themeStore.toggleSidebar
})
const forceSidebar = computed(
() => route.path.startsWith('/browse') || route.path.startsWith('/project'),
)
const sidebarVisible = computed(() => sidebarToggled.value || forceSidebar.value)
const hostingRouteActive = computed(() => route.path.startsWith('/hosting'))
const hostingIntercomIdentityKey = computed(() => {
const rawServerId = route.params.id
const serverId = Array.isArray(rawServerId) ? rawServerId[0] : rawServerId
const userId = credentials.value?.user_id ?? credentials.value?.user?.id ?? 'anonymous'
return `${userId}:${serverId ?? 'hosting'}`
})
const hostingIntercom = useHostingIntercom({
enabled: computed(() => hostingRouteActive.value && !!credentials.value?.session),
appId: 'ykeritl9',
fetchToken: fetchIntercomToken,
identityKey: hostingIntercomIdentityKey,
horizontalPadding: computed(() =>
sidebarVisible.value
? APP_SIDEBAR_WIDTH + INTERCOM_BUBBLE_DEFAULT_PADDING
: INTERCOM_BUBBLE_DEFAULT_PADDING,
),
})
const notificationManager = new AppNotificationManager()
provideNotificationManager(notificationManager)
@@ -175,7 +195,11 @@ provideModrinthClient(tauriApiClient)
providePageContext({
hierarchicalSidebarAvailable: ref(true),
showAds: ref(false),
...intercomBubblePositioning.pageContext,
floatingActionBarOffsets: {
left: ref(APP_LEFT_NAV_WIDTH),
right: computed(() => (sidebarVisible.value ? `${APP_SIDEBAR_WIDTH}px` : '0px')),
},
intercomBubble: hostingIntercom.intercomBubble,
featureFlags: {
serverRamAsBytesAlwaysOn: computed(() =>
themeStore.getFeatureFlag('server_ram_as_bytes_always_on'),
@@ -259,8 +283,7 @@ onMounted(async () => {
onUnmounted(async () => {
document.querySelector('body').removeEventListener('click', handleClick)
document.querySelector('body').removeEventListener('auxclick', handleAuxClick)
shutdownHostingIntercom()
clearIntercomBubbleStyles()
unsubscribeSidebarToggle()
await unlistenUpdateDownload?.()
})
@@ -593,8 +616,6 @@ const incompatibilityWarningModal = ref()
const installToPlayModal = ref()
const updateToPlayModal = ref()
const credentials = ref()
const modrinthLoginFlowWaitModal = ref()
setupAuthProvider(credentials, async (_redirectPath) => {
@@ -664,10 +685,6 @@ const hasPlus = computed(
const showAd = computed(
() => sidebarVisible.value && !hasPlus.value && credentials.value !== undefined,
)
const hostingRouteActive = computed(() => route.path.startsWith('/hosting'))
let intercomBooting = false
let intercomBooted = false
async function fetchIntercomToken() {
const creds = await getCreds()
@@ -676,8 +693,10 @@ async function fetchIntercomToken() {
}
const params = new URLSearchParams()
if (route.path.startsWith('/hosting/manage/') && typeof route.params.id === 'string') {
params.set('server_id', route.params.id)
const rawServerId = route.params.id
const serverId = Array.isArray(rawServerId) ? rawServerId[0] : rawServerId
if (route.path.startsWith('/hosting/manage/') && typeof serverId === 'string') {
params.set('server_id', serverId)
}
const query = params.size > 0 ? `?${params.toString()}` : ''
@@ -693,69 +712,6 @@ async function fetchIntercomToken() {
return await response.json()
}
async function bootIntercom() {
if (
intercomBooting ||
intercomBooted ||
!hostingRouteActive.value ||
!credentials.value?.session
) {
return
}
intercomBooting = true
console.debug('[APP][INTERCOM] initializing secure support chat')
try {
const { token } = await fetchIntercomToken()
Intercom({
app_id: 'ykeritl9',
intercom_user_jwt: token,
session_duration: 1000 * 60 * 60 * 24,
alignment: 'right',
horizontal_padding: intercomBubblePosition.value.horizontalPadding,
vertical_padding: intercomBubblePosition.value.verticalPadding,
})
intercomBooted = true
} catch (error) {
console.warn('[APP][INTERCOM] failed to initialize secure support chat', error)
} finally {
intercomBooting = false
}
}
function shutdownHostingIntercom() {
if (!intercomBooted && !intercomBooting) return
shutdownIntercom()
intercomBooting = false
intercomBooted = false
}
watch(
intercomBubblePosition,
(position) => {
updateIntercomBubbleStyles(position)
if (intercomBooted) {
window.Intercom?.('update', {
horizontal_padding: position.horizontalPadding,
vertical_padding: position.verticalPadding,
})
}
},
{ immediate: true },
)
watch(
[hostingRouteActive, credentials],
([active]) => {
if (active) {
void bootIntercom()
} else {
shutdownHostingIntercom()
}
},
{ immediate: true },
)
watch(showAd, () => {
if (!showAd.value) {
hide_ads_window(true)
@@ -1822,14 +1778,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
--os-handle-bg-active: var(--color-scrollbar) !important;
}
.intercom-lightweight-app-launcher,
.intercom-launcher-frame,
iframe[name='intercom-launcher-frame'] {
right: var(--app-support-launcher-right, 20px) !important;
bottom: var(--app-support-launcher-bottom, 20px) !important;
z-index: 9 !important;
}
.mac {
.app-grid-statusbar {
padding-left: 5rem;
@@ -1,35 +1,33 @@
<template>
<ModalWrapper ref="detectJavaModal" header="Select java version" :show-ad-on-close="false">
<div class="auto-detect-modal">
<div class="table">
<div class="table-row table-head">
<div class="table-cell table-text">Version</div>
<div class="table-cell table-text">Path</div>
<div class="table-cell table-text">Actions</div>
</div>
<div v-for="javaInstall in chosenInstallOptions" :key="javaInstall.path" class="table-row">
<div class="table-cell table-text">
<span>{{ javaInstall.version }}</span>
</div>
<div v-tooltip="javaInstall.path" class="table-cell table-text">
<span>{{ javaInstall.path }}</span>
</div>
<div class="table-cell table-text manage">
<ButtonStyled v-if="currentSelected.path === javaInstall.path">
<button disabled><CheckIcon /> Selected</button>
<div class="flex flex-col gap-4">
<Table :columns="javaInstallColumns" :data="chosenInstallOptions" row-key="path">
<template #cell-version="{ value }">
<span class="font-semibold text-primary">{{ value }}</span>
</template>
<template #cell-path="{ value }">
<span v-tooltip="value" class="block truncate font-mono text-xs">{{ value }}</span>
</template>
<template #cell-actions="{ row }">
<div class="flex items-center justify-end">
<ButtonStyled v-if="currentSelected.path === row.path">
<button class="!shadow-none" disabled><CheckIcon /> Selected</button>
</ButtonStyled>
<ButtonStyled v-else>
<button @click="setJavaInstall(javaInstall)"><PlusIcon /> Select</button>
<button class="!shadow-none" @click="setJavaInstall(row)"><PlusIcon /> Select</button>
</ButtonStyled>
</div>
</div>
<div v-if="chosenInstallOptions.length === 0" class="table-row entire-row">
<div class="table-cell table-text">No java installations found!</div>
</div>
</div>
<div class="input-group push-right">
</template>
<template #empty-state>
<div class="p-4 text-secondary">No java installations found!</div>
</template>
</Table>
<div class="flex justify-end">
<ButtonStyled type="outlined">
<button @click="$refs.detectJavaModal.hide()">
<button
class="!shadow-none !border-surface-4 !border"
@click="$refs.detectJavaModal.hide()"
>
<XIcon />
Cancel
</button>
@@ -40,7 +38,7 @@
</template>
<script setup>
import { CheckIcon, PlusIcon, XIcon } from '@modrinth/assets'
import { ButtonStyled, injectNotificationManager } from '@modrinth/ui'
import { ButtonStyled, injectNotificationManager, Table } from '@modrinth/ui'
import { ref } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
@@ -52,6 +50,11 @@ const { handleError } = injectNotificationManager()
const chosenInstallOptions = ref([])
const detectJavaModal = ref(null)
const currentSelected = ref({})
const javaInstallColumns = [
{ key: 'version', label: 'Version', width: '9rem' },
{ key: 'path', label: 'Path' },
{ key: 'actions', label: 'Actions', align: 'right', width: '10rem' },
]
defineExpose({
show: async (version, currentSelectedJava) => {
@@ -77,25 +80,3 @@ function setJavaInstall(javaInstall) {
})
}
</script>
<style lang="scss" scoped>
.auto-detect-modal {
.table {
.table-row {
grid-template-columns: 1fr 4fr min-content;
}
span {
display: inherit;
align-items: center;
justify-content: center;
}
padding: 0.5rem;
}
}
.manage {
display: flex;
gap: 0.5rem;
}
</style>
@@ -1,85 +1,104 @@
<template>
<JavaDetectionModal ref="detectJavaModal" @submit="(val) => emit('update:modelValue', val)" />
<div class="toggle-setting" :class="{ compact }">
<StyledInput
autocomplete="off"
:disabled="props.disabled"
:model-value="props.modelValue ? props.modelValue.path : ''"
:placeholder="placeholder ?? '/path/to/java'"
wrapper-class="installation-input"
@update:model-value="
(val) => {
emit('update:modelValue', {
...props.modelValue,
path: val,
})
}
"
/>
<div :id="props.id" class="toggle-setting" :class="{ compact }">
<div class="input-with-status">
<StyledInput
autocomplete="off"
:disabled="props.disabled"
:model-value="props.modelValue ? props.modelValue.path : ''"
:placeholder="placeholder ?? '/path/to/java'"
wrapper-class="installation-input"
@update:model-value="
(val) => {
emit('update:modelValue', {
...props.modelValue,
path: val,
})
}
"
/>
<ButtonStyled
:color="
!hoveringTest && !testingJava
? testingJavaSuccess === true
? 'green'
: 'red'
: 'standard'
"
color-fill="text"
>
<button
class="!shadow-none"
:disabled="testingJava || props.disabled"
@click="runTest(props.modelValue?.path)"
@mouseenter="!props.disabled && (hoveringTest = true)"
@mouseleave="hoveringTest = false"
>
<SpinnerIcon v-if="testingJava" class="animate-spin h-4 w-4" />
<CheckCircleIcon
v-else-if="testingJavaSuccess === true && !hoveringTest"
class="h-4 w-4"
/>
<XCircleIcon v-else-if="testingJavaSuccess !== true && !hoveringTest" class="h-4 w-4" />
<RefreshCwIcon v-else-if="!props.disabled" class="h-4 w-4" />
</button>
</ButtonStyled>
</div>
<span class="installation-buttons">
<ButtonStyled v-if="props.version">
<button :disabled="props.disabled || installingJava" @click="reinstallJava">
<button
v-tooltip="testingJavaSuccess === true ? 'Already installed' : undefined"
class="!shadow-none"
:disabled="props.disabled || installingJava || testingJavaSuccess === true"
@click="reinstallJava"
>
<DownloadIcon />
{{ installingJava ? 'Installing...' : 'Install recommended' }}
</button>
</ButtonStyled>
<ButtonStyled>
<button :disabled="props.disabled" @click="autoDetect">
<button class="!shadow-none" :disabled="props.disabled" @click="autoDetect">
<SearchIcon />
Detect
</button>
</ButtonStyled>
<ButtonStyled>
<button :disabled="props.disabled" @click="handleJavaFileInput()">
<button class="!shadow-none" :disabled="props.disabled" @click="handleJavaFileInput()">
<FolderSearchIcon />
Browse
</button>
</ButtonStyled>
<ButtonStyled v-if="testingJava">
<button disabled>Testing...</button>
</ButtonStyled>
<ButtonStyled v-else-if="testingJavaSuccess === true">
<button disabled>
<CheckIcon />
Success
</button>
</ButtonStyled>
<ButtonStyled v-else-if="testingJavaSuccess === false">
<button disabled>
<XIcon />
Failed
</button>
</ButtonStyled>
<ButtonStyled v-else>
<button :disabled="props.disabled" @click="testJava">
<PlayIcon />
Test
</button>
</ButtonStyled>
</span>
</div>
</template>
<script setup>
import {
CheckIcon,
CheckCircleIcon,
DownloadIcon,
FolderSearchIcon,
PlayIcon,
RefreshCwIcon,
SearchIcon,
XIcon,
SpinnerIcon,
XCircleIcon,
} from '@modrinth/assets'
import { ButtonStyled, injectNotificationManager, StyledInput } from '@modrinth/ui'
import { open } from '@tauri-apps/plugin-dialog'
import { ref } from 'vue'
import { ref, watch } from 'vue'
import JavaDetectionModal from '@/components/ui/JavaDetectionModal.vue'
import useJavaTest from '@/composables/useJavaTest'
import { trackEvent } from '@/helpers/analytics'
import { auto_install_java, find_filtered_jres, get_jre, test_jre } from '@/helpers/jre.js'
import { auto_install_java, find_filtered_jres, get_jre } from '@/helpers/jre.js'
const { handleError } = injectNotificationManager()
const props = defineProps({
id: {
type: String,
required: false,
default: null,
},
version: {
type: Number,
required: false,
@@ -110,29 +129,36 @@ const props = defineProps({
const emit = defineEmits(['update:modelValue'])
const testingJava = ref(false)
const testingJavaSuccess = ref(null)
const {
testingJava,
javaTestResult: testingJavaSuccess,
testJavaInstallationDebounced,
testJavaInstallation,
} = useJavaTest()
const installingJava = ref(false)
const hoveringTest = ref(false)
let hasInitialized = false
async function testJava() {
testingJava.value = true
testingJavaSuccess.value = await test_jre(
props.modelValue ? props.modelValue.path : '',
props.version,
)
testingJava.value = false
trackEvent('JavaTest', {
path: props.modelValue ? props.modelValue.path : '',
success: testingJavaSuccess.value,
})
setTimeout(() => {
testingJavaSuccess.value = null
}, 2000)
async function runTest(path) {
await testJavaInstallation(path, props.version, true)
}
watch(
() => props.modelValue?.path,
(newPath) => {
if (newPath) {
if (!hasInitialized) {
testJavaInstallation(newPath, props.version, false)
hasInitialized = true
} else {
testJavaInstallationDebounced(newPath, props.version)
}
}
},
{ immediate: true },
)
async function handleJavaFileInput() {
const filePath = await open()
@@ -142,6 +168,7 @@ async function handleJavaFileInput() {
result = {
path: filePath.path ?? filePath,
version: props.version.toString(),
parsed_version: props.version,
architecture: 'x86',
}
}
@@ -175,6 +202,7 @@ async function reinstallJava() {
result = {
path: path,
version: props.version.toString(),
parsed_version: props.version,
architecture: 'x86',
}
}
@@ -186,13 +214,23 @@ async function reinstallJava() {
emit('update:modelValue', result)
installingJava.value = false
runTest(result.path)
}
</script>
<style lang="scss" scoped>
.input-with-status {
display: flex;
flex-direction: row;
align-items: center;
gap: 0.5rem;
width: 100%;
min-width: 0;
}
.installation-input {
width: 100% !important;
flex-grow: 1;
flex: 1 1 0;
min-width: 0;
}
.toggle-setting {
@@ -215,12 +253,4 @@ async function reinstallJava() {
gap: 0.5rem;
margin: 0;
}
.test-success {
color: var(--color-green);
}
.test-fail {
color: var(--color-red);
}
</style>
@@ -35,7 +35,7 @@ const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const queryClient = useQueryClient()
const { instance, offline, isMinecraftServer, onUnlinked } = injectInstanceSettings()
const { instance, offline, isMinecraftServer, onUnlinked, closeModal } = injectInstanceSettings()
const [
fabric_versions,
@@ -113,6 +113,7 @@ provideAppBackup({
})
provideInstallationSettings({
closeSettings: closeModal,
loading: ref(false),
installationInfo: computed(() => {
const rows = [
@@ -1,6 +1,15 @@
<script setup lang="ts">
import { CheckCircleIcon, XCircleIcon } from '@modrinth/assets'
import {
CheckCircleIcon,
CoffeeIcon,
FolderSearchIcon,
RefreshCwIcon,
SearchIcon,
SpinnerIcon,
XCircleIcon,
} from '@modrinth/assets'
import {
ButtonStyled,
Checkbox,
defineMessages,
injectNotificationManager,
@@ -8,9 +17,11 @@ import {
StyledInput,
useVIntl,
} from '@modrinth/ui'
import { open } from '@tauri-apps/plugin-dialog'
import { computed, readonly, ref, watch } from 'vue'
import JavaSelector from '@/components/ui/JavaSelector.vue'
import JavaDetectionModal from '@/components/ui/JavaDetectionModal.vue'
import useJavaTest from '@/composables/useJavaTest'
import useMemorySlider from '@/composables/useMemorySlider'
import { edit, get_optimal_jre_key } from '@/helpers/profile'
import { get } from '@/helpers/settings.ts'
@@ -25,9 +36,54 @@ const { instance } = injectInstanceSettings()
const globalSettings = (await get().catch(handleError)) as unknown as AppSettings
const overrideJavaInstall = ref(!!instance.value.java_path)
const optimalJava = readonly(await get_optimal_jre_key(instance.value.path).catch(handleError))
const javaInstall = ref({ path: optimalJava.path ?? instance.value.java_path })
const overrideJavaInstall = ref(!!instance.value.java_path)
const javaPath = ref(instance.value.java_path ?? optimalJava?.path ?? '')
const activePath = computed(() =>
overrideJavaInstall.value ? javaPath.value : (optimalJava?.path ?? ''),
)
watch(overrideJavaInstall, (enabled) => {
if (enabled && !javaPath.value) {
javaPath.value = optimalJava?.path ?? ''
}
})
const { testingJava, javaTestResult, testJavaInstallationDebounced, testJavaInstallation } =
useJavaTest()
const hoveringTest = ref(false)
let hasInitialized = false
watch(
activePath,
(newPath) => {
if (newPath && optimalJava?.parsed_version) {
if (!hasInitialized) {
testJavaInstallation(newPath, optimalJava?.parsed_version, false)
hasInitialized = true
} else {
testJavaInstallationDebounced(newPath, optimalJava?.parsed_version)
}
}
},
{ immediate: true },
)
const javaDetectionModal = ref<{ show: (version: number, current: object) => void } | null>(null)
async function handleBrowseJava() {
const result = await open({ multiple: false })
if (result) {
javaPath.value = result
}
}
function handleDetectJava() {
javaDetectionModal.value?.show(optimalJava?.parsed_version, { path: javaPath.value })
}
const overrideJavaArgs = ref((instance.value.extra_launch_args?.length ?? 0) > 0)
const javaArgs = ref(
@@ -51,8 +107,8 @@ const { maxMemory, snapPoints } = (await useMemorySlider().catch(handleError)) a
const editProfileObject = computed(() => {
return {
java_path:
overrideJavaInstall.value && javaInstall.value.path !== ''
? javaInstall.value.path.replace('java.exe', 'javaw.exe')
overrideJavaInstall.value && javaPath.value
? javaPath.value.replace('java.exe', 'javaw.exe')
: null,
extra_launch_args: overrideJavaArgs.value
? javaArgs.value.trim().split(/\s+/).filter(Boolean)
@@ -71,7 +127,7 @@ const editProfileObject = computed(() => {
watch(
[
overrideJavaInstall,
javaInstall,
javaPath,
overrideJavaArgs,
javaArgs,
overrideEnvVars,
@@ -90,17 +146,45 @@ const messages = defineMessages({
id: 'instance.settings.tabs.java.java-installation',
defaultMessage: 'Java installation',
},
customJavaInstallation: {
id: 'instance.settings.tabs.java.custom-java-installation',
defaultMessage: 'Custom Java installation',
},
javaPathPlaceholder: {
id: 'instance.settings.tabs.java.java-path-placeholder',
defaultMessage: '/path/to/java',
},
javaMemory: {
id: 'instance.settings.tabs.java.java-memory',
defaultMessage: 'Memory allocated',
},
customMemoryAllocation: {
id: 'instance.settings.tabs.java.custom-memory-allocation',
defaultMessage: 'Custom memory allocation',
},
javaArguments: {
id: 'instance.settings.tabs.java.java-arguments',
defaultMessage: 'Java arguments',
},
customJavaArguments: {
id: 'instance.settings.tabs.java.custom-java-arguments',
defaultMessage: 'Custom Java arguments',
},
enterJavaArguments: {
id: 'instance.settings.tabs.java.enter-java-arguments',
defaultMessage: 'Enter Java arguments...',
},
javaEnvironmentVariables: {
id: 'instance.settings.tabs.java.environment-variables',
defaultMessage: 'Environment variables',
},
javaMemory: {
id: 'instance.settings.tabs.java.java-memory',
defaultMessage: 'Memory allocated',
customEnvironmentVariables: {
id: 'instance.settings.tabs.java.custom-environment-variables',
defaultMessage: 'Custom environment variables',
},
enterEnvironmentVariables: {
id: 'instance.settings.tabs.java.enter-environment-variables',
defaultMessage: 'Enter environmental variables...',
},
hooks: {
id: 'instance.settings.tabs.java.hooks',
@@ -111,43 +195,86 @@ const messages = defineMessages({
<template>
<div>
<h2 id="project-name" class="m-0 mb-2.5 text-lg font-semibold text-contrast block">
<JavaDetectionModal ref="javaDetectionModal" @submit="(val) => (javaPath = val.path)" />
<h2 class="m-0 mb-2 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.javaInstallation) }}
</h2>
<Checkbox v-model="overrideJavaInstall" label="Custom Java installation" class="mb-2.5" />
<template v-if="!overrideJavaInstall">
<div class="flex my-2 items-center gap-2 font-semibold">
<template v-if="javaInstall">
<CheckCircleIcon class="text-brand-green h-4 w-4" />
<span>Using default Java {{ optimalJava.major_version }} installation:</span>
</template>
<template v-else-if="optimalJava">
<XCircleIcon class="text-brand-red h-5 w-5" />
<span
>Could not find a default Java {{ optimalJava.major_version }} installation. Please set
one below:</span
<Checkbox
v-model="overrideJavaInstall"
:label="formatMessage(messages.customJavaInstallation)"
class="mb-2"
/>
<div class="flex gap-4 p-4 bg-bg rounded-2xl">
<div class="flex gap-3 items-start flex-1 min-w-0">
<div
class="w-10 h-10 flex items-center justify-center rounded-full bg-button-bg border-solid border-[1px] border-button-border p-2 mt-1 shrink-0 [&_svg]:h-full [&_svg]:w-full"
>
<CoffeeIcon />
</div>
<div class="flex flex-col gap-2 flex-1 min-w-0">
<span class="font-semibold leading-none mt-2"
>Java {{ optimalJava?.parsed_version }}</span
>
</template>
<template v-else>
<XCircleIcon class="text-brand-red h-5 w-5" />
<span
>Could not automatically determine a Java installation to use. Please set one
below:</span
>
</template>
<div class="flex gap-2 items-center">
<StyledInput
:model-value="activePath"
:disabled="!overrideJavaInstall"
autocomplete="off"
:placeholder="formatMessage(messages.javaPathPlaceholder)"
wrapper-class="flex-1 min-w-0"
@update:model-value="(val) => (javaPath = String(val))"
/>
<ButtonStyled
:color="
!hoveringTest && !testingJava
? javaTestResult === true
? 'green'
: 'red'
: 'standard'
"
color-fill="text"
>
<button
:disabled="!overrideJavaInstall || testingJava"
@click="testJavaInstallation(activePath, optimalJava?.parsed_version, true)"
@mouseenter="overrideJavaInstall && (hoveringTest = true)"
@mouseleave="hoveringTest = false"
>
<SpinnerIcon v-if="testingJava" class="animate-spin h-4 w-4" />
<CheckCircleIcon
v-else-if="javaTestResult === true && !hoveringTest"
class="h-4 w-4"
/>
<XCircleIcon v-else-if="javaTestResult !== true && !hoveringTest" class="h-4 w-4" />
<RefreshCwIcon v-else-if="overrideJavaInstall" class="h-4 w-4" />
</button>
</ButtonStyled>
</div>
<div v-if="overrideJavaInstall" class="flex gap-2">
<ButtonStyled>
<button @click="handleDetectJava">
<SearchIcon />
Detect
</button>
</ButtonStyled>
<ButtonStyled>
<button @click="handleBrowseJava">
<FolderSearchIcon />
Browse
</button>
</ButtonStyled>
</div>
</div>
</div>
<div
v-if="javaInstall && !overrideJavaInstall"
class="p-4 bg-bg rounded-xl text-xs text-secondary leading-none font-mono"
>
{{ javaInstall.path }}
</div>
</template>
<JavaSelector v-if="overrideJavaInstall || !javaInstall" v-model="javaInstall" />
<h2 id="project-name" class="mt-6 mb-2.5 text-lg font-semibold text-contrast block">
</div>
<h2 class="mt-4 mb-1 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.javaMemory) }}
</h2>
<Checkbox v-model="overrideMemorySettings" label="Custom memory allocation" class="mb-2.5" />
<Checkbox
v-model="overrideMemorySettings"
:label="formatMessage(messages.customMemoryAllocation)"
class="mb-2"
/>
<Slider
id="max-memory"
v-model="memory.maximum"
@@ -159,28 +286,36 @@ const messages = defineMessages({
:snap-range="512"
unit="MB"
/>
<h2 id="project-name" class="mt-6 mb-2.5 text-lg font-semibold text-contrast block">
<h2 class="mt-4 mb-1 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.javaArguments) }}
</h2>
<Checkbox v-model="overrideJavaArgs" label="Custom java arguments" class="my-2" />
<Checkbox
v-model="overrideJavaArgs"
:label="formatMessage(messages.customJavaArguments)"
class="my-2"
/>
<StyledInput
id="java-args"
v-model="javaArgs"
autocomplete="off"
:disabled="!overrideJavaArgs"
placeholder="Enter java arguments..."
:placeholder="formatMessage(messages.enterJavaArguments)"
wrapper-class="w-full"
/>
<h2 id="project-name" class="mt-6 mb-2.5 text-lg font-semibold text-contrast block">
<h2 class="mt-4 mb-1 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.javaEnvironmentVariables) }}
</h2>
<Checkbox v-model="overrideEnvVars" label="Custom environment variables" class="mb-2.5" />
<Checkbox
v-model="overrideEnvVars"
:label="formatMessage(messages.customEnvironmentVariables)"
class="mb-2"
/>
<StyledInput
id="env-vars"
v-model="envVars"
autocomplete="off"
:disabled="!overrideEnvVars"
placeholder="Enter environmental variables..."
:placeholder="formatMessage(messages.enterEnvironmentVariables)"
wrapper-class="w-full"
/>
</div>
@@ -45,12 +45,19 @@ const isMinecraftServer = ref(false)
const handleUnlinked = () => emit('unlinked')
const instanceRef = computed(() => props.instance)
const queryClient = useQueryClient()
const tabbedModal = ref<InstanceType<typeof TabbedModal> | null>(null)
function hide() {
tabbedModal.value?.hide()
}
provideInstanceSettings({
instance: instanceRef,
offline: props.offline,
isMinecraftServer,
onUnlinked: handleUnlinked,
closeModal: hide,
})
watch(
@@ -113,9 +120,6 @@ const tabs = computed<TabbedModalTab[]>(() => [
},
])
const queryClient = useQueryClient()
const tabbedModal = ref<InstanceType<typeof TabbedModal> | null>(null)
function show(tabIndex?: number) {
if (props.instance.linked_data?.project_id) {
queryClient.prefetchQuery({
@@ -129,7 +133,7 @@ function show(tabIndex?: number) {
}
}
defineExpose({ show })
defineExpose({ show, hide })
</script>
<template>
<TabbedModal
@@ -1,121 +0,0 @@
import { computed, onUnmounted, ref } from 'vue'
import type { RouteLocationNormalizedLoaded } from 'vue-router'
interface ThemeStore {
toggleSidebar: boolean
$subscribe: (callback: () => void) => () => void
}
interface IntercomBubblePosition {
horizontalPadding: number
verticalPadding: number
}
const APP_LEFT_NAV_WIDTH = '4rem'
const APP_SIDEBAR_WIDTH = 300
const INTERCOM_BUBBLE_DEFAULT_PADDING = 20
const INTERCOM_BUBBLE_WIDTH = 72
const INTERCOM_BUBBLE_RIGHT_VAR = '--app-support-launcher-right'
const INTERCOM_BUBBLE_BOTTOM_VAR = '--app-support-launcher-bottom'
export function useIntercomPositioning({
route,
themeStore,
}: {
route: RouteLocationNormalizedLoaded
themeStore: ThemeStore
}) {
const sidebarToggled = ref(true)
const unsubscribeSidebarToggle = themeStore.$subscribe(() => {
sidebarToggled.value = !themeStore.toggleSidebar
})
onUnmounted(unsubscribeSidebarToggle)
const forceSidebar = computed(
() => route.path.startsWith('/browse') || route.path.startsWith('/project'),
)
const sidebarVisible = computed(() => sidebarToggled.value || forceSidebar.value)
const defaultIntercomBubbleHorizontalPadding = computed(() =>
sidebarVisible.value
? APP_SIDEBAR_WIDTH + INTERCOM_BUBBLE_DEFAULT_PADDING
: INTERCOM_BUBBLE_DEFAULT_PADDING,
)
const intercomBubbleRequestedHorizontalPadding = ref<number | null>(null)
const intercomBubbleHorizontalPadding = computed(
() =>
intercomBubbleRequestedHorizontalPadding.value ??
defaultIntercomBubbleHorizontalPadding.value,
)
const intercomBubbleVerticalClearance = ref<number | null>(null)
const intercomBubblePosition = computed(() => ({
horizontalPadding: intercomBubbleHorizontalPadding.value,
verticalPadding: intercomBubbleVerticalClearance.value ?? INTERCOM_BUBBLE_DEFAULT_PADDING,
}))
const intercomBubbleHorizontalPaddingRequests = new Map<symbol, number>()
const intercomBubbleClearanceRequests = new Map<symbol, number>()
function requestIntercomBubbleHorizontalPadding(id: symbol, padding: number | null) {
if (padding === null) {
intercomBubbleHorizontalPaddingRequests.delete(id)
} else {
intercomBubbleHorizontalPaddingRequests.set(id, padding)
}
intercomBubbleRequestedHorizontalPadding.value =
intercomBubbleHorizontalPaddingRequests.size > 0
? Math.max(...intercomBubbleHorizontalPaddingRequests.values())
: null
}
function requestIntercomBubbleVerticalClearance(id: symbol, clearance: number | null) {
if (clearance === null) {
intercomBubbleClearanceRequests.delete(id)
} else {
intercomBubbleClearanceRequests.set(id, clearance)
}
intercomBubbleVerticalClearance.value =
intercomBubbleClearanceRequests.size > 0
? Math.max(...intercomBubbleClearanceRequests.values())
: null
}
function updateIntercomBubbleStyles({
horizontalPadding,
verticalPadding,
}: IntercomBubblePosition) {
if (typeof document === 'undefined') return
document.documentElement.style.setProperty(INTERCOM_BUBBLE_RIGHT_VAR, `${horizontalPadding}px`)
document.documentElement.style.setProperty(INTERCOM_BUBBLE_BOTTOM_VAR, `${verticalPadding}px`)
}
function clearIntercomBubbleStyles() {
if (typeof document === 'undefined') return
document.documentElement.style.removeProperty(INTERCOM_BUBBLE_RIGHT_VAR)
document.documentElement.style.removeProperty(INTERCOM_BUBBLE_BOTTOM_VAR)
}
return {
sidebarToggled,
forceSidebar,
sidebarVisible,
intercomBubblePosition,
updateIntercomBubbleStyles,
clearIntercomBubbleStyles,
pageContext: {
floatingActionBarOffsets: {
left: ref(APP_LEFT_NAV_WIDTH),
right: computed(() => (sidebarVisible.value ? `${APP_SIDEBAR_WIDTH}px` : '0px')),
},
intercomBubble: {
width: ref(INTERCOM_BUBBLE_WIDTH),
horizontalPadding: intercomBubbleHorizontalPadding,
requestHorizontalPadding: requestIntercomBubbleHorizontalPadding,
requestVerticalClearance: requestIntercomBubbleVerticalClearance,
},
},
}
}
@@ -8,7 +8,7 @@ interface LogEntry {
filename: string
name?: string
log_type: string
stdout?: string
output?: string | null
age?: number
live?: boolean
}
@@ -50,12 +50,12 @@ async function getHistoricalLogs(profilePathId: string, instancePath: string): P
const entry = getOrCreate(profilePathId)
if (entry.logList) return entry.logList
const logs: LogEntry[] = await get_logs(instancePath, false)
const logs: LogEntry[] = await get_logs(instancePath, true)
entry.logList = logs
for (const log of logs) {
if (log.stdout && log.stdout !== '') {
entry.historicalCache.set(log.filename, log.stdout)
if (log.output) {
entry.historicalCache.set(log.filename, log.output)
}
}
@@ -0,0 +1,52 @@
import { ref } from 'vue'
import { trackEvent } from '@/helpers/analytics'
import { test_jre } from '@/helpers/jre.js'
export default function useJavaTest() {
const testingJava = ref(false)
const javaTestResult = ref<boolean | null>(null)
let testDebounceTimer: ReturnType<typeof setTimeout> | null = null
async function runJavaTest(path: string, version: number, track = true) {
if (testDebounceTimer) {
clearTimeout(testDebounceTimer)
testDebounceTimer = null
}
if (!path) {
javaTestResult.value = null
return
}
testingJava.value = true
try {
javaTestResult.value = await test_jre(path, version)
} catch {
javaTestResult.value = false
}
testingJava.value = false
if (track) {
trackEvent('JavaTest', { path, success: javaTestResult.value })
}
}
function testJavaInstallationDebounced(path: string, version: number, delay = 600) {
if (testDebounceTimer) clearTimeout(testDebounceTimer)
if (!path) {
javaTestResult.value = null
return
}
testDebounceTimer = setTimeout(() => runJavaTest(path, version, false), delay)
}
async function testJavaInstallation(path: string, version: number, track = false) {
await runJavaTest(path, version, track)
}
return {
testingJava,
javaTestResult,
testJavaInstallationDebounced,
testJavaInstallation,
}
}
@@ -0,0 +1,100 @@
import type {
ContentItem,
ContentModpackCardCategory,
ContentModpackCardProject,
ContentModpackCardVersion,
ContentOwner,
} from '@modrinth/ui'
import {
get_content_items,
get_linked_modpack_info,
type LinkedModpackInfo,
} from '@/helpers/profile'
import { get_categories } from '@/helpers/tags.js'
import type { CacheBehaviour } from '@/helpers/types'
export type InstanceContentData = {
path: string
contentItems: ContentItem[] | null
modpack: InstanceContentModpackData | null
}
export type InstanceContentModpackData = {
project: ContentModpackCardProject
version: ContentModpackCardVersion
owner: ContentOwner | null
categories: ContentModpackCardCategory[]
hasUpdate: boolean
updateVersionId: string | null
}
export async function loadInstanceContentData(
path: string,
cacheBehaviour?: CacheBehaviour,
onError?: (error: Error) => unknown,
): Promise<InstanceContentData> {
const [contentItems, modpackInfo, allCategories] = await Promise.all([
get_content_items(path, cacheBehaviour).catch((error) => handleLoadError(error, onError)),
get_linked_modpack_info(path, cacheBehaviour).catch((error) => handleLoadError(error, onError)),
get_categories().catch((error) => handleLoadError(error, onError)),
])
return {
path,
contentItems: (contentItems as ContentItem[] | null | undefined) ?? null,
modpack: normalizeLinkedModpackInfo(
modpackInfo as LinkedModpackInfo | null | undefined,
allCategories as ContentModpackCardCategory[] | null | undefined,
),
}
}
function handleLoadError(error: unknown, onError?: (error: Error) => unknown) {
onError?.(error as Error)
return null
}
function normalizeLinkedModpackInfo(
modpackInfo: LinkedModpackInfo | null | undefined,
allCategories: ContentModpackCardCategory[] | null | undefined,
): InstanceContentModpackData | null {
if (!modpackInfo) return null
return {
project: {
...modpackInfo.project,
slug: modpackInfo.project.slug ?? modpackInfo.project.id,
icon_url: modpackInfo.project.icon_url ?? undefined,
},
version: {
...modpackInfo.version,
date_published: modpackInfo.version.date_published.toString(),
},
owner: modpackInfo.owner
? {
...modpackInfo.owner,
avatar_url: modpackInfo.owner.avatar_url ?? undefined,
}
: null,
categories: resolveLinkedModpackCategories(modpackInfo, allCategories),
hasUpdate: modpackInfo.has_update,
updateVersionId: modpackInfo.update_version_id,
}
}
function resolveLinkedModpackCategories(
modpackInfo: LinkedModpackInfo,
allCategories: ContentModpackCardCategory[] | null | undefined,
) {
if (!allCategories || !modpackInfo.project.categories) return []
const seen = new Set<string>()
return allCategories.filter((category) => {
if (modpackInfo.project.categories.includes(category.name) && !seen.has(category.name)) {
seen.add(category.name)
return true
}
return false
})
}
+2 -3
View File
@@ -6,12 +6,11 @@
import { invoke } from '@tauri-apps/api/core'
/*
A log is a struct containing the filename string, stdout, and stderr, as follows:
A log is a struct containing the filename string and optional output, as follows:
pub struct Logs {
pub filename: String,
pub stdout: String,
pub stderr: String,
pub output: Option<String>,
}
*/
+8 -1
View File
@@ -147,9 +147,16 @@ export async function get_mod_full_path(path: string, projectPath: string): Prom
return await invoke('plugin:profile|profile_get_mod_full_path', { path, projectPath })
}
export interface JavaVersion {
parsed_version: number
version: string
architecture: string
path: string
}
// Get optimal java version from profile
// Returns a java version
export async function get_optimal_jre_key(path: string): Promise<string | null> {
export async function get_optimal_jre_key(path: string): Promise<JavaVersion | null> {
return await invoke('plugin:profile|profile_get_optimal_jre_key', { path })
}
@@ -5,6 +5,15 @@
"app.action-bar.downloads": {
"message": "التنزيلات"
},
"app.action-bar.offline": {
"message": "غير متصل"
},
"app.appearance-settings.default-landing-page.home": {
"message": "صفحة الرئيسية"
},
"app.appearance-settings.default-landing-page.library": {
"message": "مكتبة"
},
"app.auth-servers.unreachable.body": {
"message": "قد تكون خوادم مصادقة ماينكرافت معطلة حاليًا. تحقق من اتصالك بالإنترنت وحاول مرة أخرى لاحقًا."
},
@@ -566,6 +575,12 @@
"instance.worlds.world_in_use": {
"message": "العالم قيد الاستخدام"
},
"minecraft-account.add-account": {
"message": "إضافة حساب"
},
"minecraft-account.select-account": {
"message": "اختيار الحساب"
},
"search.filter.locked.instance": {
"message": "مقدَّم من النسخة"
},
@@ -1,10 +1,115 @@
{
"app.action-bar.downloading-java": {
"message": "Stahování Javy {version}"
},
"app.action-bar.downloads": {
"message": "Stažené Soubory"
},
"app.action-bar.hide-more-running-instances": {
"message": "Skrýt více spuštěných instancí"
},
"app.action-bar.make-primary-instance": {
"message": "Použít jako primární instanci"
},
"app.action-bar.no-instances-running": {
"message": "Žádné spuštěné instance"
},
"app.action-bar.offline": {
"message": "Offline"
},
"app.action-bar.primary-instance": {
"message": "Primární instance"
},
"app.action-bar.show-more-running-instances": {
"message": "Zobrazit další spuštěné instance"
},
"app.action-bar.stop-instance": {
"message": "Ukončit instanci"
},
"app.action-bar.view-active-downloads": {
"message": "Zobrazit probíhající stahování"
},
"app.action-bar.view-instance": {
"message": "Zobrazit instanci"
},
"app.action-bar.view-logs": {
"message": "Zobrazit záznamy"
},
"app.appearance-settings.advanced-rendering.description": {
"message": "Umožňuje pokročilé vykreslování, jako jsou efekty rozostření, které mohou způsobit problémy s výkonem bez hardwarového vykreslení."
},
"app.appearance-settings.advanced-rendering.title": {
"message": "Pokročilé vykreslování"
},
"app.appearance-settings.color-theme.description": {
"message": "Vyberte si váš preferovaný motiv pro aplikaci Modrinth."
},
"app.appearance-settings.color-theme.title": {
"message": "Barevný motiv"
},
"app.appearance-settings.default-landing-page.description": {
"message": "Změňte stránku, na které se spouštěč otevře."
},
"app.appearance-settings.default-landing-page.home": {
"message": "Domov"
},
"app.appearance-settings.default-landing-page.library": {
"message": "Knihovna"
},
"app.appearance-settings.default-landing-page.title": {
"message": "Výchozí úvodní stránka"
},
"app.appearance-settings.hide-nametag.description": {
"message": "Zakáže zobrazení jmenovky nad vaší postavou na stránce skinů."
},
"app.appearance-settings.hide-nametag.title": {
"message": "Skrýt jmenovku"
},
"app.appearance-settings.jump-back-into-worlds.description": {
"message": "V sekci „Vrátit se do hry“ na úvodní stránce jsou uvedeny nejnovější světy."
},
"app.appearance-settings.jump-back-into-worlds.title": {
"message": "Skočit zpět do světů"
},
"app.appearance-settings.minimize-launcher.description": {
"message": "Minimalizovat spouštěč při spuštění procesu Minecraftu."
},
"app.appearance-settings.minimize-launcher.title": {
"message": "Minimalizovat spouštěč"
},
"app.appearance-settings.native-decorations.description": {
"message": "Použít systémový rámeček okna (vyžaduje restart aplikace)."
},
"app.appearance-settings.native-decorations.title": {
"message": "Nativní dekorace"
},
"app.appearance-settings.select-option": {
"message": "Vyberte možnost"
},
"app.appearance-settings.toggle-sidebar.description": {
"message": "Umožňí přepínat zobrazení postranního panelu."
},
"app.appearance-settings.toggle-sidebar.title": {
"message": "Přepnout postranní panel"
},
"app.appearance-settings.unknown-pack-warning.description": {
"message": "Pokud se pokusíte nainstalovat soubor Modrinth Pack (.mrpack), který není hostován na Modrinth, zajistíme, abyste si před instalací uvědomili související rizika."
},
"app.appearance-settings.unknown-pack-warning.title": {
"message": "Upozorni mě před instalací neznámých modpacků"
},
"app.auth-servers.unreachable.body": {
"message": "Autořizační servery Minecraftu aktuálně nejsou k dispozici. Zkontrolujte si své připojení k internetu a zkuste to znovu později."
},
"app.auth-servers.unreachable.header": {
"message": "Připojení k autorizačním serverům se nezdařilo"
},
"app.browse.add-servers-to-instance": {
"message": "Přidat server do instance"
},
"app.browse.add-to-an-instance": {
"message": "Přidat do instalace"
},
"app.browse.add-to-instance": {
"message": "Přidat do instalace"
},
@@ -17,12 +122,33 @@
"app.browse.already-added": {
"message": "Už přidáno"
},
"app.browse.back-to-instance": {
"message": "Zpět k instanci"
},
"app.browse.discover-content": {
"message": "Prozkoumat obsah"
},
"app.browse.discover-servers": {
"message": "Prozkoumat servery"
},
"app.browse.hide-added-servers": {
"message": "Skrýt již přidané servery"
},
"app.browse.project-type.modpacks": {
"message": "Balíčky Modifikací"
},
"app.browse.server-instance-content-warning": {
"message": "Přidání obsahu může narušit kompatibilitu při připojení k serveru. Veškerý přidaný obsah se navíc ztratí při aktualizaci obsahu instance serveru."
},
"app.browse.server.installing": {
"message": "Instalování"
},
"app.creation-modal.installing-modpack.description": {
"message": "{fileName}"
},
"app.creation-modal.installing-modpack.title": {
"message": "Probíhá instalace modpacku..."
},
"app.export-modal.description-placeholder": {
"message": "Přidej popis modpacku..."
},
@@ -32,12 +158,18 @@
"app.export-modal.header": {
"message": "Exportovat modpack"
},
"app.export-modal.include-file-accessibility-label": {
"message": "Zahrnout \"{file}\"?"
},
"app.export-modal.modpack-name-label": {
"message": "Jméno Modpacku"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Jméno modpacku"
},
"app.export-modal.select-files-label": {
"message": "Nastavte, které soubory mají být do tohoto exportu zahrnuty"
},
"app.export-modal.version-number-label": {
"message": "Číslo verze"
},
@@ -119,6 +251,9 @@
"app.instance.worlds.remove-server-description": {
"message": "„{name}“ bude odstraněn z tvého seznamu, včetně hry, a nebude žádný způsob, jak ho obnovit."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) bude odstraněn z vašeho seznamu, a to i ve hře, a nebude možné jej obnovit."
},
"app.instance.worlds.remove-server-title": {
"message": "Opravdu chceš odstranit {name}?"
},
@@ -128,6 +263,9 @@
"app.instance.worlds.this-server": {
"message": "tento server"
},
"app.modal.install-to-play.content-required": {
"message": "Požadovaný obsah"
},
"app.modal.install-to-play.header": {
"message": "Nainstaluj ke hraní"
},
@@ -137,12 +275,21 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural,one {#mód} other {#módy}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Povinný modpack"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Tento server k hraní vyžaduje módy. Klikni na instalovat pro získání potřebných módů z Modrinth."
},
"app.modal.install-to-play.shared-instance": {
"message": "Sdílená instance"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "Sdílená serverová instance"
},
"app.modal.install-to-play.view-contents": {
"message": "Zobrazit obsah"
},
"app.modal.update-to-play.header": {
"message": "Updatuj ke hraní"
},
@@ -152,6 +299,15 @@
"app.modal.update-to-play.update-required-description": {
"message": "Je nutná aktualizace ke hraní {name}. Prosím updatuj na nejnovější verzi k spuštění hry."
},
"app.project.install-button.already-installed": {
"message": "Tento projekt je již nainstalován"
},
"app.project.install-context.back-to-browse": {
"message": "Zpět na Prozkoumat"
},
"app.project.install-context.install-content-to-instance": {
"message": "Nainstalovat obsah do instnce"
},
"app.settings.developer-mode-enabled": {
"message": "Vývojářský režim povolen."
},
@@ -176,9 +332,33 @@
"app.settings.tabs.resource-management": {
"message": "Správa zdrojů"
},
"app.update-popup.body": {
"message": "Aplikace Modrinth v{version} je připravena k instalaci! Nainstalujte aktualizaci nyní nebo automaticky po zavření aplikace Modrinth."
},
"app.update-popup.body.download-complete": {
"message": "Stahování aplikace Modrinth v{version} bylo dokončeno. Nainstalujte aktualizaci nyní nebo automaticky po zavření aplikace Modrinth."
},
"app.update-popup.body.linux": {
"message": "Aplikace Modrinth v{version} je k dispozici. Aktualizujte pomocí svého správce balíčků, abyste získali nejnovější funkce a opravy!"
},
"app.update-popup.body.metered": {
"message": "Aplikace Modrinth v{version} je nyní k dispozici! Protože jste v měřené síti, nebyla stažena automaticky."
},
"app.update-popup.changelog": {
"message": "Seznam změn"
},
"app.update-popup.download": {
"message": "Stáhnout ({size})"
},
"app.update-popup.download-complete": {
"message": "Stahování bylo dokončeno"
},
"app.update-popup.reload": {
"message": "Načíst znovu"
},
"app.update-popup.title": {
"message": "Je k dispozici aktualizace"
},
"app.update.complete-toast.text": {
"message": "Kliknutím sem zobrazíte seznam změn."
},
@@ -194,6 +374,24 @@
"app.update.reload-to-update": {
"message": "Restartovat aplikaci pro nainstalování aktualizace"
},
"app.world.server-modal.placeholder-address": {
"message": "priklad.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Vyberte možnost"
},
"app.world.world-item.incompatible-version": {
"message": "Nekompatibilní verze {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Ještě nehráno"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Přidat přítele"
},
@@ -293,6 +491,12 @@
"instance.edit-world.title": {
"message": "Upravit svět"
},
"instance.files.adding-files": {
"message": "Přidávání souborů ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Uložit jako..."
},
"instance.server-modal.address": {
"message": "Adresa"
},
@@ -473,6 +677,9 @@
"instance.worlds.incompatible_server": {
"message": "Server je nekompatibilní"
},
"instance.worlds.linked_server": {
"message": "Spravováno projektem serveru"
},
"instance.worlds.no_contact": {
"message": "Server se nepodařilo spojit"
},
@@ -491,6 +698,24 @@
"instance.worlds.world_in_use": {
"message": "Svět je použit"
},
"minecraft-account.add-account": {
"message": "Přidat účet"
},
"minecraft-account.label": {
"message": "Účet Minecraft"
},
"minecraft-account.not-signed-in": {
"message": "Nejste přihlášeni"
},
"minecraft-account.remove-account": {
"message": "Odstranit účet"
},
"minecraft-account.select-account": {
"message": "Vyberte účet"
},
"minecraft-account.sign-in": {
"message": "Přihlásit se do Minecraftu"
},
"search.filter.locked.instance": {
"message": "Poskytováno instancí"
},
@@ -503,6 +728,9 @@
"search.filter.locked.instance.sync": {
"message": "Synchronizováno z instancí"
},
"search.filter.locked.server": {
"message": "Poskytováno serverem"
},
"search.filter.locked.server-environment.title": {
"message": "Jen klientské mody mohou být přidány na server"
},
@@ -511,5 +739,26 @@
},
"search.filter.locked.server-loader.title": {
"message": "Loader zprostředkovává server"
},
"unknown-pack-warning-modal.body": {
"message": "Soubor je zkontrolován pouze v případě, že je nahrán na Modrinth, a to bez ohledu na jeho formát (včetně formátu .mrpack)."
},
"unknown-pack-warning-modal.dont-show-again": {
"message": "Toto varování již nezobrazovat"
},
"unknown-pack-warning-modal.header": {
"message": "Potvrdit instalaci"
},
"unknown-pack-warning-modal.install-anyway": {
"message": "Přesto nainstalovat"
},
"unknown-pack-warning-modal.malware-statement": {
"message": "Malware se často šíří prostřednictvím souborů s modpacky, které se sdílejí na platformách jako Discord."
},
"unknown-pack-warning-modal.warning.body": {
"message": "Tento soubor jsme na Modrinthu nenašli. Důrazně doporučujeme instalovat pouze soubory z důvěryhodných zdrojů."
},
"unknown-pack-warning-modal.warning.title": {
"message": "Upozornění na neznámý soubor"
}
}
@@ -104,6 +104,12 @@
"app.browse.discover-servers": {
"message": "Opdag servere"
},
"app.browse.project-type.modpacks": {
"message": "Modpacks"
},
"app.creation-modal.installing-modpack.description": {
"message": "{fileName}"
},
"app.export-modal.description-placeholder": {
"message": "Indtast modpack beskrivelse..."
},
@@ -303,7 +303,7 @@
"message": "Dieses Projekt ist bereits installiert"
},
"app.project.install-context.back-to-browse": {
"message": "Zurück zum Durchstöbern"
"message": "Zurück zum Entdecken"
},
"app.project.install-context.install-content-to-instance": {
"message": "Inhalt in Instanz installieren"
@@ -48,7 +48,7 @@
"message": "Farbschema"
},
"app.appearance-settings.default-landing-page.description": {
"message": "Ändere die Seite, die beim Öffnen des Launchers angezeigt wird."
"message": "Ändere die Kategorie, die beim Öffnen des Launchers angezeigt wird."
},
"app.appearance-settings.default-landing-page.home": {
"message": "Start"
@@ -137,6 +137,9 @@
"app.browse.project-type.modpacks": {
"message": "Modpacks"
},
"app.browse.server-instance-content-warning": {
"message": "Das Hinzufügen von Inhalten kann die Kompatibilität beim Beitreten zum Server beeinträchtigen. Außerdem gehen alle hinzugefügten Inhalte verloren, wenn du die Inhalte der Serverinstanz aktualisierst."
},
"app.browse.server.installing": {
"message": "Wird installiert"
},
@@ -299,6 +302,9 @@
"app.project.install-button.already-installed": {
"message": "Dieses Projekt ist bereits installiert"
},
"app.project.install-context.back-to-browse": {
"message": "Zurück zum Entdecken"
},
"app.project.install-context.install-content-to-instance": {
"message": "Inhalt in Instanz installieren"
},
@@ -519,7 +525,7 @@
"message": "Wird gelöscht..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Kopieren"
"message": "Duplizieren"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "Kann während der Installation nicht dupliziert werden."
@@ -611,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java and memory"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "Custom environment variables"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "Custom Java arguments"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "Custom Java installation"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "Custom memory allocation"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "Enter environmental variables..."
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "Enter Java arguments..."
},
"instance.settings.tabs.java.environment-variables": {
"message": "Environment variables"
},
@@ -626,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "Memory allocated"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/path/to/java"
},
"instance.settings.tabs.window": {
"message": "Window"
},
@@ -104,6 +104,12 @@
"app.auth-servers.unreachable.header": {
"message": "No se puede acceder a los servidores de autenticación"
},
"app.browse.add-servers-to-instance": {
"message": "Añadiendo servidor a instancia"
},
"app.browse.add-to-an-instance": {
"message": "Añadir a una instancia"
},
"app.browse.add-to-instance": {
"message": "Añadir a instancia"
},
@@ -116,6 +122,9 @@
"app.browse.already-added": {
"message": "Ya se ha añadido"
},
"app.browse.back-to-instance": {
"message": "Volver a instancia"
},
"app.browse.discover-content": {
"message": "Descubrir contenido"
},
@@ -128,6 +137,9 @@
"app.browse.project-type.modpacks": {
"message": "Modpacks"
},
"app.browse.server-instance-content-warning": {
"message": "Añadir contenido puede romper la compatibilidad cuando te unes al servidor. Cualquier contenido añadido tambien se perderá cuando actualizes el contenido en la instancia del servidor."
},
"app.browse.server.installing": {
"message": "Instalando"
},
@@ -287,6 +299,15 @@
"app.modal.update-to-play.update-required-description": {
"message": "Se requiere una actualización para jugar {name}. Por favor, actualiza a la versión más reciente para iniciar el juego."
},
"app.project.install-button.already-installed": {
"message": "Este proyecto está actualmente instalado"
},
"app.project.install-context.back-to-browse": {
"message": "Volver al explorador"
},
"app.project.install-context.install-content-to-instance": {
"message": "Instalar contenido a la instancia"
},
"app.settings.developer-mode-enabled": {
"message": "Modo desarrollador activado."
},
+52 -7
View File
@@ -21,7 +21,7 @@
"message": "Instancia principal"
},
"app.action-bar.show-more-running-instances": {
"message": "Mostrar mas instancias en ejecución"
"message": "Mostrar más instancias en ejecución"
},
"app.action-bar.stop-instance": {
"message": "Finalizar instancia"
@@ -48,7 +48,7 @@
"message": "Tema de color"
},
"app.appearance-settings.default-landing-page.description": {
"message": "Cambia la página en la que el launcher se abre en."
"message": "Cambia la página en la que el lanzador inicia."
},
"app.appearance-settings.default-landing-page.home": {
"message": "Inicio"
@@ -72,13 +72,13 @@
"message": "Vuelve a jugar tus mundos"
},
"app.appearance-settings.minimize-launcher.description": {
"message": "Minimiza el launcher cuando un proceso de Minecraft empieza."
"message": "Minimiza el lanzador cuando un proceso de Minecraft empieza."
},
"app.appearance-settings.minimize-launcher.title": {
"message": "Minimiza el launcher"
"message": "Minimiza el lanzador"
},
"app.appearance-settings.native-decorations.description": {
"message": "Usa los sistemas de frame de Windows (se requiere resetear la aplicación)."
"message": "Usa los sistemas de marco de Windows (se requiere resetear la aplicación)."
},
"app.appearance-settings.native-decorations.title": {
"message": "Decoraciones nativas"
@@ -93,10 +93,10 @@
"message": "Alternar barra lateral"
},
"app.appearance-settings.unknown-pack-warning.description": {
"message": "Si intentas instalar un archivo de paquete de Modrinth (.mrpack) que no esté alojado en Modrinth, te advertiremos de los riesgos antes de instalarlo."
"message": "Si intentas instalar un archivo de paquete de Modrinth (.mrpack) que no esté alojado en Modrinth, debes comprender los riesgos que esto conlleva antes de instalarlo."
},
"app.appearance-settings.unknown-pack-warning.title": {
"message": "Adviérteme antes de instalarme modpacks desconocidos"
"message": "Advertir antes de instalarme paquetes de mods desconocidos"
},
"app.auth-servers.unreachable.body": {
"message": "Los servidores de autenticación de Minecraft pueden no estar funcionando en este momento. Verifica tu conexión a internet e inténtalo de nuevo más tarde."
@@ -104,6 +104,12 @@
"app.auth-servers.unreachable.header": {
"message": "No se puede conectar con los servidores de autenticación"
},
"app.browse.add-servers-to-instance": {
"message": "Añadir servidor a instancia"
},
"app.browse.add-to-an-instance": {
"message": "Añadir a una instancia"
},
"app.browse.add-to-instance": {
"message": "Añadir a la instancia"
},
@@ -116,6 +122,9 @@
"app.browse.already-added": {
"message": "Ya está añadido"
},
"app.browse.back-to-instance": {
"message": "Volver a la instancia"
},
"app.browse.discover-content": {
"message": "Descubrir contenido"
},
@@ -128,6 +137,9 @@
"app.browse.project-type.modpacks": {
"message": "Modpacks"
},
"app.browse.server-instance-content-warning": {
"message": "Añadir contenido puede comprometer la compatibilidad a la hora de unirse a un servidor. Cualquier contenido añadido se perderá cuando actualices la instancia del servidor."
},
"app.browse.server.installing": {
"message": "Instalando"
},
@@ -146,12 +158,18 @@
"app.export-modal.header": {
"message": "Exportar modpack"
},
"app.export-modal.include-file-accessibility-label": {
"message": "¿Incluir \"{file}\"?"
},
"app.export-modal.modpack-name-label": {
"message": "Nombre del modpack"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Nombre del modpack"
},
"app.export-modal.select-files-label": {
"message": "Configura que archivos se incluirán en esta instancia"
},
"app.export-modal.version-number-label": {
"message": "Número de versión"
},
@@ -281,6 +299,15 @@
"app.modal.update-to-play.update-required-description": {
"message": "Una actualización es requerida para jugar {name}. Por favor actualízala a la versión más reciente para ejecutar el juego."
},
"app.project.install-button.already-installed": {
"message": "El proyecto ya está instalado"
},
"app.project.install-context.back-to-browse": {
"message": "Volver a descubrir"
},
"app.project.install-context.install-content-to-instance": {
"message": "Instalar contenido"
},
"app.settings.developer-mode-enabled": {
"message": "Modo desarrollador activado."
},
@@ -671,6 +698,24 @@
"instance.worlds.world_in_use": {
"message": "El mundo está en uso"
},
"minecraft-account.add-account": {
"message": "Añadir cuenta"
},
"minecraft-account.label": {
"message": "Cuenta de Minecraft"
},
"minecraft-account.not-signed-in": {
"message": "Registrarse"
},
"minecraft-account.remove-account": {
"message": "Eliminar cuenta"
},
"minecraft-account.select-account": {
"message": "Seleccionar cuenta"
},
"minecraft-account.sign-in": {
"message": "Registrarse en Minecraft"
},
"search.filter.locked.instance": {
"message": "Proporcionado por la instancia"
},
@@ -1,10 +1,115 @@
{
"app.action-bar.downloading-java": {
"message": "Ladataan Java-versiota {version}"
},
"app.action-bar.downloads": {
"message": "Lataukset"
},
"app.action-bar.hide-more-running-instances": {
"message": "Piilota enemmän käynnissä olevia instansseja"
},
"app.action-bar.make-primary-instance": {
"message": "Aseta ensisijaiseksi instanssiksi"
},
"app.action-bar.no-instances-running": {
"message": "Ei instansseja käynnissä"
},
"app.action-bar.offline": {
"message": "Offline-tilassa"
},
"app.action-bar.primary-instance": {
"message": "Ensisijainen instanssi"
},
"app.action-bar.show-more-running-instances": {
"message": "Näytä enemmän käynnissä olevia instansseja"
},
"app.action-bar.stop-instance": {
"message": "Pysäytä instanssi"
},
"app.action-bar.view-active-downloads": {
"message": "Näytä aktiiviset lataukset"
},
"app.action-bar.view-instance": {
"message": "Katso intanssia"
},
"app.action-bar.view-logs": {
"message": "Katso lokeja"
},
"app.appearance-settings.advanced-rendering.description": {
"message": "Mahdollistaa edistyneen renderöinnin, kuten sumennus efektit, jotka voivat aiheuttaa suorituskykyongelmia ilman laitteistokiihdytettyä renderöintiä."
},
"app.appearance-settings.advanced-rendering.title": {
"message": "Edistynyt renderointi"
},
"app.appearance-settings.color-theme.description": {
"message": "Valitse haluamasi väriteema Modrinth Appille."
},
"app.appearance-settings.color-theme.title": {
"message": "Väriteema"
},
"app.appearance-settings.default-landing-page.description": {
"message": "Muuta sivua mille laukaisin avautuu."
},
"app.appearance-settings.default-landing-page.home": {
"message": "Koti"
},
"app.appearance-settings.default-landing-page.library": {
"message": "Kirjasto"
},
"app.appearance-settings.default-landing-page.title": {
"message": "Oletus laskeutumissivu"
},
"app.appearance-settings.hide-nametag.description": {
"message": "Kytkee pois päältä nimikyltin pelaajasi päällä skinit sivulla."
},
"app.appearance-settings.hide-nametag.title": {
"message": "Piilota nimikyltti"
},
"app.appearance-settings.jump-back-into-worlds.description": {
"message": "Sisällyttää viimeaikaiset maailmat \"Hyppää takaisin sisään\" osiossa Koti sivulla."
},
"app.appearance-settings.jump-back-into-worlds.title": {
"message": "Hyppää takaisin sisään maailmoihin"
},
"app.appearance-settings.minimize-launcher.description": {
"message": "Pienennä laukaisin kun Minecraft prosessi käynnistyy."
},
"app.appearance-settings.minimize-launcher.title": {
"message": "Piilota käynnistysohjelma"
},
"app.appearance-settings.native-decorations.description": {
"message": "Käytä järjestelmän ikkuna kehystä (Vaatii sovelluksen uudelleen käynnistämisen)."
},
"app.appearance-settings.native-decorations.title": {
"message": "Natiivit koristukset"
},
"app.appearance-settings.select-option": {
"message": "Valitse vaihtoehto"
},
"app.appearance-settings.toggle-sidebar.description": {
"message": "Laittaa päälle mahdollisuuden kytkeä sivupalkkia."
},
"app.appearance-settings.toggle-sidebar.title": {
"message": "Kytke sivupalkki"
},
"app.appearance-settings.unknown-pack-warning.description": {
"message": "Jos yrität asentaa Modrinth-pakettitiedoston (.mrpack), jota ei ole isännöity Modrinthissä, varmistamme, että ymmärrät riskit ennen asennusta."
},
"app.appearance-settings.unknown-pack-warning.title": {
"message": "Varoita minua ennen tuntemattomien modipakettien asentamista"
},
"app.auth-servers.unreachable.body": {
"message": "Minecraftin todennuspalvelimet eivät ehkä ole tällä hetkellä tavoitettavissa. Tarkista internetyhteytesi ja yritä myöhemmin uudelleen."
},
"app.auth-servers.unreachable.header": {
"message": "Todennuspalvelimiin ei saada yhteyttä"
},
"app.browse.add-servers-to-instance": {
"message": "Lisää palvelin instanssiin"
},
"app.browse.add-to-an-instance": {
"message": "Lisää instanssiin"
},
"app.browse.add-to-instance": {
"message": "Lisää instanssiin"
},
@@ -17,12 +122,33 @@
"app.browse.already-added": {
"message": "On jo asennettu"
},
"app.browse.back-to-instance": {
"message": "Takaisin instanssiin"
},
"app.browse.discover-content": {
"message": "Löydä sisältöä"
},
"app.browse.discover-servers": {
"message": "Löydä palvelimia"
},
"app.browse.hide-added-servers": {
"message": "Piilota lisätyt palvelimet"
},
"app.browse.project-type.modpacks": {
"message": "Modipaketit"
},
"app.browse.server-instance-content-warning": {
"message": "Sisällön lisääminen voi rikkoa yhteensopivuuden palvelimelle liittyessä. Kaikki lisätty sisältö katoaa myös kun päivität palvelin instanssin sisällön."
},
"app.browse.server.installing": {
"message": "Asennetaan"
},
"app.creation-modal.installing-modpack.description": {
"message": "{fileName}"
},
"app.creation-modal.installing-modpack.title": {
"message": "Asennetaan modipakettia..."
},
"app.export-modal.description-placeholder": {
"message": "Lisää modipaketin kuvaus..."
},
@@ -32,12 +158,18 @@
"app.export-modal.header": {
"message": "Vie modipaketti"
},
"app.export-modal.include-file-accessibility-label": {
"message": "Sisällytä \"{file}\"?"
},
"app.export-modal.modpack-name-label": {
"message": "Modipaketin nimi"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modipaketin nimi"
},
"app.export-modal.select-files-label": {
"message": "Muuta mitkä tiedostot sisältyvät tähän vientiin"
},
"app.export-modal.version-number-label": {
"message": "Versio numero"
},
@@ -80,6 +212,9 @@
"app.instance.mods.share-text": {
"message": "Tsekkaa projektit joita käytän minun modipaketissani!"
},
"app.instance.mods.share-title": {
"message": "Jaetaan modipaketti sisältöä"
},
"app.instance.mods.successfully-uploaded": {
"message": "Onnistuneesti ladattu"
},
@@ -164,6 +299,15 @@
"app.modal.update-to-play.update-required-description": {
"message": "Pävitys vaaditaan pelataksesi {name}. Päivitä viimeisimpään versioon pelataksesi."
},
"app.project.install-button.already-installed": {
"message": "Tämä projekti on jo asennettu"
},
"app.project.install-context.back-to-browse": {
"message": "Takaisin sisällön löytöön"
},
"app.project.install-context.install-content-to-instance": {
"message": "Asenna sisältöä instanssiin"
},
"app.settings.developer-mode-enabled": {
"message": "Kehittäjätila käytössä."
},
@@ -467,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java ja muisti"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "Mukautetut ympäristö muuttujat"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "Mukautetut Java argumentit"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "Mukautettu Java asennus"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "Mukautettu muistin allokointi"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "Syötä ympäristö muuttujat..."
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "Syötä Java argumentit..."
},
"instance.settings.tabs.java.environment-variables": {
"message": "Ympäristö muuttujat"
},
@@ -482,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "Muisti allokoitu"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/javaan/johtava/polku/"
},
"instance.settings.tabs.window": {
"message": "Ikkuna"
},
@@ -554,6 +719,24 @@
"instance.worlds.world_in_use": {
"message": "Maailma on käytössä"
},
"minecraft-account.add-account": {
"message": "Lisää tili"
},
"minecraft-account.label": {
"message": "Minecraft tili"
},
"minecraft-account.not-signed-in": {
"message": "Ei kirjautuneena sisään"
},
"minecraft-account.remove-account": {
"message": "Poista tili"
},
"minecraft-account.select-account": {
"message": "Valitse tili"
},
"minecraft-account.sign-in": {
"message": "Kirjaudu sisään Minecraftiin"
},
"search.filter.locked.instance": {
"message": "Annettu instanssin toimesta"
},
@@ -577,5 +760,26 @@
},
"search.filter.locked.server-loader.title": {
"message": "Modialusta on palvelimen tarjoama"
},
"unknown-pack-warning-modal.body": {
"message": "Tiedosto tarkistetaan vain jos se on ladattu Modrinthiin, riippumatta tiedoston muodosta (mukaanlukien .mrpack)."
},
"unknown-pack-warning-modal.dont-show-again": {
"message": "Älä näytä tätä varoitusta uudestaan"
},
"unknown-pack-warning-modal.header": {
"message": "Vahvista asennus"
},
"unknown-pack-warning-modal.install-anyway": {
"message": "Asenna jokatapauksessa"
},
"unknown-pack-warning-modal.malware-statement": {
"message": "Haittaohjelmia levitetään usein modipaketti tiedostojen kautta jakamalla niitä alustoilla kuten Discordissa."
},
"unknown-pack-warning-modal.warning.body": {
"message": "Emme löytäneet tätä tiedostoa Modrinthista. Suosittelemme vahvasti että asennat tiedostoja vain lähteistä joihin luotat."
},
"unknown-pack-warning-modal.warning.title": {
"message": "Tuntematon tiedosto varoitus"
}
}
@@ -729,7 +729,7 @@
"message": "Kumpirmahin ang installation"
},
"unknown-pack-warning-modal.install-anyway": {
"message": "I-install parin"
"message": "I-install pa rin"
},
"unknown-pack-warning-modal.malware-statement": {
"message": "Ang malware ay madalas naidadala sa mga modpack files sa pamamagitan ng pag-bigay ng mga ito sa mga platforms kagaya ng Discord."
@@ -1,6 +1,6 @@
{
"app.action-bar.downloading-java": {
"message": "Java version {version} en cours de téléchargement"
"message": "Téléchargement de Java {version} en cours"
},
"app.action-bar.downloads": {
"message": "Téléchargements"
@@ -303,7 +303,7 @@
"message": "Ce projet a déjà été installé"
},
"app.project.install-context.back-to-browse": {
"message": "Retour à la navigation"
"message": "Retour vers la page découvrir"
},
"app.project.install-context.install-content-to-instance": {
"message": "Installer du contenu à l'instance"
+113 -2
View File
@@ -20,15 +20,78 @@
"app.action-bar.primary-instance": {
"message": "Elsődleges profil"
},
"app.action-bar.show-more-running-instances": {
"message": "További futó profilok megjelenítése"
},
"app.action-bar.stop-instance": {
"message": "Profil megállítása"
},
"app.action-bar.view-active-downloads": {
"message": "Aktív letöltések megtekintése"
},
"app.action-bar.view-instance": {
"message": "Profil megtekintése"
},
"app.action-bar.view-logs": {
"message": "Naplók megtekintése"
},
"app.appearance-settings.advanced-rendering.description": {
"message": "Lehetővé teszi olyan speciális megjelenítési effektusok használatát, mint például az elmosódás, amelyek hardveres gyorsítás nélkül teljesítménycsökkenést okozhatnak."
},
"app.appearance-settings.advanced-rendering.title": {
"message": "Fejlett renderelés"
},
"app.appearance-settings.color-theme.description": {
"message": "Válaszd ki a Modrinth Apphoz a kívánt színsémát."
},
"app.appearance-settings.color-theme.title": {
"message": "Téma"
},
"app.appearance-settings.default-landing-page.description": {
"message": "Állítsd be, hogy az indító melyik oldalon nyíljon meg."
},
"app.appearance-settings.default-landing-page.home": {
"message": "Kezdőlap"
},
"app.appearance-settings.default-landing-page.library": {
"message": "Könyvtár"
},
"app.appearance-settings.default-landing-page.title": {
"message": "Alapértelmezett nyitóoldal"
},
"app.appearance-settings.hide-nametag.description": {
"message": "Letiltja a játékosod felett megjelenő névcímkét a Skinek oldalon."
},
"app.appearance-settings.hide-nametag.title": {
"message": "Névcímke eltüntetése"
},
"app.appearance-settings.jump-back-into-worlds.description": {
"message": "A kezdőlap „Folytasd itt” részében a legújabb világok is megtalálhatók."
},
"app.appearance-settings.jump-back-into-worlds.title": {
"message": "„Folytasd itt” a világokat is"
},
"app.appearance-settings.minimize-launcher.description": {
"message": "Minimalizáld az indítót a Minecraft indításakor."
},
"app.appearance-settings.minimize-launcher.title": {
"message": "Indító minimalizálása"
},
"app.appearance-settings.native-decorations.description": {
"message": "A rendszer ablakkeret használata (az alkalmazás újraindítása szükséges)."
},
"app.appearance-settings.native-decorations.title": {
"message": "Rendszer ablakkeret használata"
},
"app.appearance-settings.select-option": {
"message": "Válassz egy lehetőséget"
},
"app.appearance-settings.toggle-sidebar.description": {
"message": "Lehetővé teszi az oldalsáv be- és kikapcsolását."
},
"app.appearance-settings.toggle-sidebar.title": {
"message": "Oldalsáv megjelenítése/elrejtése"
},
"app.appearance-settings.unknown-pack-warning.description": {
"message": "Ha olyan Modrinth Csomagfájlt (.mrpack) próbálsz telepíteni, amely nem a Modrinth szerverén található, a telepítés előtt gondoskodunk arról, hogy tisztában legyél a kockázatokkal."
},
@@ -41,6 +104,12 @@
"app.auth-servers.unreachable.header": {
"message": "Nem lehet elérni a hitelesítési kiszolgálókat"
},
"app.browse.add-servers-to-instance": {
"message": "Szerver hozzáadása a profilhoz"
},
"app.browse.add-to-an-instance": {
"message": "Hozzáadás egy profilhoz"
},
"app.browse.add-to-instance": {
"message": "Hozzáadás a profilhoz"
},
@@ -68,6 +137,9 @@
"app.browse.project-type.modpacks": {
"message": "Modcsomagok"
},
"app.browse.server-instance-content-warning": {
"message": "A tartalom hozzáadása ronthatja a kompatibilitást a szerverhez való csatlakozáskor. A hozzáadott tartalom elveszik, ha frissíted a szerverprofil tartalmát."
},
"app.browse.server.installing": {
"message": "Letöltés..."
},
@@ -86,12 +158,18 @@
"app.export-modal.header": {
"message": "Modcsomag exportálása"
},
"app.export-modal.include-file-accessibility-label": {
"message": "Tartalmaz „{file}” fájlokat?"
},
"app.export-modal.modpack-name-label": {
"message": "A modcsomag neve"
},
"app.export-modal.modpack-name-placeholder": {
"message": "A modcsomag neve"
},
"app.export-modal.select-files-label": {
"message": "Állítsd be, hogy mely fájlok kerüljenek bele az exportba"
},
"app.export-modal.version-number-label": {
"message": "Verziószám"
},
@@ -219,7 +297,10 @@
"message": "Frissítés szükséges"
},
"app.modal.update-to-play.update-required-description": {
"message": "\nFrissítés szükséges ehhez: {name}. Kérk, frissíts a legújabb verzióra a játék elindításához"
"message": "Frissítés szükséges ehhez: {name}. Kérlek, frissíts a legújabb verzióra a játék elindításához."
},
"app.project.install-button.already-installed": {
"message": "Ez a projekt már telepítve van"
},
"app.project.install-context.back-to-browse": {
"message": "Vissza a böngészéshez"
@@ -588,7 +669,7 @@
"message": "Ne mutasd a kezdőlapon"
},
"instance.worlds.game_already_open": {
"message": "A profil már meg van nyitva"
"message": "A profil már el van indítva"
},
"instance.worlds.hardcore": {
"message": "Hardcore mód"
@@ -617,6 +698,24 @@
"instance.worlds.world_in_use": {
"message": "A világ használatban van"
},
"minecraft-account.add-account": {
"message": "Fiók hozzáadása"
},
"minecraft-account.label": {
"message": "Minecraft-fiók"
},
"minecraft-account.not-signed-in": {
"message": "Nem vagy bejelentkezve"
},
"minecraft-account.remove-account": {
"message": "Fiók törlése"
},
"minecraft-account.select-account": {
"message": "Fiók kiválasztása"
},
"minecraft-account.sign-in": {
"message": "Bejelentkezés a Minecraftba"
},
"search.filter.locked.instance": {
"message": "A profil által van megadva"
},
@@ -641,13 +740,25 @@
"search.filter.locked.server-loader.title": {
"message": "A betöltőt a szerver biztosítja"
},
"unknown-pack-warning-modal.body": {
"message": "Egy fájlt csak akkor vizsgálunk meg, ha azt feltöltik a Modrinthra, függetlenül a fájlformátumtól (beleértve a .mrpack formátumot is)."
},
"unknown-pack-warning-modal.dont-show-again": {
"message": "Ne mutasd újra ezt a figyelmeztetést"
},
"unknown-pack-warning-modal.header": {
"message": "Telepítés megerősítése"
},
"unknown-pack-warning-modal.install-anyway": {
"message": "Letöltés mindenképpen"
},
"unknown-pack-warning-modal.malware-statement": {
"message": "A rosszindulatú programokat gyakran modcsomag-fájlokon keresztül terjesztik, például a Discordhoz hasonló platformokon történő megosztás révén."
},
"unknown-pack-warning-modal.warning.body": {
"message": "Ezt a fájlt nem találtuk meg a Modrinthon. Határozottan javasoljuk, hogy kizárólag megbízható forrásokból származó fájlokat telepíts."
},
"unknown-pack-warning-modal.warning.title": {
"message": "Figyelmeztetés ismeretlen fájlról"
}
}
@@ -71,6 +71,9 @@
"app.appearance-settings.select-option": {
"message": "Pilih opsi"
},
"app.appearance-settings.unknown-pack-warning.title": {
"message": "Peringatkan saya sebelum memasang paket mod tidak dikenal"
},
"app.auth-servers.unreachable.body": {
"message": "Server autentikasi Minecraft mungkin sedang tidak tersedia saat ini. Periksa koneksi internet Anda dan coba lagi nanti."
},
@@ -269,6 +272,9 @@
"app.modal.update-to-play.update-required-description": {
"message": "{name} perlu diperbarui sebelum dimainkan. Mohon perbarui ke versi terkini untuk meluncurkan permainan."
},
"app.project.install-context.install-content-to-instance": {
"message": "Pasang konten ke instans"
},
"app.settings.developer-mode-enabled": {
"message": "Mode pengembang dihidupkan."
},
@@ -659,6 +665,21 @@
"instance.worlds.world_in_use": {
"message": "Dunia sedang dimainkan"
},
"minecraft-account.add-account": {
"message": "Tambah akun"
},
"minecraft-account.label": {
"message": "Akun Minecraft"
},
"minecraft-account.not-signed-in": {
"message": "Tidak masuk"
},
"minecraft-account.remove-account": {
"message": "Hapus akun"
},
"minecraft-account.select-account": {
"message": "Pilih akun"
},
"search.filter.locked.instance": {
"message": "Disediakan oleh instans"
},
@@ -682,5 +703,20 @@
},
"search.filter.locked.server-loader.title": {
"message": "Pemuat disediakan oleh server"
},
"unknown-pack-warning-modal.dont-show-again": {
"message": "Jangan tampilkan peringatan ini lagi"
},
"unknown-pack-warning-modal.header": {
"message": "Konfirmasi pemasangan"
},
"unknown-pack-warning-modal.install-anyway": {
"message": "Tetap pasang"
},
"unknown-pack-warning-modal.warning.body": {
"message": "Kami tidak dapat menemukan berkas ini di Modrinth. Kami sangat menyarankan Anda untuk hanya memasang berkas dari sumber-sumber terpercaya."
},
"unknown-pack-warning-modal.warning.title": {
"message": "Peringatan berkas tidak dikenal"
}
}
+24 -3
View File
@@ -84,7 +84,7 @@
"message": "Decorazioni native"
},
"app.appearance-settings.select-option": {
"message": "Scegli una pagina"
"message": "Seleziona"
},
"app.appearance-settings.toggle-sidebar.description": {
"message": "Scegli se mostrare o nascondere la barra laterale."
@@ -93,7 +93,7 @@
"message": "Abilita la barra laterale"
},
"app.appearance-settings.unknown-pack-warning.description": {
"message": "Visti i rischi nell'installare un file Modrinth Pack (.mrpack) non proveniente da Modrinth, mostriamo un avvertimento quando tenti di fare ciò."
"message": "Visti i rischi, apparirà un avviso prima di installare un file Modrinth Pack (.mrpack) non proveniente da Modrinth."
},
"app.appearance-settings.unknown-pack-warning.title": {
"message": "Avvisami se installo pacchetti sconosciuti"
@@ -303,7 +303,7 @@
"message": "Questo progetto è già stato installato"
},
"app.project.install-context.back-to-browse": {
"message": "Torna su esplora"
"message": "Torna a Esplora"
},
"app.project.install-context.install-content-to-instance": {
"message": "Installa il contenuto nell'istanza"
@@ -611,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java e memoria"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "Variabili d'ambiente"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "Argomenti JVM"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "Eseguibile di Java"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "Memoria allocata"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "Inserisci le variabili d'ambiente..."
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "Inserisci gli argomenti JVM..."
},
"instance.settings.tabs.java.environment-variables": {
"message": "Variabili d'ambiente"
},
@@ -626,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "Memoria allocata"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/percorso/di/java"
},
"instance.settings.tabs.window": {
"message": "Finestra"
},
+45 -3
View File
@@ -24,7 +24,7 @@
"message": "실행 중인 인스턴스 보이기"
},
"app.action-bar.stop-instance": {
"message": "인스턴스 중지"
"message": "인스턴스 멈추기"
},
"app.action-bar.view-active-downloads": {
"message": "다운로드 목록 보기"
@@ -104,6 +104,12 @@
"app.auth-servers.unreachable.header": {
"message": "인증 서버에 연결할 수 없습니다"
},
"app.browse.add-servers-to-instance": {
"message": "인스턴스에 서버 추가"
},
"app.browse.add-to-an-instance": {
"message": "인스턴스에 추가"
},
"app.browse.add-to-instance": {
"message": "인스턴스에 추가"
},
@@ -116,6 +122,9 @@
"app.browse.already-added": {
"message": "이미 추가됨"
},
"app.browse.back-to-instance": {
"message": "인스턴스로 돌아가기"
},
"app.browse.discover-content": {
"message": "콘텐츠 탐색하기"
},
@@ -128,6 +137,9 @@
"app.browse.project-type.modpacks": {
"message": "모드팩"
},
"app.browse.server-instance-content-warning": {
"message": "콘텐츠를 추가하면 서버 접속 시 호환이 안 될 수 있습니다. 또한 서버 인스턴스 콘텐츠를 업데이트하면 임의로 추가된 콘텐츠는 모두 손실됩니다."
},
"app.browse.server.installing": {
"message": "설치 중"
},
@@ -180,10 +192,10 @@
"message": "이 모드팩은 이미 <bold>{instanceName}</bold> 인스턴스에 설치되어 있습니다. 정말로 복제하시겠습니까?"
},
"app.instance.modpack-already-installed.create": {
"message": "생성"
"message": "만들기"
},
"app.instance.modpack-already-installed.header": {
"message": "모드팩 이미 설치"
"message": "이미 설치된 모드팩"
},
"app.instance.modpack-already-installed.instance": {
"message": "인스턴스"
@@ -287,6 +299,15 @@
"app.modal.update-to-play.update-required-description": {
"message": "{name}을(를) 플레이하려면 업데이트가 필요합니다. 게임을 실행하려면 최신 버전으로 업데이트해 주세요."
},
"app.project.install-button.already-installed": {
"message": "이미 설치되어 있음"
},
"app.project.install-context.back-to-browse": {
"message": "탐색으로 돌아가기"
},
"app.project.install-context.install-content-to-instance": {
"message": "인스턴스에 콘텐츠 설치"
},
"app.settings.developer-mode-enabled": {
"message": "개발자 모드가 활성화되었습니다."
},
@@ -590,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java 및 메모리"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "사용자 지정 환경 변수"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "사용자 지정 Java 매개변수"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "사용자 지정 Java 설치"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "사용자 지정 메모리 할당"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "환경 변수를 입력하세요..."
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "Java 인수를 입력하세요..."
},
"instance.settings.tabs.java.environment-variables": {
"message": "환경 변수"
},
@@ -605,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "할당된 메모리"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/path/to/java"
},
"instance.settings.tabs.window": {
"message": "창"
},
@@ -302,9 +302,6 @@
"app.project.install-button.already-installed": {
"message": "Projek ini sudah dipasang"
},
"app.project.install-context.back-to-browse": {
"message": "Kembali melayar"
},
"app.project.install-context.install-content-to-instance": {
"message": "Pasang kandungan ke dalam pemasangan"
},
@@ -189,7 +189,7 @@
"message": "Verwijder instantie"
},
"app.instance.modpack-already-installed.body": {
"message": "Deze modpakket is al in de <bold>{instanceName}<bold> instantie geïnstalleerd. Ben je zeker dat je het geen wil dupliceren?"
"message": "Deze modpakket is al in de <bold>{instanceName}</bold> instantie geïnstalleerd. Ben je zeker dat je het geen wil dupliceren?"
},
"app.instance.modpack-already-installed.create": {
"message": "Maak"
@@ -302,9 +302,6 @@
"app.project.install-button.already-installed": {
"message": "Dit project is al geïnstalleerd"
},
"app.project.install-context.back-to-browse": {
"message": "Terug naar browsen"
},
"app.project.install-context.install-content-to-instance": {
"message": "Installeer content naar instantie"
},
+14 -2
View File
@@ -137,6 +137,9 @@
"app.browse.project-type.modpacks": {
"message": "Paczki modów"
},
"app.browse.server-instance-content-warning": {
"message": "Dodawanie zawartości może zepsuć kompatybilność podczas dołączania na serwer. Jakakolwiek dodana zawartość zostanie stracona, gdy zaktualizujesz zawartość instancji serwera."
},
"app.browse.server.installing": {
"message": "Instalowanie"
},
@@ -155,12 +158,18 @@
"app.export-modal.header": {
"message": "Eksportuj paczkę modów"
},
"app.export-modal.include-file-accessibility-label": {
"message": "Dołączyć \"{file}\"?"
},
"app.export-modal.modpack-name-label": {
"message": "Nazwa paczki modów"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Nazwa paczki modów"
},
"app.export-modal.select-files-label": {
"message": "Skonfiguruje jakie pliki zostaną załączone w tym eksporcie"
},
"app.export-modal.version-number-label": {
"message": "Numer wersji"
},
@@ -168,7 +177,7 @@
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Wszystkie dane z Twojej instancji zostaną trwale usunięte, w tym Twoje światy, pliki konfiguracji i wszystkie zainstalowane treści."
"message": "Wszystkie dane z Twojej instancji zostaną trwale usunięte, w tym Twoje światy, pliki konfiguracji i jakakolwiek dodana zawartość."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Tej akcji nie można odwrócić"
@@ -294,7 +303,7 @@
"message": "Ten projekt jest już zainstalowany"
},
"app.project.install-context.back-to-browse": {
"message": "Powrót do przeglądania"
"message": "Powróć do odkrywania"
},
"app.project.install-context.install-content-to-instance": {
"message": "Zainstaluj zasoby do instancji"
@@ -695,6 +704,9 @@
"minecraft-account.label": {
"message": "Konto Minecraft"
},
"minecraft-account.not-signed-in": {
"message": "Nie zalogowano"
},
"minecraft-account.remove-account": {
"message": "Usuń konto"
},
+22 -1
View File
@@ -303,7 +303,7 @@
"message": "Este projeto já foi instalado"
},
"app.project.install-context.back-to-browse": {
"message": "Voltar ao explorar"
"message": "Voltar ao descobrir"
},
"app.project.install-context.install-content-to-instance": {
"message": "Instalar conteúdo para a instância"
@@ -611,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java e memória"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "Variáveis de ambiente personalizadas"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "Argumentos Java personalizados"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "Instalação personalizada do Java"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "Alocação de memória personalizada"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "Insira as variáveis de ambiente..."
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "Insira os argumentos Java..."
},
"instance.settings.tabs.java.environment-variables": {
"message": "Variáveis de ambiente"
},
@@ -626,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "Memória alocada"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/caminho/para/java"
},
"instance.settings.tabs.window": {
"message": "Janela"
},
@@ -1,4 +1,61 @@
{
"app.action-bar.downloading-java": {
"message": "A descarregar a versão do java {version}"
},
"app.action-bar.downloads": {
"message": "Downloads"
},
"app.action-bar.hide-more-running-instances": {
"message": "Esconder mais instâncias a correr"
},
"app.action-bar.make-primary-instance": {
"message": "Transformar na instância principal"
},
"app.action-bar.no-instances-running": {
"message": "Nenhuma instância a correr"
},
"app.action-bar.offline": {
"message": "Offline"
},
"app.action-bar.primary-instance": {
"message": "Instância principal"
},
"app.action-bar.show-more-running-instances": {
"message": "Mostrar mais instâncias a correr"
},
"app.action-bar.stop-instance": {
"message": "Para instância"
},
"app.action-bar.view-active-downloads": {
"message": "Ver instâncias ativas"
},
"app.action-bar.view-instance": {
"message": "Ver instância"
},
"app.action-bar.view-logs": {
"message": "Ver logs"
},
"app.appearance-settings.advanced-rendering.title": {
"message": "Renderização avançada"
},
"app.appearance-settings.color-theme.description": {
"message": "Seleciona a tua cor preferida para a Modrinth App."
},
"app.appearance-settings.color-theme.title": {
"message": "Cor de tema"
},
"app.appearance-settings.default-landing-page.description": {
"message": "Mudar a página em que o launcher abre."
},
"app.appearance-settings.default-landing-page.home": {
"message": "Casa"
},
"app.appearance-settings.default-landing-page.library": {
"message": "Livraria"
},
"app.appearance-settings.default-landing-page.title": {
"message": "Página de carregamento principal"
},
"app.auth-servers.unreachable.body": {
"message": "Os servidores de autenticação do Minecraft poderão estar em baixo de momento. Verifica a tua ligação à internet e tenta novamente mais tarde."
},
+24 -3
View File
@@ -3,7 +3,7 @@
"message": "Скачивание Java {version}"
},
"app.action-bar.downloads": {
"message": "Скачивания"
"message": "Скачивание"
},
"app.action-bar.hide-more-running-instances": {
"message": "Скрыть другие активные сборки"
@@ -360,7 +360,7 @@
"message": "Доступно обновление"
},
"app.update.complete-toast.text": {
"message": "Нажмите здесь, чтобы посмотреть изменения."
"message": "Нажмите, чтобы посмотреть список изменений."
},
"app.update.complete-toast.title": {
"message": "Версия {version} успешно установлена!"
@@ -611,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java и память"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "Пользовательские настройки запуска"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "Пользовательские аргументы Java"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "Пользовательская установка Java"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "Пользовательский объём памяти"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "Введите дополнительные параметры системы..."
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "Введите аргументы Java..."
},
"instance.settings.tabs.java.environment-variables": {
"message": "Переменные среды"
},
@@ -626,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "Выделенная память"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/path/to/java"
},
"instance.settings.tabs.window": {
"message": "Окно"
},
@@ -741,7 +762,7 @@
"message": "Загрузчик управляется сервером"
},
"unknown-pack-warning-modal.body": {
"message": "Файлы любого формата проверены на безопасность, если они загружены на Modrinth (в том числе файлы⠀.mrpack)."
"message": "Файл проверяется только в том случае, если он загружен на Modrinth, независимо от его формата (включая .mrpack)."
},
"unknown-pack-warning-modal.dont-show-again": {
"message": "Больше не предупреждать"
@@ -5,12 +5,57 @@
"app.action-bar.downloads": {
"message": "Nedladdningar"
},
"app.action-bar.hide-more-running-instances": {
"message": "Göm fler pågående instanser"
},
"app.action-bar.make-primary-instance": {
"message": "Gör till primärinstans"
},
"app.action-bar.no-instances-running": {
"message": "Ingen pågående instans"
},
"app.action-bar.offline": {
"message": "Offline"
},
"app.action-bar.primary-instance": {
"message": "Primärinstans"
},
"app.action-bar.show-more-running-instances": {
"message": "Visa fler pågående instanser"
},
"app.action-bar.stop-instance": {
"message": "Avsluta instans"
},
"app.action-bar.view-active-downloads": {
"message": "Visa aktiva nedladdningar"
},
"app.action-bar.view-instance": {
"message": "Visa instans"
},
"app.action-bar.view-logs": {
"message": "Visa loggar"
},
"app.appearance-settings.advanced-rendering.description": {
"message": "Aktiverar avancerad rendering som till exempel oskärpa vilket kan leda till prestandaproblem utan hårdvaruaccelererad rendering."
},
"app.appearance-settings.advanced-rendering.title": {
"message": "Avancerad rendering"
},
"app.appearance-settings.color-theme.description": {
"message": "Välj färgtema för Modrinth-appen."
},
"app.appearance-settings.color-theme.title": {
"message": "Färgtema"
},
"app.appearance-settings.default-landing-page.home": {
"message": "Hem"
},
"app.appearance-settings.default-landing-page.library": {
"message": "Bibliotek"
},
"app.appearance-settings.hide-nametag.title": {
"message": "Dölj namnskylt"
},
"app.auth-servers.unreachable.body": {
"message": "Minecrafts autentiseringsservrar kan vara nere just nu. Kontrollera din internetanslutning och försök igen senare."
},
+94 -37
View File
@@ -6,49 +6,49 @@
"message": "Завантаження"
},
"app.action-bar.hide-more-running-instances": {
"message": "Приховати більше запущених екземплярів"
"message": "Приховати більше запущених профілів"
},
"app.action-bar.make-primary-instance": {
"message": "Зробити основним екземпляром"
"message": "Зробити основним профілем"
},
"app.action-bar.no-instances-running": {
"message": "Немає запущених екземплярів"
"message": "Немає запущених профілів"
},
"app.action-bar.offline": {
"message": "Офлайн"
"message": "Поза мережею"
},
"app.action-bar.primary-instance": {
"message": "Основний екземпляр"
"message": "Основний профіль"
},
"app.action-bar.show-more-running-instances": {
"message": "Показати більше запущених екземплярів"
"message": "Показати більше запущених профілів"
},
"app.action-bar.stop-instance": {
"message": "Зупинити екземпляр"
"message": "Зупинити профіль"
},
"app.action-bar.view-active-downloads": {
"message": "Переглянути активні завантаження"
},
"app.action-bar.view-instance": {
"message": "Переглянути екземпляр"
"message": "Переглянути профіль"
},
"app.action-bar.view-logs": {
"message": "Переглянути журнали"
},
"app.appearance-settings.advanced-rendering.description": {
"message": "Дозволяє розширений рендеринг, такий як ефекти розмиття, які можуть спричиняти проблеми з продуктивністю без апаратно-прискореного рендерингу."
"message": "Дозволяє розширене промальовування, як-от ефекти розмиття, які можуть спричиняти проблеми з продуктивністю без апаратно-прискореного промальовування."
},
"app.appearance-settings.advanced-rendering.title": {
"message": "Розширений рендеринг"
"message": "Розширене промальовування"
},
"app.appearance-settings.color-theme.description": {
"message": "Виберіть бажану колірну тему для програми Modrinth App."
"message": "Виберіть бажану колірну тему для Modrinth App."
},
"app.appearance-settings.color-theme.title": {
"message": "Колірна тема"
},
"app.appearance-settings.default-landing-page.description": {
"message": "Змініть сторінку, на якій відкривається панель запуску."
"message": "Змініть сторінку, на якій відкривається запускач."
},
"app.appearance-settings.default-landing-page.home": {
"message": "Головна"
@@ -57,46 +57,46 @@
"message": "Бібліотека"
},
"app.appearance-settings.default-landing-page.title": {
"message": "Цільова сторінка за замовчуванням"
"message": "Усталена цільова сторінка"
},
"app.appearance-settings.hide-nametag.description": {
"message": "Вимикає іменний бейдж над вашим гравцем на сторінці скінів."
"message": "Вимикає ім над вашим гравцем на сторінці скінів."
},
"app.appearance-settings.hide-nametag.title": {
"message": "Приховати бейдж з іменем"
"message": "Приховати ім'я"
},
"app.appearance-settings.jump-back-into-worlds.description": {
"message": "Включає нещодавні світи в розділі «Повернення» на головній сторінці."
"message": "Уключає нещодавні світи в розділі «Повернутися» на головній сторінці."
},
"app.appearance-settings.jump-back-into-worlds.title": {
"message": "Стрибни назад у світи"
"message": "Повернутися у світи"
},
"app.appearance-settings.minimize-launcher.description": {
"message": "Згорнути лаунчер під час запуску процесу Minecraft."
"message": "Згортає запускач під час запуску процесу Minecraft."
},
"app.appearance-settings.minimize-launcher.title": {
"message": "Згорнути панель запуску"
"message": "Мінімізувати запускач"
},
"app.appearance-settings.native-decorations.description": {
"message": "Використовувати рамку системного вікна (потрібно перезапустити програму)."
},
"app.appearance-settings.native-decorations.title": {
"message": "Рідні прикраси"
"message": "Системне оформлення"
},
"app.appearance-settings.select-option": {
"message": "Виберіть опцію"
},
"app.appearance-settings.toggle-sidebar.description": {
"message": "Вмикає можливість перемикання бічної панелі."
"message": "Умикає можливість перемикання бокової панелі."
},
"app.appearance-settings.toggle-sidebar.title": {
"message": "Перемикання бічної панелі"
"message": "Перемикання бокової панелі"
},
"app.appearance-settings.unknown-pack-warning.description": {
"message": "Якщо ви спробуєте встановити файл пакета Modrinth (.mrpack), який не розміщено на Modrinth, ми переконаємося, що ви розумієте ризики, перш ніж встановлювати його."
"message": "Якщо ви спробуєте встановити файл пакета Modrinth (.mrpack), який не розміщено на Modrinth, ми переконаємося, що ви розумієте ризики, перш ніж установлювати його."
},
"app.appearance-settings.unknown-pack-warning.title": {
"message": "Попереджати мене перед встановленням невідомих модпаків"
"message": "Попереджати мене перед установленням невідомих збірок"
},
"app.auth-servers.unreachable.body": {
"message": "Сервери автентифікації Minecraft можуть зараз не працювати. Перевірте з’єднання з інтернетом та спробуйте пізніше."
@@ -104,6 +104,12 @@
"app.auth-servers.unreachable.header": {
"message": "Не вдається зв’язатися зі серверами автентифікації"
},
"app.browse.add-servers-to-instance": {
"message": "Додавання сервера до профілю"
},
"app.browse.add-to-an-instance": {
"message": "Додати до профілю"
},
"app.browse.add-to-instance": {
"message": "Додати до профілю"
},
@@ -116,6 +122,9 @@
"app.browse.already-added": {
"message": "Уже додано"
},
"app.browse.back-to-instance": {
"message": "Назад до профілю"
},
"app.browse.discover-content": {
"message": "Дослідити вміст"
},
@@ -123,22 +132,25 @@
"message": "Дослідити сервера"
},
"app.browse.hide-added-servers": {
"message": "Скрити наявні сервери"
"message": "Сховати наявні сервери"
},
"app.browse.project-type.modpacks": {
"message": "Модпаки"
"message": "Збірки"
},
"app.browse.server-instance-content-warning": {
"message": "Додавання вмісту може порушити сумісність при приєднанні до сервера. Усі додані матеріали також будуть утрачені під час оновлення вмісту профілю сервера."
},
"app.browse.server.installing": {
"message": "Встановлення"
"message": "Установлення"
},
"app.creation-modal.installing-modpack.description": {
"message": "{fileName}"
},
"app.creation-modal.installing-modpack.title": {
"message": "Встановлення модпаку..."
"message": "Установлення збірки…"
},
"app.export-modal.description-placeholder": {
"message": "Уведіть опис збірки..."
"message": "Уведіть опис збірки"
},
"app.export-modal.export-button": {
"message": "Експортувати"
@@ -146,12 +158,18 @@
"app.export-modal.header": {
"message": "Експортувати збірку"
},
"app.export-modal.include-file-accessibility-label": {
"message": "Уключити «{file}»?"
},
"app.export-modal.modpack-name-label": {
"message": "Назва збірки"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Назва збірки"
},
"app.export-modal.select-files-label": {
"message": "Змініть файли, які додані до експорту"
},
"app.export-modal.version-number-label": {
"message": "Номер версії"
},
@@ -159,7 +177,7 @@
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Усі дані вашого профілю будуть видалені назавжди, включно з вашими світами, конфігураціями та усім встановленим контентом."
"message": "Усі дані вашого профілю будуть видалені назавжди, включно з вашими світами, налаштуваннями та всім установленим умістом."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Ця дія є незворотною"
@@ -204,7 +222,7 @@
"message": "Додати сервер"
},
"app.instance.worlds.browse-servers": {
"message": "Переглянути сервера"
"message": "Переглянути сервери"
},
"app.instance.worlds.delete-world-description": {
"message": "«{name}» буде **назавжди видалено** й у вас не буде можливости відновлення."
@@ -213,7 +231,7 @@
"message": "Ви впевнені, що хочете назавжди видалити цей світ?"
},
"app.instance.worlds.filter-modded": {
"message": "Модифікований"
"message": "Модифіковано"
},
"app.instance.worlds.filter-offline": {
"message": "Поза мережею"
@@ -222,7 +240,7 @@
"message": "У мережі"
},
"app.instance.worlds.filter-vanilla": {
"message": "Ванільний"
"message": "Стандартний"
},
"app.instance.worlds.no-worlds-description": {
"message": "Додати сервер або переглянути, щоб почати"
@@ -240,7 +258,7 @@
"message": "Ви впевнені, що хочете видалити «{name}»?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Пошук {count} світів..."
"message": "Пошук {count} світів"
},
"app.instance.worlds.this-server": {
"message": "цей сервер"
@@ -281,6 +299,15 @@
"app.modal.update-to-play.update-required-description": {
"message": "«{name}» потребує оновлення, щоб грати. Будь ласка, оновіть гру до останньої версії, щоб запустити її."
},
"app.project.install-button.already-installed": {
"message": "Проєкт уже встановлено"
},
"app.project.install-context.back-to-browse": {
"message": "Повернутися до дослідження"
},
"app.project.install-context.install-content-to-instance": {
"message": "Установити вміст до профілю"
},
"app.settings.developer-mode-enabled": {
"message": "Увімкнено режим розробника."
},
@@ -420,7 +447,7 @@
"message": "Немає друзів, які збігаються з «{query}»"
},
"friends.search-friends-placeholder": {
"message": "Пошук друзів..."
"message": "Пошук друзів"
},
"friends.section.heading": {
"message": "{title} — {count}"
@@ -468,7 +495,7 @@
"message": "Додавання файлів ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Зберегти як..."
"message": "Зберегти як"
},
"instance.server-modal.address": {
"message": "Адреса"
@@ -584,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java та пам’ять"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "Власні змінні середовища"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "Власні аргументи Java"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "Власна інсталяція Java"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "Власний розподіл пам'яті"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "Уведіть змінні середовища…"
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "Уведіть аргументи Java…"
},
"instance.settings.tabs.java.environment-variables": {
"message": "Змінні середовища"
},
@@ -599,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "Виділена пам’ять"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/шлях/до/java"
},
"instance.settings.tabs.window": {
"message": "Вікно"
},
@@ -674,12 +722,21 @@
"minecraft-account.add-account": {
"message": "Додати обліковий запис"
},
"minecraft-account.label": {
"message": "Майнкрафт аккаунт"
},
"minecraft-account.not-signed-in": {
"message": "Не ввійдено в систему"
},
"minecraft-account.remove-account": {
"message": "Видалити обліковий запис"
},
"minecraft-account.select-account": {
"message": "Обрати обліковий запис"
},
"minecraft-account.sign-in": {
"message": "Увійти в Майнкрафт"
},
"search.filter.locked.instance": {
"message": "Надано профілем"
},
@@ -717,7 +774,7 @@
"message": "Усе одно інсталювати"
},
"unknown-pack-warning-modal.malware-statement": {
"message": "Шкідливе програмне забезпечення часто поширюють через файли модпаків, які публікуються на таких платформах, як Discord."
"message": "Шкідливе програмне забезпечення часто поширюють через файли збірок, які публікуються на таких платформах, як Discord."
},
"unknown-pack-warning-modal.warning.body": {
"message": "Ми не змогли знайти цей файл на Modrinth. Ми рекомендуємо встановлювати файли лише з тих джерел яким ви довіряєте."
@@ -1,10 +1,115 @@
{
"app.action-bar.downloading-java": {
"message": "Đang tải xuống Java {version}"
},
"app.action-bar.downloads": {
"message": "Tải xuống"
},
"app.action-bar.hide-more-running-instances": {
"message": "Đóng các phiên bản đang chạy"
},
"app.action-bar.make-primary-instance": {
"message": "Đặt làm bản instance chính"
},
"app.action-bar.no-instances-running": {
"message": "Không có phiên bản nào đang chạy"
},
"app.action-bar.offline": {
"message": "Ngoại tuyến"
},
"app.action-bar.primary-instance": {
"message": "Bản instance chính"
},
"app.action-bar.show-more-running-instances": {
"message": "Hiện thêm các phiên bản đang chạy"
},
"app.action-bar.stop-instance": {
"message": "Dừng instance"
},
"app.action-bar.view-active-downloads": {
"message": "Xem các lượt tải xuống"
},
"app.action-bar.view-instance": {
"message": "Xem phiên bản"
},
"app.action-bar.view-logs": {
"message": "Xem logs"
},
"app.appearance-settings.advanced-rendering.description": {
"message": "Kích hoạt các tính năng dựng hình nâng cao như hiệu ứng làm mờ, có thể gây giảm hiệu năng nếu không có chế độ tăng tốc phần cứng."
},
"app.appearance-settings.advanced-rendering.title": {
"message": "Dựng hình nâng cao"
},
"app.appearance-settings.color-theme.description": {
"message": "Chọn màu nền ưu thích của bạn cho Modrinth App."
},
"app.appearance-settings.color-theme.title": {
"message": "Màu chủ đề"
},
"app.appearance-settings.default-landing-page.description": {
"message": "Thay đổi trang hiển thị khi khởi chạy launcher."
},
"app.appearance-settings.default-landing-page.home": {
"message": "Trang chủ"
},
"app.appearance-settings.default-landing-page.library": {
"message": "Thư viện"
},
"app.appearance-settings.default-landing-page.title": {
"message": "Trang mặc định"
},
"app.appearance-settings.hide-nametag.description": {
"message": "Tắt hiển thị thẻ tên phía trên người chơi ở trang skin."
},
"app.appearance-settings.hide-nametag.title": {
"message": "Ẩn thẻ tên"
},
"app.appearance-settings.jump-back-into-worlds.description": {
"message": "Hiển thị các thế giới gần đây trong mục \"Tiếp tục chơi\" ở Trang chủ."
},
"app.appearance-settings.jump-back-into-worlds.title": {
"message": "Tiếp tục chơi"
},
"app.appearance-settings.minimize-launcher.description": {
"message": "Thu nhỏ launcher khi game Minecraft bắt đầu chạy."
},
"app.appearance-settings.minimize-launcher.title": {
"message": "Thu nhỏ launcher"
},
"app.appearance-settings.native-decorations.description": {
"message": "Sử dụng khung cửa sổ hệ thống (yêu cầu khởi động lại ứng dụng)."
},
"app.appearance-settings.native-decorations.title": {
"message": "Giao diện cửa sổ hệ thống"
},
"app.appearance-settings.select-option": {
"message": "Chọn một tuỳ chọn"
},
"app.appearance-settings.toggle-sidebar.description": {
"message": "Bật tính năng ẩn hiển thị thanh menu bên."
},
"app.appearance-settings.toggle-sidebar.title": {
"message": "Ẩn/hiện thanh bên"
},
"app.appearance-settings.unknown-pack-warning.description": {
"message": "Nếu bạn cố gắng cài đặt tệp Modrinth Pack (.mrpack) không được lưu trữ trên máy chủ Modrinth, chúng tôi sẽ đảm bảo bạn hiểu rõ các rủi ro trước khi cài đặt."
},
"app.appearance-settings.unknown-pack-warning.title": {
"message": "Cảnh báo tôi trước khi cài đặt các modpacks không rõ nguồn gốc"
},
"app.auth-servers.unreachable.body": {
"message": "Máy chủ xác thực của Minecraft có thể đang bị sập. Hãy kiểm tra kết nối Internet của bạn và thử lại sau."
},
"app.auth-servers.unreachable.header": {
"message": "Không thể kết nối đến máy chủ xác thực"
},
"app.browse.add-servers-to-instance": {
"message": "Thêm máy chủ vào phiên bản"
},
"app.browse.add-to-an-instance": {
"message": "Thêm vào phiên bản"
},
"app.browse.add-to-instance": {
"message": "Thêm vào hồ sơ"
},
@@ -17,12 +122,33 @@
"app.browse.already-added": {
"message": "Đã được thêm"
},
"app.browse.back-to-instance": {
"message": "Quay lại phiên bản"
},
"app.browse.discover-content": {
"message": "Khám phá nội dung"
},
"app.browse.discover-servers": {
"message": "Khám phá máy chủ"
},
"app.browse.hide-added-servers": {
"message": "Ẩn các server đã thêm"
},
"app.browse.project-type.modpacks": {
"message": "Modpack"
},
"app.browse.server-instance-content-warning": {
"message": "Thêm nội dung có thể gây lỗi tương thích khi tham gia máy chủ. Bất kỳ nội dung nào được thêm vào cũng sẽ bị mất khi bạn cập nhật nội dung của phiên bản máy chủ."
},
"app.browse.server.installing": {
"message": "Đang cài đặt"
},
"app.creation-modal.installing-modpack.description": {
"message": "{fileName}"
},
"app.creation-modal.installing-modpack.title": {
"message": "Đang cài đặt modpack..."
},
"app.export-modal.description-placeholder": {
"message": "Thêm miêu tả cho gói modpack..."
},
@@ -32,12 +158,18 @@
"app.export-modal.header": {
"message": "Xuất modpack"
},
"app.export-modal.include-file-accessibility-label": {
"message": "Bao gồm \"{file}\"?"
},
"app.export-modal.modpack-name-label": {
"message": "Tên modpack"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Tên modpack"
},
"app.export-modal.select-files-label": {
"message": "Cấu hình các tệp nào được bao gồm trong quá trình xuất phiên bản này"
},
"app.export-modal.version-number-label": {
"message": "Phiên bản"
},
@@ -167,6 +299,15 @@
"app.modal.update-to-play.update-required-description": {
"message": "Bạn cần cập nhật {name} để có thể chơi. Vui lòng cập nhật lên bản mới nhất để khởi chạy trò chơi."
},
"app.project.install-button.already-installed": {
"message": "Dự án này đã được cài đặt"
},
"app.project.install-context.back-to-browse": {
"message": "Quay lại trang Khám Phá"
},
"app.project.install-context.install-content-to-instance": {
"message": "Cài đặt nội dung vào phiên bản"
},
"app.settings.developer-mode-enabled": {
"message": "Chế độ nhà phát triển đã được bật."
},
@@ -470,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java và bộ nhớ"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "Tùy chọn biến môi trường"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "Tùy chỉnh tham số Java"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "Tùy chỉnh phiên bản cài đặt Java"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "Tùy chỉnh phân bổ bộ nhớ"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "Nhập biến môi trường..."
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "Nhập tham số Java..."
},
"instance.settings.tabs.java.environment-variables": {
"message": "Biến môi trường"
},
@@ -485,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "Bộ nhớ phân bổ"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/đường_dẫn/tới/java"
},
"instance.settings.tabs.window": {
"message": "Cửa sổ"
},
@@ -557,6 +719,24 @@
"instance.worlds.world_in_use": {
"message": "Thế giới đang mở"
},
"minecraft-account.add-account": {
"message": "Thêm tài khoản"
},
"minecraft-account.label": {
"message": "Tài khoản Minecraft"
},
"minecraft-account.not-signed-in": {
"message": "Chưa đăng nhập"
},
"minecraft-account.remove-account": {
"message": "Xoá tài khoản"
},
"minecraft-account.select-account": {
"message": "Chọn tài khoản"
},
"minecraft-account.sign-in": {
"message": "Đăng nhập vào Minecraft"
},
"search.filter.locked.instance": {
"message": "Được cung cấp bởi phiên bản"
},
@@ -580,5 +760,26 @@
},
"search.filter.locked.server-loader.title": {
"message": "Loader được cung cấp bởi máy chủ"
},
"unknown-pack-warning-modal.body": {
"message": "Tệp chỉ được xem xét nếu nó được tải lên Modrinth, bất kể định dạng tệp của nó là gì (bao gồm cả .mrpack)."
},
"unknown-pack-warning-modal.dont-show-again": {
"message": "Đừng hiển thị cảnh báo này nữa"
},
"unknown-pack-warning-modal.header": {
"message": "Xác nhận cài đặt"
},
"unknown-pack-warning-modal.install-anyway": {
"message": "Tiếp tục cài đặt"
},
"unknown-pack-warning-modal.malware-statement": {
"message": "Phần mềm độc hại thường được phát tán thông qua các tệp modpack bằng cách chia sẻ chúng trên các nền tảng như Discord."
},
"unknown-pack-warning-modal.warning.body": {
"message": "Chúng tôi không tìm thấy tập tin này trên Modrinth. Chúng tôi đặc biệt khuyên bạn chỉ nên cài đặt các tập tin từ các nguồn đáng tin cậy."
},
"unknown-pack-warning-modal.warning.title": {
"message": "Cảnh báo tệp không xác định"
}
}
@@ -63,7 +63,7 @@
"message": "在皮肤页面中禁用你玩家头顶上的名牌。"
},
"app.appearance-settings.hide-nametag.title": {
"message": "隐藏名"
"message": "隐藏名称标签"
},
"app.appearance-settings.jump-back-into-worlds.description": {
"message": "在主页的“快速回到”部分包含最近的世界。"
@@ -303,7 +303,7 @@
"message": "此项目已安装"
},
"app.project.install-context.back-to-browse": {
"message": "返回浏览器"
"message": "返回发现页"
},
"app.project.install-context.install-content-to-instance": {
"message": "将内容安装到实例中"
@@ -567,7 +567,7 @@
"message": "启动 Hooks"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "自定义启动Hooks"
"message": "自定义启动 Hooks"
},
"instance.settings.tabs.hooks.description": {
"message": "Hooks允许高级用户在启动游戏前后运行特定的系统命令。"
+26 -5
View File
@@ -147,10 +147,10 @@
"message": "{fileName}"
},
"app.creation-modal.installing-modpack.title": {
"message": "正在安裝模組包..."
"message": "正在安裝模組包……"
},
"app.export-modal.description-placeholder": {
"message": "輸入模組包描述..."
"message": "輸入模組包描述……"
},
"app.export-modal.export-button": {
"message": "匯出"
@@ -252,13 +252,13 @@
"message": "「{name}」將從你的清單中移除(包含遊戲內),且無法還原。"
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "「{name}」({address}) 將從你的清單中移除包含遊戲內),且無法還原。"
"message": "「{name}」({address}) 將從你的清單中移除(包含遊戲內),且無法還原。"
},
"app.instance.worlds.remove-server-title": {
"message": "確定要移除「{name}」嗎?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "搜尋 {count} 個世界..."
"message": "搜尋 {count} 個世界……"
},
"app.instance.worlds.this-server": {
"message": "這個伺服器"
@@ -303,7 +303,7 @@
"message": "這個專案已安裝"
},
"app.project.install-context.back-to-browse": {
"message": "回到瀏覽頁面"
"message": "返回瀏覽"
},
"app.project.install-context.install-content-to-instance": {
"message": "將內容安裝至實例"
@@ -611,6 +611,24 @@
"instance.settings.tabs.java": {
"message": "Java 和記憶體"
},
"instance.settings.tabs.java.custom-environment-variables": {
"message": "自訂環境變數"
},
"instance.settings.tabs.java.custom-java-arguments": {
"message": "自訂 Java 參數"
},
"instance.settings.tabs.java.custom-java-installation": {
"message": "自訂 Java 安裝"
},
"instance.settings.tabs.java.custom-memory-allocation": {
"message": "自訂記憶體分配"
},
"instance.settings.tabs.java.enter-environment-variables": {
"message": "輸入環境變數……"
},
"instance.settings.tabs.java.enter-java-arguments": {
"message": "輸入 Java 參數……"
},
"instance.settings.tabs.java.environment-variables": {
"message": "環境變數"
},
@@ -626,6 +644,9 @@
"instance.settings.tabs.java.java-memory": {
"message": "記憶體配置"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/path/to/java"
},
"instance.settings.tabs.window": {
"message": "視窗"
},
+44 -10
View File
@@ -218,7 +218,11 @@
:key="instance.path"
>
<template v-if="Component">
<Suspense :key="instance.path">
<Suspense
:key="instance.path"
@pending="subpagePending = true"
@resolve="subpagePending = false"
>
<component
:is="Component"
:instance="instance"
@@ -228,6 +232,7 @@
:installed="instance.install_stage !== 'installed'"
:is-server-instance="isServerInstance"
:open-settings="() => settingsModal?.show(1)"
v-bind="contentSubpageProps"
@play="updatePlayState"
@stop="() => stopInstance('InstanceSubpage')"
></component>
@@ -295,6 +300,7 @@ import {
ServerPing,
ServerRecentPlays,
ServerRegion,
useLoadingBarToken,
} from '@modrinth/ui'
import { useQueryClient } from '@tanstack/vue-query'
import { convertFileSrc } from '@tauri-apps/api/core'
@@ -312,6 +318,7 @@ import { useInstanceConsole } from '@/composables/useInstanceConsole'
import { trackEvent } from '@/helpers/analytics'
import { get_project_v3 } from '@/helpers/cache.js'
import { process_listener, profile_listener } from '@/helpers/events'
import { type InstanceContentData, loadInstanceContentData } from '@/helpers/instance-content'
import { get_by_profile_path } from '@/helpers/process'
import { finish_install, get, get_full_path, kill, run } from '@/helpers/profile'
import type { GameInstance } from '@/helpers/types'
@@ -331,6 +338,7 @@ const route = useRoute()
const router = useRouter()
const breadcrumbs = useBreadcrumbs()
const contentSubpageRouteNames = new Set(['Mods', 'ModsFilter'])
const offline = ref(!navigator.onLine)
window.addEventListener('offline', () => {
@@ -341,12 +349,16 @@ window.addEventListener('online', () => {
})
const instance = ref<GameInstance>()
const preloadedContent = ref<InstanceContentData | null>(null)
const playing = ref(false)
const loading = ref(false)
const subpagePending = ref(false)
const stopping = ref(false)
const exportModal = ref<InstanceType<typeof ExportModal>>()
const updateToPlayModal = ref<InstanceType<typeof UpdateToPlayModal>>()
useLoadingBarToken(subpagePending)
const isServerInstance = ref(false)
const linkedProjectV3 = ref<Labrinth.Projects.v3.Project>()
const selected = ref<unknown[]>([])
@@ -361,36 +373,55 @@ const playersOnline = ref<number | undefined>(undefined)
const ping = ref<number | undefined>(undefined)
const loadingServerPing = ref(false)
function isContentSubpageRoute(routeName = route.name) {
return typeof routeName === 'string' && contentSubpageRouteNames.has(routeName)
}
async function fetchInstance() {
isServerInstance.value = false
linkedProjectV3.value = undefined
preloadedContent.value = null
ping.value = undefined
playersOnline.value = undefined
loadingServerPing.value = false
instance.value = await get(route.params.id as string).catch(handleError)
const nextInstance = await get(route.params.id as string).catch(handleError)
let nextLinkedProjectV3: Labrinth.Projects.v3.Project | undefined
let nextIsServerInstance = false
if (!offline.value && instance.value?.linked_data && instance.value.linked_data.project_id) {
const contentPreloadPromise =
nextInstance && isContentSubpageRoute()
? loadInstanceContentData(nextInstance.path, undefined, handleError)
: Promise.resolve(null)
if (!offline.value && nextInstance?.linked_data && nextInstance.linked_data.project_id) {
try {
linkedProjectV3.value = await get_project_v3(
instance.value.linked_data.project_id,
nextLinkedProjectV3 = await get_project_v3(
nextInstance.linked_data.project_id,
'must_revalidate',
)
if (linkedProjectV3.value?.minecraft_server != null) {
isServerInstance.value = true
if (nextLinkedProjectV3?.minecraft_server != null) {
nextIsServerInstance = true
}
} catch (error) {
handleError(error as Error)
}
}
const nextPreloadedContent = await contentPreloadPromise
instance.value = nextInstance ?? undefined
linkedProjectV3.value = nextLinkedProjectV3
isServerInstance.value = nextIsServerInstance
preloadedContent.value = nextPreloadedContent
fetchDeferredData()
if (instance.value) {
if (nextInstance) {
queryClient.prefetchQuery({
queryKey: ['worlds', instance.value.path],
queryFn: () => refreshWorlds(instance.value!.path),
queryKey: ['worlds', nextInstance.path],
queryFn: () => refreshWorlds(nextInstance.path),
staleTime: 30_000,
})
}
@@ -448,6 +479,9 @@ const renderMode = computed<'scroll' | 'fixed'>(() =>
route.meta.renderMode === 'fixed' ? 'fixed' : 'scroll',
)
const isFixedRender = computed(() => renderMode.value === 'fixed')
const contentSubpageProps = computed(() =>
isContentSubpageRoute() ? { preloadedContent: preloadedContent.value } : {},
)
const tabs = computed(() => [
{
@@ -77,7 +77,7 @@ function buildLogList(rawLogs) {
log.filename !== 'latest_stdout.log' &&
log.filename !== 'latest_stdout' &&
log.filename !== 'launcher_log.txt' &&
log.stdout !== '' &&
(log.output == null || log.output !== '') &&
(log.filename.includes('.log') || log.filename.endsWith('.txt')),
)
.map((log) => ({
+400 -109
View File
@@ -13,6 +13,7 @@
:modpack-name="linkedModpackProject?.title"
:modpack-icon-url="linkedModpackProject?.icon_url ?? undefined"
:enable-toggle="!props.isServerInstance"
:busy="isBulkOperating"
:get-overflow-options="getOverflowOptions"
:switch-version="handleSwitchVersion"
@update:enabled="handleModpackContentToggle"
@@ -87,12 +88,12 @@ import {
ReadyTransition,
useDebugLogger,
useVIntl,
versionChangesGameVersion,
} from '@modrinth/ui'
import { getCurrentWebview } from '@tauri-apps/api/webview'
import { open } from '@tauri-apps/plugin-dialog'
import { openUrl } from '@tauri-apps/plugin-opener'
import { useDebounceFn } from '@vueuse/core'
import { computed, nextTick, onUnmounted, ref, watch } from 'vue'
import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
import { useRouter } from 'vue-router'
import ExportModal from '@/components/ui/ExportModal.vue'
@@ -100,22 +101,20 @@ import ShareModalWrapper from '@/components/ui/modal/ShareModalWrapper.vue'
import { trackEvent } from '@/helpers/analytics'
import { get_project_versions, get_version } from '@/helpers/cache.js'
import { profile_listener } from '@/helpers/events.js'
import { type InstanceContentData, loadInstanceContentData } from '@/helpers/instance-content'
import {
add_project_from_path,
add_project_from_version,
duplicate,
edit,
get,
get_content_items,
get_linked_modpack_content,
get_linked_modpack_info,
list,
remove_project,
toggle_disable_project,
update_managed_modrinth_version,
update_project,
} from '@/helpers/profile'
import { get_categories } from '@/helpers/tags.js'
import type { CacheBehaviour, GameInstance } from '@/helpers/types'
import { highlightModInProfile } from '@/helpers/utils.js'
import { injectContentInstall } from '@/providers/content-install'
@@ -160,6 +159,7 @@ const props = defineProps<{
instance: GameInstance
isServerInstance?: boolean
openSettings?: () => void
preloadedContent?: InstanceContentData | null
}>()
const loading = ref(true)
@@ -212,6 +212,7 @@ const contentUpdaterModal = ref<InstanceType<typeof ContentUpdaterModal> | null>
const modpackContentModal = ref<InstanceType<typeof ModpackContentModal> | null>()
const modpackUpdateConfirmModal = ref<InstanceType<typeof ConfirmModpackUpdateModal> | null>()
// TODO: Extract content operation and updater modal state into composables; this page currently owns file mutations, dependency installs, busy flags, and version selection flow.
const updatingProject = ref<ContentItem | null>(null)
const updatingProjectVersions = ref<Labrinth.Versions.v2.Version[]>([])
const loadingVersions = ref(false)
@@ -219,6 +220,82 @@ const loadingChangelog = ref(false)
const updatingModpack = ref(false)
const pendingModpackUpdateVersion = ref<Labrinth.Versions.v2.Version | null>(null)
const isModpackUpdateDowngrade = ref(false)
const activeContentOperationKeys = ref(new Set<string>())
let activeContentOperationCount = 0
let updateRequestId = 0
const activeUpdateRequestId = ref(0)
function fileNameFromPath(path: string) {
return path.split('/').pop() ?? path
}
function getContentItemId(item: ContentItem | null | undefined) {
return item?.file_path ?? item?.file_name ?? item?.id ?? ''
}
function getContentOperationKeys(item: ContentItem) {
return [getContentItemId(item), item.file_path, item.file_name].filter(
(key): key is string => !!key,
)
}
function hasContentOperation(item: ContentItem) {
const keys = getContentOperationKeys(item)
return keys.some((key) => activeContentOperationKeys.value.has(key))
}
function setContentItemBusy(item: ContentItem, busy: boolean, originalFileName = item.file_name) {
item.installing = busy
modpackContentModal.value?.updateItem(originalFileName, {
installing: busy,
disabled: busy,
})
if (item.file_name !== originalFileName) {
modpackContentModal.value?.updateItem(item.file_name, {
installing: busy,
disabled: busy,
})
}
}
function beginContentOperation(item: ContentItem) {
if (hasContentOperation(item)) return null
const keys = getContentOperationKeys(item)
activeContentOperationKeys.value = new Set([...activeContentOperationKeys.value, ...keys])
activeContentOperationCount++
isBulkOperating.value = true
setContentItemBusy(item, true)
return { keys, originalFileName: item.file_name }
}
function finishContentOperation(
item: ContentItem,
operation: { keys: string[]; originalFileName: string },
) {
const nextKeys = new Set(activeContentOperationKeys.value)
for (const key of operation.keys) {
nextKeys.delete(key)
}
activeContentOperationKeys.value = nextKeys
activeContentOperationCount = Math.max(0, activeContentOperationCount - 1)
setContentItemBusy(item, false, operation.originalFileName)
if (activeContentOperationCount === 0) {
isBulkOperating.value = false
}
}
function beginUpdateRequest() {
updateRequestId++
activeUpdateRequestId.value = updateRequestId
return updateRequestId
}
function isActiveUpdateRequest(requestId: number) {
return activeUpdateRequestId.value === requestId
}
async function handleBrowseContent() {
if (!props.instance) return
@@ -265,9 +342,21 @@ async function handleUploadFiles() {
}
async function toggleDisableMod(mod: ContentItem) {
if (!mod.file_path) return
const operation = beginContentOperation(mod)
if (!operation) return
try {
mod.file_path = await toggle_disable_project(props.instance.path, mod.file_path!)
const newPath = await toggle_disable_project(props.instance.path, mod.file_path)
const newFileName = fileNameFromPath(newPath)
mod.file_path = newPath
mod.file_name = newFileName
mod.enabled = !mod.enabled
modpackContentModal.value?.updateItem(operation.originalFileName, {
file_path: newPath,
file_name: newFileName,
enabled: mod.enabled,
})
trackEvent('InstanceProjectDisable', {
loader: props.instance.loader,
@@ -279,33 +368,48 @@ async function toggleDisableMod(mod: ContentItem) {
})
} catch (err) {
handleError(err as Error)
} finally {
finishContentOperation(mod, operation)
}
}
const toggleDisableDebounced = useDebounceFn(toggleDisableMod, 20)
const toggleDisableDebounced = toggleDisableMod
async function removeMod(mod: ContentItem) {
await remove_project(props.instance.path, mod.file_path!).catch(handleError)
projects.value = projects.value.filter((x) => mod.file_path !== x.file_path)
if (!mod.file_path) return
const operation = beginContentOperation(mod)
if (!operation) return
trackEvent('InstanceProjectRemove', {
loader: props.instance.loader,
game_version: props.instance.game_version,
id: mod.project?.id,
name: mod.project?.title ?? mod.file_name,
project_type: mod.project_type,
})
try {
const removedPath = mod.file_path
await remove_project(props.instance.path, removedPath)
projects.value = projects.value.filter((x) => removedPath !== x.file_path)
trackEvent('InstanceProjectRemove', {
loader: props.instance.loader,
game_version: props.instance.game_version,
id: mod.project?.id,
name: mod.project?.title ?? mod.file_name,
project_type: mod.project_type,
})
} catch (err) {
handleError(err as Error)
} finally {
finishContentOperation(mod, operation)
}
}
async function updateProject(mod: ContentItem) {
try {
const newPath = await update_project(props.instance.path, mod.file_path!)
mod.file_path = newPath
if (!mod.file_path) return
const operation = beginContentOperation(mod)
if (!operation) return
if (mod.update_version_id) {
const versionData = await get_version(mod.update_version_id, 'must_revalidate').catch(
handleError,
)
try {
const updateVersionId = mod.update_version_id
await update_project(props.instance.path, mod.file_path)
if (updateVersionId) {
const versionData = await get_version(updateVersionId, 'must_revalidate').catch(handleError)
if (versionData) {
const profile = await get(props.instance.path).catch(handleError)
@@ -316,12 +420,6 @@ async function updateProject(mod: ContentItem) {
}
}
mod.has_update = false
if (mod.version && mod.update_version_id) {
mod.version.id = mod.update_version_id
}
mod.update_version_id = null
trackEvent('InstanceProjectUpdate', {
loader: props.instance.loader,
game_version: props.instance.game_version,
@@ -331,39 +429,65 @@ async function updateProject(mod: ContentItem) {
})
} catch (err) {
handleError(err as Error)
} finally {
await refreshContentState('must_revalidate')
finishContentOperation(mod, operation)
}
}
async function switchProjectVersion(mod: ContentItem, version: Labrinth.Versions.v2.Version) {
isBulkOperating.value = true
mod.installing = true
if (mod.version) {
mod.version.id = version.id
mod.version.version_number = version.version_number
}
if (!mod.file_path) return
const operation = beginContentOperation(mod)
if (!operation) return
const oldPath = mod.file_path
const wasDisabled = mod.enabled === false || oldPath.endsWith('.disabled')
let newPath: string | null = null
let shouldRemoveNewOnError = false
try {
await remove_project(props.instance.path, mod.file_path!)
const newPath = await add_project_from_version(props.instance.path, version.id, 'standalone')
newPath = await add_project_from_version(props.instance.path, version.id, 'update')
shouldRemoveNewOnError = newPath !== oldPath
if (wasDisabled) {
newPath = await toggle_disable_project(props.instance.path, newPath)
}
const profile = await get(props.instance.path).catch(handleError)
if (profile) {
await installVersionDependencies(profile, version, 'update').catch(handleError)
}
mod.file_path = newPath
shouldRemoveNewOnError = false
if (newPath !== oldPath) {
await remove_project(props.instance.path, oldPath)
}
trackEvent('InstanceProjectUpdate', {
loader: props.instance.loader,
game_version: props.instance.game_version,
id: mod.project?.id,
name: mod.project?.title ?? mod.file_name,
project_type: mod.project_type,
})
} catch (err) {
if (shouldRemoveNewOnError && newPath && newPath !== oldPath) {
await remove_project(props.instance.path, newPath).catch(() => {})
}
handleError(err as Error)
} finally {
mod.installing = false
isBulkOperating.value = false
await initProjects()
await refreshContentState('must_revalidate')
finishContentOperation(mod, operation)
}
}
async function handleUpdate(id: string) {
const item = projects.value.find((p) => p.id === id)
const item = projects.value.find((p) => getContentItemId(p) === id)
if (!item?.has_update || !item.project?.id || !item.version?.id) return
const requestId = beginUpdateRequest()
const itemId = getContentItemId(item)
debug('handleUpdate triggered', {
fileName: item.file_name,
projectType: item.project_type,
@@ -384,12 +508,48 @@ async function handleUpdate(id: string) {
await nextTick()
contentUpdaterModal.value?.show(item.update_version_id ?? undefined)
const initialVersionId = item.update_version_id ?? undefined
debug('handleUpdate: opening content updater modal', {
type: 'content',
initialVersionId,
item: {
id: item.id,
fileName: item.file_name,
projectType: item.project_type,
projectId: item.project.id,
projectTitle: item.project.title,
currentVersionId: item.version.id,
currentVersionNumber: item.version.version_number,
updateVersionId: item.update_version_id,
},
instance: {
path: props.instance.path,
name: props.instance.name,
gameVersion: props.instance.game_version,
loader: props.instance.loader,
linkedData: props.instance.linked_data,
},
modalStateBeforeFetch: {
updatingModpack: updatingModpack.value,
updatingProjectId: updatingProject.value?.id,
updatingProjectVersions: updatingProjectVersions.value.map((version) => ({
id: version.id,
versionNumber: version.version_number,
gameVersions: version.game_versions,
loaders: version.loaders,
datePublished: version.date_published,
})),
},
})
contentUpdaterModal.value?.show(initialVersionId)
const versions = (await get_project_versions(item.project.id).catch((e) => {
return handleError(e)
})) as Labrinth.Versions.v2.Version[] | null
if (!isActiveUpdateRequest(requestId) || getContentItemId(updatingProject.value) !== itemId)
return
loadingVersions.value = false
if (!versions) {
@@ -414,6 +574,25 @@ async function handleUpdate(id: string) {
versions.sort(
(a, b) => new Date(b.date_published).getTime() - new Date(a.date_published).getTime(),
)
const preselectedVersion =
versions.find((version) => version.id === initialVersionId) ?? versions[0] ?? null
debug('handleUpdate: resolved content updater preselection', {
type: 'content',
initialVersionId,
foundInitialVersion: versions.some((version) => version.id === initialVersionId),
preselectedVersion: preselectedVersion
? {
id: preselectedVersion.id,
versionNumber: preselectedVersion.version_number,
gameVersions: preselectedVersion.game_versions,
loaders: preselectedVersion.loaders,
datePublished: preselectedVersion.date_published,
}
: null,
versionCount: versions.length,
currentVersionId: item.version.id,
updateVersionId: item.update_version_id,
})
updatingProjectVersions.value = versions
}
@@ -421,6 +600,9 @@ async function handleUpdate(id: string) {
async function handleSwitchVersion(item: ContentItem) {
if (!item.project?.id || !item.version?.id) return
const requestId = beginUpdateRequest()
const itemId = getContentItemId(item)
updatingModpack.value = false
updatingProject.value = item
updatingProjectVersions.value = []
@@ -435,6 +617,9 @@ async function handleSwitchVersion(item: ContentItem) {
return handleError(e)
})) as Labrinth.Versions.v2.Version[] | null
if (!isActiveUpdateRequest(requestId) || getContentItemId(updatingProject.value) !== itemId)
return
loadingVersions.value = false
if (!versions) return
@@ -468,9 +653,28 @@ async function handleModpackContent() {
}
}
async function refreshModpackContentItems(cacheBehaviour?: CacheBehaviour) {
if (!props.instance?.path) return
const contentItems = await get_linked_modpack_content(props.instance.path, cacheBehaviour).catch(
handleError,
)
if (contentItems) {
modpackContentModal.value?.setItems(contentItems)
}
}
async function refreshContentState(cacheBehaviour?: CacheBehaviour) {
await initProjects(cacheBehaviour)
await refreshModpackContentItems(cacheBehaviour)
}
async function handleModpackUpdate() {
if (!props.instance?.linked_data?.project_id) return
const requestId = beginUpdateRequest()
updatingModpack.value = true
updatingProject.value = null
updatingProjectVersions.value = []
@@ -479,14 +683,42 @@ async function handleModpackUpdate() {
await nextTick()
contentUpdaterModal.value?.show(
linkedModpackUpdateVersionId.value ?? props.instance?.linked_data?.version_id ?? undefined,
)
const initialVersionId =
linkedModpackUpdateVersionId.value ?? props.instance?.linked_data?.version_id ?? undefined
debug('handleModpackUpdate: opening modpack updater modal', {
type: 'modpack',
initialVersionId,
linkedModpackUpdateVersionId: linkedModpackUpdateVersionId.value,
linkedModpackProject: linkedModpackProject.value,
linkedModpackVersion: linkedModpackVersion.value,
linkedModpackHasUpdate: linkedModpackHasUpdate.value,
instance: {
path: props.instance.path,
name: props.instance.name,
gameVersion: props.instance.game_version,
loader: props.instance.loader,
linkedData: props.instance.linked_data,
},
modalStateBeforeFetch: {
updatingModpack: updatingModpack.value,
updatingProjectId: updatingProject.value?.id,
updatingProjectVersions: updatingProjectVersions.value.map((version) => ({
id: version.id,
versionNumber: version.version_number,
gameVersions: version.game_versions,
loaders: version.loaders,
datePublished: version.date_published,
})),
},
})
contentUpdaterModal.value?.show(initialVersionId)
const versions = (await get_project_versions(props.instance.linked_data.project_id).catch(
handleError,
)) as Labrinth.Versions.v2.Version[] | null
if (!isActiveUpdateRequest(requestId) || !updatingModpack.value) return
loadingVersions.value = false
if (!versions) return
@@ -494,6 +726,25 @@ async function handleModpackUpdate() {
versions.sort(
(a, b) => new Date(b.date_published).getTime() - new Date(a.date_published).getTime(),
)
const preselectedVersion =
versions.find((version) => version.id === initialVersionId) ?? versions[0] ?? null
debug('handleModpackUpdate: resolved modpack updater preselection', {
type: 'modpack',
initialVersionId,
foundInitialVersion: versions.some((version) => version.id === initialVersionId),
preselectedVersion: preselectedVersion
? {
id: preselectedVersion.id,
versionNumber: preselectedVersion.version_number,
gameVersions: preselectedVersion.game_versions,
loaders: preselectedVersion.loaders,
datePublished: preselectedVersion.date_published,
}
: null,
versionCount: versions.length,
linkedModpackUpdateVersionId: linkedModpackUpdateVersionId.value,
currentLinkedVersionId: props.instance.linked_data.version_id,
})
updatingProjectVersions.value = versions
}
@@ -502,10 +753,12 @@ async function fetchAndSpliceVersion(
versionId: string,
cacheBehaviour?: Parameters<typeof get_version>[1],
onError?: (err: unknown) => void,
requestId = activeUpdateRequestId.value,
) {
const fullVersion = (await get_version(versionId, cacheBehaviour).catch(
onError ?? (() => null),
)) as Labrinth.Versions.v2.Version | null
if (!isActiveUpdateRequest(requestId)) return
if (!fullVersion) return
const index = updatingProjectVersions.value.findIndex((v) => v.id === versionId)
if (index !== -1) {
@@ -517,17 +770,26 @@ async function fetchAndSpliceVersion(
async function handleVersionSelect(version: Labrinth.Versions.v2.Version) {
if (version.changelog != null) return
const requestId = activeUpdateRequestId.value
loadingChangelog.value = true
await fetchAndSpliceVersion(version.id, 'must_revalidate', handleError as (err: unknown) => void)
loadingChangelog.value = false
await fetchAndSpliceVersion(
version.id,
'must_revalidate',
handleError as (err: unknown) => void,
requestId,
)
if (isActiveUpdateRequest(requestId)) {
loadingChangelog.value = false
}
}
async function handleVersionHover(version: Labrinth.Versions.v2.Version) {
if (version.changelog != null) return
await fetchAndSpliceVersion(version.id)
await fetchAndSpliceVersion(version.id, undefined, undefined, activeUpdateRequestId.value)
}
function resetUpdateState() {
activeUpdateRequestId.value = 0
updatingModpack.value = false
updatingProject.value = null
updatingProjectVersions.value = []
@@ -535,13 +797,23 @@ function resetUpdateState() {
loadingChangelog.value = false
}
function handleModpackUpdateRequest(selectedVersion: Labrinth.Versions.v2.Version) {
async function handleModpackUpdateRequest(selectedVersion: Labrinth.Versions.v2.Version) {
pendingModpackUpdateVersion.value = selectedVersion
const currentVersionId = props.instance?.linked_data?.version_id
const currentVersion = updatingProjectVersions.value.find((v) => v.id === currentVersionId)
isModpackUpdateDowngrade.value = currentVersion
? new Date(selectedVersion.date_published) < new Date(currentVersion.date_published)
: false
const shouldShowWarning =
isModpackUpdateDowngrade.value ||
versionChangesGameVersion(selectedVersion, props.instance.game_version)
if (!shouldShowWarning) {
await handleModpackUpdateConfirm()
return
}
modpackUpdateConfirmModal.value?.show()
}
@@ -551,6 +823,7 @@ async function handleModpackUpdateConfirm() {
const version = pendingModpackUpdateVersion.value
pendingModpackUpdateVersion.value = null
contentUpdaterModal.value?.hide()
isModpackUpdating.value = true
try {
await update_managed_modrinth_version(props.instance.path, version.id)
@@ -574,7 +847,7 @@ async function handleModalUpdate(
pendingModpackUpdateVersion.value = selectedVersion
await handleModpackUpdateConfirm()
} else {
handleModpackUpdateRequest(selectedVersion)
await handleModpackUpdateRequest(selectedVersion)
}
} else if (updatingProject.value) {
const mod = updatingProject.value
@@ -662,51 +935,31 @@ function getOverflowOptions(item: ContentItem): OverflowMenuOption[] {
async function initProjects(cacheBehaviour?: CacheBehaviour) {
if (!props.instance) return
const [contentItems, modpackInfo, allCategories] = await Promise.all([
get_content_items(props.instance.path, cacheBehaviour).catch(handleError),
get_linked_modpack_info(props.instance.path, cacheBehaviour).catch(handleError),
get_categories().catch(handleError),
])
const contentData = await loadInstanceContentData(
props.instance.path,
cacheBehaviour,
handleError,
)
applyContentData(contentData)
}
if (!contentItems) {
function applyContentData(contentData: InstanceContentData) {
if (contentData.path !== props.instance.path) return false
if (!contentData.contentItems) {
loading.value = false
return
return true
}
projects.value = contentItems
projects.value = contentData.contentItems
if (modpackInfo) {
linkedModpackProject.value = {
...modpackInfo.project,
slug: modpackInfo.project.slug ?? modpackInfo.project.id,
icon_url: modpackInfo.project.icon_url ?? undefined,
}
linkedModpackVersion.value = {
...modpackInfo.version,
date_published: modpackInfo.version.date_published.toString(),
}
linkedModpackOwner.value = modpackInfo.owner
? {
...modpackInfo.owner,
avatar_url: modpackInfo.owner.avatar_url ?? undefined,
}
: null
linkedModpackHasUpdate.value = modpackInfo.has_update
linkedModpackUpdateVersionId.value = modpackInfo.update_version_id
if (allCategories && modpackInfo.project.categories) {
const seen = new Set<string>()
linkedModpackCategories.value = allCategories.filter((cat: { name: string }) => {
if (modpackInfo.project.categories.includes(cat.name) && !seen.has(cat.name)) {
seen.add(cat.name)
return true
}
return false
})
} else {
linkedModpackCategories.value = []
}
if (contentData.modpack) {
linkedModpackProject.value = contentData.modpack.project
linkedModpackVersion.value = contentData.modpack.version
linkedModpackOwner.value = contentData.modpack.owner
linkedModpackCategories.value = contentData.modpack.categories
linkedModpackHasUpdate.value = contentData.modpack.hasUpdate
linkedModpackUpdateVersionId.value = contentData.modpack.updateVersionId
} else {
linkedModpackProject.value = null
linkedModpackVersion.value = null
@@ -717,6 +970,7 @@ async function initProjects(cacheBehaviour?: CacheBehaviour) {
}
loading.value = false
return true
}
provideAppBackup({
@@ -809,8 +1063,9 @@ provideContentManager({
showContentHint,
dismissContentHint,
shareItems: handleShareItems,
getItemId: getContentItemId,
mapToTableItem: (item: ContentItem) => ({
id: item.id,
id: getContentItemId(item),
project: item.project ?? {
id: item.file_name,
slug: null,
@@ -844,10 +1099,22 @@ provideContentManager({
filterPersistKey: props.instance.path,
})
await initProjects()
type UnlistenFn = () => void
const initialContentReady = loadInitialContent()
void initialContentReady.then(restoreModpackContentModalState).catch(handleError)
function loadInitialContent() {
if (props.preloadedContent && applyContentData(props.preloadedContent)) {
return Promise.resolve()
}
return initProjects()
}
async function restoreModpackContentModalState() {
if (!savedModalState) return
// Restore modpack content modal state if returning via back navigation
if (savedModalState) {
const stateToRestore = savedModalState
savedModalState = null
await nextTick()
@@ -860,18 +1127,32 @@ const removeBeforeEach = router.beforeEach(() => {
savedModalState = state ?? null
})
const unlisten = await getCurrentWebview().onDragDropEvent(async (event) => {
if (event.payload.type !== 'drop' || !props.instance) return
let isUnmounted = false
let unlistenDragDrop: UnlistenFn | null = null
let unlistenProfiles: UnlistenFn | null = null
for (const file of event.payload.paths) {
if (file.endsWith('.mrpack')) continue
await add_project_from_path(props.instance.path, file).catch(handleError)
}
await initProjects()
})
onMounted(() => {
void getCurrentWebview()
.onDragDropEvent(async (event) => {
if (event.payload.type !== 'drop' || !props.instance) return
const unlistenProfiles = await profile_listener(
async (event: { event: string; profile_path_id: string }) => {
for (const file of event.payload.paths) {
if (file.endsWith('.mrpack')) continue
await add_project_from_path(props.instance.path, file).catch(handleError)
}
await initProjects()
})
.then((unlisten) => {
if (isUnmounted) {
unlisten()
return
}
unlistenDragDrop = unlisten
})
.catch(handleError)
void profile_listener(async (event: { event: string; profile_path_id: string }) => {
if (
props.instance &&
event.profile_path_id === props.instance.path &&
@@ -881,8 +1162,17 @@ const unlistenProfiles = await profile_listener(
) {
await initProjects()
}
},
)
})
.then((unlisten) => {
if (isUnmounted) {
unlisten()
return
}
unlistenProfiles = unlisten
})
.catch(handleError)
})
watch(
() => props.instance?.install_stage,
@@ -905,8 +1195,9 @@ watch(
)
onUnmounted(() => {
isUnmounted = true
removeBeforeEach()
unlisten()
unlistenProfiles()
unlistenDragDrop?.()
unlistenProfiles?.()
})
</script>
@@ -8,6 +8,7 @@ export interface InstanceSettingsContext {
offline?: boolean
isMinecraftServer: Ref<boolean>
onUnlinked: () => void
closeModal?: () => void
}
export const [injectInstanceSettings, provideInstanceSettings] =
@@ -17,6 +17,7 @@ import {
writePendingServerContentInstallBaseline,
writeStoredServerInstallQueue,
} from '@modrinth/ui'
import { useQueryClient } from '@tanstack/vue-query'
import { computed, type ComputedRef, nextTick, type Ref, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
@@ -208,6 +209,7 @@ export function createServerInstallContent(opts: {
const router = useRouter()
const client = injectModrinthClient()
const { handleError } = injectNotificationManager()
const queryClient = useQueryClient()
const serverIdQuery = computed(() => readQueryString(route.query.sid))
const worldIdQuery = computed(() => readQueryString(route.query.wid))
@@ -471,6 +473,9 @@ export function createServerInstallContent(opts: {
...serverContentInstallKeys.value,
...result.flushedPlans.map((plan) => plan.projectId),
])
if (result.flushedPlans.length > 0) {
await queryClient.invalidateQueries({ queryKey: ['content', 'list', 'v1', serverId] })
}
return true
} finally {
@@ -491,6 +496,7 @@ export function createServerInstallContent(opts: {
const plans = new Map(queuedServerInstalls.value)
if (sid && wid) {
writeStoredServerInstallQueue(sid, wid, plans)
writePendingServerContentInstallBaseline(sid, wid, serverContentInstallKeys.value)
addPendingServerContentInstalls(sid, wid, getQueuedInstallPlaceholderFallbacks(plans))
void getQueuedInstallPlaceholders(client, plans)
+1
View File
@@ -19,6 +19,7 @@
"types": ["vite/client"],
"paths": {
"@modrinth/api-client": ["../../packages/api-client/src/index.ts"],
"@/*": ["./src/*"]
}
},
+5
View File
@@ -8,6 +8,7 @@ import tauriConf from '../app/tauri.conf.json'
const projectRootDir = resolve(__dirname)
const appLibEnvDir = resolve(projectRootDir, '../../packages/app-lib')
const apiClientSource = resolve(projectRootDir, '../../packages/api-client/src/index.ts')
// Load .env from app-lib manually instead of using Vite's envDir, which would auto-load .env.local and override values
const envFilePath = resolve(appLibEnvDir, '.env')
@@ -37,6 +38,10 @@ export default defineConfig({
},
resolve: {
alias: [
{
find: '@modrinth/api-client',
replacement: apiClientSource,
},
{
find: '@',
replacement: resolve(projectRootDir, 'src'),
+13
View File
@@ -51,8 +51,21 @@ tauri-build = { workspace = true, features = ["codegen"] }
[target.'cfg(target_os = "linux")'.dependencies]
tauri-plugin-updater = { workspace = true, optional = true }
[target.'cfg(target_os = "macos")'.dependencies]
core-foundation.workspace = true
core-graphics.workspace = true
objc2-app-kit = { workspace = true, features = [
"NSWindow",
] }
[target.'cfg(windows)'.dependencies]
webview2-com.workspace = true
windows = { workspace = true, features = [
"Win32_Foundation",
"Win32_Graphics_Dwm",
"Win32_Graphics_Gdi",
"Win32_UI_WindowsAndMessaging",
] }
windows-core.workspace = true
[features]
+118 -16
View File
@@ -11,11 +11,14 @@ use tokio::sync::RwLock;
pub struct AdsState {
pub shown: bool,
pub modal_shown: bool,
pub occluded: bool,
pub last_click: Option<Instant>,
pub malicious_origins: HashSet<String>,
}
const AD_LINK: &str = "https://modrinth.com/wrapper/app-ads-cookie";
#[cfg(any(windows, target_os = "macos"))]
pub(super) const OCCLUDED_AREA_THRESHOLD: f64 = 0.5;
#[cfg(not(target_os = "linux"))]
const ADS_USER_AGENT: &str = concat!(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ",
@@ -60,8 +63,8 @@ fn configure_ads_cookie_settings(
core_webview2: &webview2_com::Microsoft::Web::WebView2::Win32::ICoreWebView2,
) {
use webview2_com::Microsoft::Web::WebView2::Win32::{
COREWEBVIEW2_TRACKING_PREVENTION_LEVEL_NONE, ICoreWebView2,
ICoreWebView2_13, ICoreWebView2Profile3,
COREWEBVIEW2_TRACKING_PREVENTION_LEVEL_NONE, ICoreWebView2_13,
ICoreWebView2Profile3,
};
use windows_core::Interface;
@@ -91,10 +94,12 @@ fn configure_ads_cookie_settings(
}
}
fn set_webview_visible<R: Runtime>(
webview: &tauri::Webview<R>,
_visible: bool,
) {
fn set_webview_visible<R: Runtime>(webview: &tauri::Webview<R>, visible: bool) {
#[cfg(not(any(windows, target_os = "macos")))]
{
_ = visible;
}
webview
.with_webview(
#[allow(unused_variables)]
@@ -102,11 +107,18 @@ fn set_webview_visible<R: Runtime>(
#[cfg(windows)]
{
let controller = wv.controller();
unsafe { controller.SetIsVisible(_visible) }.ok();
unsafe { controller.SetIsVisible(visible) }.ok();
}
},
)
.ok();
#[cfg(target_os = "macos")]
if visible {
webview.show().ok();
} else {
webview.hide().ok();
}
}
fn set_webview_visible_for_window<R: Runtime>(
@@ -119,7 +131,76 @@ fn set_webview_visible_for_window<R: Runtime>(
.and_then(|window| window.is_minimized().ok())
.unwrap_or(false);
set_webview_visible(webview, visible && !is_minimized);
let is_occluded = app
.state::<RwLock<AdsState>>()
.try_read()
.map(|state| state.occluded)
.unwrap_or(false);
set_webview_visible(webview, visible && !is_minimized && !is_occluded);
}
#[cfg(any(windows, target_os = "macos"))]
fn compute_ads_webview_occlusion<R: Runtime>(
app: &tauri::AppHandle<R>,
) -> Option<bool> {
let main_window = app.get_window("main")?;
let webviews = app.webviews();
let webview = webviews.get("ads-window")?;
#[cfg(target_os = "macos")]
{
let position = webview.position().ok()?;
let size = webview.size().ok()?;
Some(
crate::api::ads_occlusion_macos::is_ads_webview_occluded(
&main_window,
position.x,
position.y,
size.width,
size.height,
)
.unwrap_or(false),
)
}
#[cfg(windows)]
{
let position = webview.position().ok()?;
let size = webview.size().ok()?;
let hwnd = main_window.hwnd().ok()?;
Some(crate::api::ads_occlusion_windows::is_ads_webview_occluded(
hwnd,
position.x,
position.y,
size.width,
size.height,
))
}
}
#[cfg(any(windows, target_os = "macos"))]
async fn sync_ads_occlusion<R: Runtime>(app: &tauri::AppHandle<R>) {
let Some(occluded) = compute_ads_webview_occlusion(app) else {
return;
};
let state = app.state::<RwLock<AdsState>>();
let mut state = state.write().await;
if state.occluded == occluded {
return;
}
state.occluded = occluded;
let visible = state.shown && !state.modal_shown;
drop(state);
if let Some(webview) = app.webviews().get("ads-window") {
set_webview_visible_for_window(app, webview, visible);
}
}
fn sync_webview_visibility_for_main_window<R: Runtime>(
@@ -140,7 +221,7 @@ fn sync_webview_visibility_for_main_window<R: Runtime>(
false
} else {
match app.state::<RwLock<AdsState>>().try_read() {
Ok(state) => state.shown && !state.modal_shown,
Ok(state) => state.shown && !state.modal_shown && !state.occluded,
Err(_) => false,
}
};
@@ -173,20 +254,28 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
app.manage(RwLock::new(AdsState {
shown: true,
modal_shown: false,
occluded: false,
last_click: None,
malicious_origins: HashSet::new(),
}));
// We refresh the ads window every 5 minutes to mitigate memory leak issues.
// While this loop doesn't include explicit checks to see if the window is still
// visible when we refresh, the Aditude wrapper will not make any ad requests
// unless Chromium reports the page as visible. The refresh does not reset the
// visibility state.
// We refresh the ads window periodically to mitigate memory leak issues.
// Skip refreshes when app state has hidden the ads WebView. The refresh does
// not reset the visibility state.
let refresh_app = app.clone();
tauri::async_runtime::spawn(async move {
loop {
if let Some(webview) =
refresh_app.webviews().get_mut("ads-window")
let should_refresh = refresh_app
.state::<RwLock<AdsState>>()
.try_read()
.map(|state| {
state.shown && !state.modal_shown && !state.occluded
})
.unwrap_or(false);
if should_refresh
&& let Some(webview) =
refresh_app.webviews().get_mut("ads-window")
{
let _ = webview.navigate(AD_LINK.parse().unwrap());
}
@@ -224,6 +313,19 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
});
}
#[cfg(any(windows, target_os = "macos"))]
{
let app_handle = app.clone();
tauri::async_runtime::spawn(async move {
loop {
sync_ads_occlusion(&app_handle).await;
tokio::time::sleep(Duration::from_millis(200)).await;
}
});
}
Ok(())
})
.invoke_handler(tauri::generate_handler![
+236
View File
@@ -0,0 +1,236 @@
use std::ptr::NonNull;
use core_foundation::array::CFArray;
use core_foundation::base::{CFType, TCFType};
use core_foundation::dictionary::CFDictionary;
use core_foundation::number::CFNumber;
use core_foundation::string::CFString;
use core_graphics::display::CGDisplay;
use core_graphics::geometry::{CGPoint, CGRect, CGSize};
use core_graphics::window::{
CGWindowID, kCGWindowAlpha, kCGWindowBounds, kCGWindowLayer,
kCGWindowListExcludeDesktopElements,
kCGWindowListOptionOnScreenAboveWindow, kCGWindowListOptionOnScreenOnly,
kCGWindowNumber, kCGWindowOwnerName, kCGWindowOwnerPID,
};
use objc2_app_kit::NSWindow;
pub fn is_ads_webview_occluded<R: tauri::Runtime>(
main_window: &tauri::Window<R>,
ad_x: i32,
ad_y: i32,
ad_width: u32,
ad_height: u32,
) -> Option<bool> {
let scale_factor = main_window.scale_factor().ok()?;
let maybe_ns_window = main_window.ns_window().ok()?;
let ns_window = NonNull::new(maybe_ns_window)?.cast::<NSWindow>();
let ns_window = unsafe { ns_window.as_ref() };
let window_number = ns_window.windowNumber();
let main_window_id = if window_number > 0 {
window_number as CGWindowID
} else {
return None;
};
let window_infos = CGDisplay::window_list_info(
kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements,
None,
)?;
let window_infos = unsafe {
CFArray::<CFDictionary<CFString, CFType>>::wrap_under_get_rule(
window_infos.as_concrete_TypeRef(),
)
};
let main_window_rect = window_infos
.iter()
.find(|window_info| window_id(window_info) == Some(main_window_id))
.and_then(|window_info| window_rect(&window_info))?;
let ad_rect = ad_rect_from_main_window(
&main_window_rect,
ad_x,
ad_y,
ad_width,
ad_height,
scale_factor,
);
if is_empty_rect(&ad_rect) {
return None;
}
let ad_area = rect_area(&ad_rect);
if ad_area == 0.0 {
return None;
}
let app_process_id = std::process::id() as i32;
let windows_above_main = CGDisplay::window_list_info(
kCGWindowListOptionOnScreenAboveWindow
| kCGWindowListExcludeDesktopElements,
Some(main_window_id),
)?;
let windows_above_main = unsafe {
CFArray::<CFDictionary<CFString, CFType>>::wrap_under_get_rule(
windows_above_main.as_concrete_TypeRef(),
)
};
let mut occluded_area = 0.0;
for window_info in windows_above_main.iter() {
if window_id(&window_info) == Some(main_window_id) {
continue;
}
if window_process_id(&window_info) == Some(app_process_id) {
continue;
}
let owner_name = window_owner_name(&window_info);
if owner_name.as_deref().is_some_and(is_system_window_owner) {
continue;
}
let layer = window_layer(&window_info);
if layer != Some(0) {
continue;
}
let alpha = window_alpha(&window_info);
if alpha.is_some_and(|alpha| alpha <= 0.0) {
continue;
}
let Some(rect) = window_rect(&window_info) else {
continue;
};
let Some(intersection) = intersect_rects(&ad_rect, &rect) else {
continue;
};
occluded_area += rect_area(&intersection);
let occluded_ratio = occluded_area / ad_area;
if occluded_ratio >= super::ads::OCCLUDED_AREA_THRESHOLD {
return Some(true);
}
}
Some(false)
}
fn ad_rect_from_main_window(
main_window_rect: &CGRect,
x: i32,
y: i32,
width: u32,
height: u32,
scale_factor: f64,
) -> CGRect {
let scale_factor = if scale_factor > 0.0 {
scale_factor
} else {
1.0
};
CGRect::new(
&CGPoint::new(
main_window_rect.origin.x + x as f64 / scale_factor,
main_window_rect.origin.y + y as f64 / scale_factor,
),
&CGSize::new(width as f64 / scale_factor, height as f64 / scale_factor),
)
}
fn window_id(
window_info: &CFDictionary<CFString, CFType>,
) -> Option<CGWindowID> {
number_value(window_info, unsafe { kCGWindowNumber })
.and_then(|value| u32::try_from(value).ok())
}
fn window_process_id(
window_info: &CFDictionary<CFString, CFType>,
) -> Option<i32> {
number_value(window_info, unsafe { kCGWindowOwnerPID })
.and_then(|value| i32::try_from(value).ok())
}
fn window_layer(window_info: &CFDictionary<CFString, CFType>) -> Option<i32> {
number_value(window_info, unsafe { kCGWindowLayer })
.and_then(|value| i32::try_from(value).ok())
}
fn window_alpha(window_info: &CFDictionary<CFString, CFType>) -> Option<f64> {
let key = unsafe { CFString::wrap_under_get_rule(kCGWindowAlpha) };
window_info.find(&key)?.downcast::<CFNumber>()?.to_f64()
}
fn window_owner_name(
window_info: &CFDictionary<CFString, CFType>,
) -> Option<String> {
let key = unsafe { CFString::wrap_under_get_rule(kCGWindowOwnerName) };
Some(window_info.find(&key)?.downcast::<CFString>()?.to_string())
}
fn is_system_window_owner(owner_name: &str) -> bool {
matches!(owner_name, "WindowManager")
}
fn number_value(
window_info: &CFDictionary<CFString, CFType>,
key: core_foundation::string::CFStringRef,
) -> Option<i64> {
let key = unsafe { CFString::wrap_under_get_rule(key) };
window_info.find(&key)?.downcast::<CFNumber>()?.to_i64()
}
fn window_rect(window_info: &CFDictionary<CFString, CFType>) -> Option<CGRect> {
let key = unsafe { CFString::wrap_under_get_rule(kCGWindowBounds) };
let bounds = window_info.find(&key)?.downcast::<CFDictionary>()?;
let rect = CGRect::from_dict_representation(&bounds)?;
if is_empty_rect(&rect) {
None
} else {
Some(rect)
}
}
fn is_empty_rect(rect: &CGRect) -> bool {
rect.size.width <= 0.0 || rect.size.height <= 0.0
}
fn rect_area(rect: &CGRect) -> f64 {
if is_empty_rect(rect) {
return 0.0;
}
rect.size.width * rect.size.height
}
fn intersect_rects(a: &CGRect, b: &CGRect) -> Option<CGRect> {
let left = a.origin.x.max(b.origin.x);
let top = a.origin.y.max(b.origin.y);
let right = (a.origin.x + a.size.width).min(b.origin.x + b.size.width);
let bottom = (a.origin.y + a.size.height).min(b.origin.y + b.size.height);
let rect = CGRect::new(
&CGPoint::new(left, top),
&CGSize::new(right - left, bottom - top),
);
if is_empty_rect(&rect) {
None
} else {
Some(rect)
}
}
+191
View File
@@ -0,0 +1,191 @@
use windows::Win32::Foundation::{HWND, POINT, RECT};
use windows::Win32::Graphics::Dwm::{
DWMWA_CLOAKED, DWMWA_EXTENDED_FRAME_BOUNDS, DwmGetWindowAttribute,
};
use windows::Win32::Graphics::Gdi::ClientToScreen;
use windows::Win32::UI::WindowsAndMessaging::{
GA_ROOT, GW_HWNDNEXT, GetAncestor, GetTopWindow, GetWindow, GetWindowRect,
GetWindowThreadProcessId, IsIconic, IsWindowVisible,
};
pub fn is_ads_webview_occluded(
main_hwnd: HWND,
x: i32,
y: i32,
width: u32,
height: u32,
) -> bool {
let Some(ad_rect) = ad_rect_in_screen(main_hwnd, x, y, width, height)
else {
return false;
};
if is_empty_rect(&ad_rect) {
return false;
}
let ad_area = rect_area(&ad_rect);
if ad_area == 0 {
return false;
}
let mut occluded_area = 0u64;
let app_root = unsafe { GetAncestor(main_hwnd, GA_ROOT) };
let app_process_id = std::process::id();
let mut hwnd = match unsafe { GetTopWindow(None) } {
Ok(hwnd) => hwnd,
Err(_) => return false,
};
while !hwnd.is_invalid() {
let window_root = unsafe { GetAncestor(hwnd, GA_ROOT) };
if window_root == app_root {
return false;
}
if window_process_id(hwnd) == Some(app_process_id) {
hwnd = match unsafe { GetWindow(hwnd, GW_HWNDNEXT) } {
Ok(hwnd) => hwnd,
Err(_) => break,
};
continue;
}
if window_counts_as_occluder(hwnd)
&& let Some(occluder_rect) = window_rect(hwnd)
&& let Some(intersection) =
intersect_rects(&ad_rect, &occluder_rect)
{
occluded_area =
occluded_area.saturating_add(rect_area(&intersection));
if (occluded_area as f64 / ad_area as f64)
>= super::ads::OCCLUDED_AREA_THRESHOLD
{
return true;
}
}
hwnd = match unsafe { GetWindow(hwnd, GW_HWNDNEXT) } {
Ok(hwnd) => hwnd,
Err(_) => break,
};
}
false
}
fn ad_rect_in_screen(
main_hwnd: HWND,
x: i32,
y: i32,
width: u32,
height: u32,
) -> Option<RECT> {
let mut origin = POINT { x: 0, y: 0 };
if !unsafe { ClientToScreen(main_hwnd, &mut origin).as_bool() } {
return None;
}
let left = origin.x.saturating_add(x);
let top = origin.y.saturating_add(y);
let right = left.saturating_add(width as i32);
let bottom = top.saturating_add(height as i32);
Some(RECT {
left,
top,
right,
bottom,
})
}
fn window_counts_as_occluder(hwnd: HWND) -> bool {
if !unsafe { IsWindowVisible(hwnd).as_bool() } {
return false;
}
if unsafe { IsIconic(hwnd).as_bool() } {
return false;
}
if is_dwm_cloaked(hwnd) {
return false;
}
true
}
fn window_process_id(hwnd: HWND) -> Option<u32> {
let mut process_id = 0u32;
unsafe {
GetWindowThreadProcessId(hwnd, Some(&mut process_id));
}
(process_id != 0).then_some(process_id)
}
fn is_dwm_cloaked(hwnd: HWND) -> bool {
let mut cloaked = 0u32;
unsafe {
DwmGetWindowAttribute(
hwnd,
DWMWA_CLOAKED,
&mut cloaked as *mut u32 as *mut _,
std::mem::size_of::<u32>() as u32,
)
}
.is_ok()
&& cloaked != 0
}
fn window_rect(hwnd: HWND) -> Option<RECT> {
let mut rect = RECT::default();
if unsafe {
DwmGetWindowAttribute(
hwnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&mut rect as *mut RECT as *mut _,
std::mem::size_of::<RECT>() as u32,
)
}
.is_err()
&& unsafe { GetWindowRect(hwnd, &mut rect) }.is_err()
{
return None;
}
if is_empty_rect(&rect) {
return None;
}
Some(rect)
}
fn is_empty_rect(rect: &RECT) -> bool {
rect.right <= rect.left || rect.bottom <= rect.top
}
fn rect_area(rect: &RECT) -> u64 {
if is_empty_rect(rect) {
return 0;
}
(rect.right - rect.left) as u64 * (rect.bottom - rect.top) as u64
}
fn intersect_rects(a: &RECT, b: &RECT) -> Option<RECT> {
let rect = RECT {
left: a.left.max(b.left),
top: a.top.max(b.top),
right: a.right.min(b.right),
bottom: a.bottom.min(b.bottom),
};
(!is_empty_rect(&rect)).then_some(rect)
}
+4
View File
@@ -18,6 +18,10 @@ pub mod tags;
pub mod utils;
pub mod ads;
#[cfg(target_os = "macos")]
mod ads_occlusion_macos;
#[cfg(windows)]
mod ads_occlusion_windows;
pub mod cache;
pub mod files;
pub mod friends;
+53 -36
View File
@@ -65,49 +65,65 @@ async fn fetch(
)
.await?;
// We check Modrinth's fabric version manifest and compare if the fabric version exists in Modrinth's database
// We also check intermediary versions that are newly added to query
let (fetch_fabric_versions, fetch_intermediary_versions) =
if let Some(modrinth_manifest) = modrinth_manifest {
let (mut fetch_versions, mut fetch_intermediary_versions) =
(Vec::new(), Vec::new());
// We check Modrinth's manifest to find newly added loader versions,
// intermediary/mapping artifacts, and game versions.
let (
fetch_fabric_versions,
fetch_intermediary_versions,
has_new_game_versions,
) = if let Some(modrinth_manifest) = modrinth_manifest {
let (mut fetch_versions, mut fetch_intermediary_versions) =
(Vec::new(), Vec::new());
for version in &fabric_manifest.loader {
if !modrinth_manifest
.game_versions
.iter()
.any(|x| x.loaders.iter().any(|x| x.id == version.version))
&& !skip_versions.contains(&&*version.version)
{
fetch_versions.push(version);
}
for version in &fabric_manifest.loader {
if !modrinth_manifest
.game_versions
.iter()
.any(|x| x.loaders.iter().any(|x| x.id == version.version))
&& !skip_versions.contains(&&*version.version)
{
fetch_versions.push(version);
}
}
for version in &fabric_manifest.intermediary {
if !modrinth_manifest
for version in &fabric_manifest.intermediary {
if !modrinth_manifest
.game_versions
.iter()
.any(|x| x.id == version.version)
&& fabric_manifest
.game
.iter()
.any(|x| x.version == version.version)
{
fetch_intermediary_versions.push(version);
}
}
let has_new_game_versions =
fabric_manifest.game.iter().any(|version| {
!modrinth_manifest
.game_versions
.iter()
.any(|x| x.id == version.version)
&& fabric_manifest
.game
.iter()
.any(|x| x.version == version.version)
{
fetch_intermediary_versions.push(version);
}
}
});
(fetch_versions, fetch_intermediary_versions)
} else {
(
fabric_manifest
.loader
.iter()
.filter(|x| !skip_versions.contains(&&*x.version))
.collect(),
fabric_manifest.intermediary.iter().collect(),
)
};
(
fetch_versions,
fetch_intermediary_versions,
has_new_game_versions,
)
} else {
(
fabric_manifest
.loader
.iter()
.filter(|x| !skip_versions.contains(&&*x.version))
.collect(),
fabric_manifest.intermediary.iter().collect(),
true,
)
};
const DUMMY_GAME_VERSION: &str = "1.21";
@@ -216,6 +232,7 @@ async fn fetch(
if !fetch_fabric_versions.is_empty()
|| !fetch_intermediary_versions.is_empty()
|| has_new_game_versions
{
let fabric_manifest_path =
format!("{mod_loader}/v{format_version}/manifest.json",);
+12 -1
View File
@@ -1,10 +1,15 @@
import { GenericModrinthClient, type Labrinth } from '@modrinth/api-client'
import serverSidedVue from '@vitejs/plugin-vue'
import fs from 'fs/promises'
import { defineNuxtConfig } from 'nuxt/config'
import { fileURLToPath } from 'url'
import svgLoader from 'vite-svg-loader'
import { GenericModrinthClient, type Labrinth } from '../../packages/api-client/src/index.ts'
const STAGING_API_URL = 'https://staging-api.modrinth.com/v2/'
const API_CLIENT_SOURCE = fileURLToPath(
new URL('../../packages/api-client/src/index.ts', import.meta.url),
)
const preloadedFonts = [
'inter/Inter-Regular.woff2',
@@ -24,6 +29,9 @@ const STAGING_MODRINTH_URL = 'https://staging.modrinth.com'
export default defineNuxtConfig({
srcDir: 'src/',
alias: {
'@modrinth/api-client': API_CLIENT_SOURCE,
},
app: {
head: {
htmlAttrs: {
@@ -82,6 +90,9 @@ export default defineNuxtConfig({
},
cacheDir: '../../node_modules/.vite/apps/knossos',
resolve: {
alias: {
'@modrinth/api-client': API_CLIENT_SOURCE,
},
dedupe: ['vue'],
},
plugins: [
-1
View File
@@ -38,7 +38,6 @@
},
"dependencies": {
"@formatjs/intl-localematcher": "^0.5.4",
"@intercom/messenger-js-sdk": "^0.0.14",
"@ltd/j-toml": "^1.38.0",
"@modrinth/api-client": "workspace:*",
"@modrinth/assets": "workspace:*",
@@ -5,7 +5,6 @@ import {
commonMessages,
defineMessages,
IntlFormatted,
normalizeChildren,
PagewideBanner,
useVIntl,
} from '@modrinth/ui'
@@ -22,7 +21,7 @@ const messages = defineMessages({
},
description: {
id: 'layout.banner.preview.description',
defaultMessage: `If you meant to access the official Modrinth website, visit {url}. This preview deploy is used by Modrinth staff for testing purposes. It was built using <branch-link>{owner}/{branch}</branch-link> @ {commit}.`,
defaultMessage: `If you meant to access the official Modrinth website, visit {url}. This preview deploy is used by Modrinth staff for testing purposes. It was built using {ref}.`,
},
})
@@ -41,30 +40,22 @@ const url = computed(() => `https://modrinth.com${route.fullPath}`)
</template>
<template #description>
<span>
<IntlFormatted
:message-id="messages.description"
:values="{
owner: config.public.owner,
branch: config.public.branch,
}"
>
<IntlFormatted :message-id="messages.description">
<template #url>
<a :href="url" target="_blank" rel="noopener" class="text-link">
{{ url }}
</a>
</template>
<template #branch-link="{ children }">
<template #ref>
<a
:href="`https://github.com/${config.public.owner}/code/tree/${config.public.branch}`"
target="_blank"
rel="noopener"
class="hover:underline"
>
<component :is="() => normalizeChildren(children)" />
{{ config.public.owner }} / {{ config.public.branch }}
</a>
</template>
<template #commit>
<span v-if="config.public.hash === 'unknown'">unknown</span>
@ <span v-if="config.public.hash === 'unknown'">unknown</span>
<a
v-else
:href="`https://github.com/${config.public.owner}/code/commit/${config.public.hash}`"
@@ -46,7 +46,7 @@
/>
</div>
<div class="flex flex-col gap-2">
<span class="font-semibold text-contrast"> Version changlog </span>
<span class="font-semibold text-contrast"> Version changelog </span>
<div class="w-full">
<MarkdownEditor
@@ -131,10 +131,9 @@
class="h-10"
/>
<StyledInput
<DatePicker
v-else-if="field.type === 'date'"
v-model="formData[field.name]"
type="date"
wrapper-class="w-full"
/>
@@ -230,6 +229,7 @@ import {
Admonition,
Checkbox,
Combobox,
DatePicker,
defineMessages,
financialMessages,
formFieldLabels,
@@ -95,11 +95,11 @@
<span class="text-red">*</span>
</span>
</label>
<StyledInput
<DatePicker
v-model="formData.dateOfBirth"
type="date"
:max="maxDate"
:max-date="maxDate"
autocomplete="bday"
placeholder="Select date of birth"
wrapper-class="w-full"
/>
</div>
@@ -213,6 +213,7 @@
import {
Chips,
Combobox,
DatePicker,
defineMessages,
formFieldLabels,
formFieldPlaceholders,
@@ -233,7 +233,7 @@ const visibleNags = computed<Nag[]>(() => {
link: {
path: 'moderation',
title: messages.visitModerationPage,
shouldShow: () => props.routeName !== 'type-id-moderation',
shouldShow: () => props.routeName !== 'type-project-moderation',
},
})
}
@@ -48,6 +48,16 @@
<span class="text-sm text-secondary">Requesting</span>
<Badge :type="queueEntry.project.requested_status" class="text-sm" />
</div>
<div
v-if="showExternalDependencies"
v-tooltip="'External dependencies'"
class="flex items-center gap-1 rounded-full border border-solid border-surface-5 bg-surface-4 px-2.5 py-1"
>
<FileIcon aria-hidden="true" class="size-4 text-secondary" />
<span class="text-sm font-medium text-secondary">
{{ queueEntry.external_dependencies_count }}
</span>
</div>
</div>
<div v-if="queueEntry.ownership?.kind === 'user'">
<NuxtLink
@@ -119,7 +129,7 @@
</template>
<script setup lang="ts">
import { ClipboardCopyIcon, LinkIcon, ScaleIcon } from '@modrinth/assets'
import { ClipboardCopyIcon, FileIcon, LinkIcon, ScaleIcon } from '@modrinth/assets'
import {
Avatar,
Badge,
@@ -151,6 +161,7 @@ const formatDateTimeFull = useFormatDateTime({
const props = defineProps<{
queueEntry: ModerationProject
showExternalDependencies?: boolean
}>()
const emit = defineEmits<{
@@ -701,11 +701,11 @@ async function navigateToNextUnlockedProject(): Promise<boolean> {
// Quick re-check if close to expiry (last 5 seconds of TTL)
if (now - next.validatedAt > PREFETCH_STALE_MS - 5000) {
const recheck = await moderationQueue.checkLock(next.projectId)
if (recheck.locked && !recheck.expired) {
// Project got locked, remove from queue and try next
const recheckResults = await batchCheckQueueCandidates([next.projectId])
const recheck = recheckResults.get(next.projectId)
if (!isEligibleQueueCandidate(recheck)) {
prefetchQueue.value.shift()
return navigateToNextUnlockedProject() // Recurse to try next
return navigateToNextUnlockedProject()
}
}
@@ -717,33 +717,14 @@ async function navigateToNextUnlockedProject(): Promise<boolean> {
next.skippedIds.map((id) => moderationQueue.completeCurrentProject(id, 'skipped')),
)
if (next.skippedIds.length > 0) {
addNotification({
title: 'Skipped locked projects',
text: `Skipped ${next.skippedIds.length} project(s) being moderated by others.`,
type: 'info',
})
}
notifySkippedQueueProjects(next.skippedIds.length)
// Trigger prefetch replenishment in background (don't await)
maintainPrefetchQueue()
// Navigate to canonical URL if we have metadata (avoids middleware redirect)
if (next.slug && next.projectType) {
const urlType = getProjectTypeForUrlShorthand(next.projectType, [], tags.value)
navigateTo({
path: `/${urlType}/${next.slug}`,
state: { showChecklist: true },
})
} else {
// Fallback: use project ID (will trigger middleware redirect)
navigateTo({
name: 'type-id',
params: { type: 'project', id: next.projectId },
state: { showChecklist: true },
})
}
navigateToQueueProject(
{ slug: next.slug, projectType: next.projectType, locked: false, isProcessing: true },
next.projectId,
)
return true
}
@@ -869,53 +850,108 @@ function reviewAnyway() {
maintainPrefetchQueue()
}
// Batch check locks and fetch project metadata in parallel
interface LockCheckResult {
// Batch check locks, processing status, and fetch project metadata in parallel
interface QueueCandidateCheck {
locked: boolean
expired?: boolean
isOwnLock?: boolean
slug?: string
projectType?: string
status?: string
isProcessing: boolean
}
async function batchCheckLocksWithMetadata(
function isEligibleQueueCandidate(result: QueueCandidateCheck | undefined): boolean {
if (!result?.isProcessing) return false
return !result.locked || !!result.expired || !!result.isOwnLock
}
function notifySkippedQueueProjects(count: number) {
if (count <= 0) return
addNotification({
title: 'Skipped projects',
text: `Skipped ${count} project(s) already moderated or locked by others.`,
type: 'info',
autoCloseMs: 2000,
})
}
function navigateToQueueProject(result: QueueCandidateCheck, projectId: string) {
if (result.slug && result.projectType) {
const urlType = getProjectTypeForUrlShorthand(result.projectType, [], tags.value)
navigateTo({
path: `/${urlType}/${result.slug}`,
state: { showChecklist: true },
})
} else {
navigateTo({
name: 'type-project',
params: { type: 'project', project: projectId },
state: { showChecklist: true },
})
}
}
async function batchCheckQueueCandidates(
projectIds: string[],
): Promise<Map<string, LockCheckResult>> {
const results = new Map<string, LockCheckResult>()
): Promise<Map<string, QueueCandidateCheck>> {
const results = new Map<string, QueueCandidateCheck>()
// Check locks and fetch minimal project data in parallel
const checks = await Promise.allSettled(
projectIds.map(async (id) => {
// Parallel: check lock AND fetch project metadata
const [lockResponse, projectData] = await Promise.all([
moderationQueue.checkLock(id),
useBaseFetch(`project/${id}`, { method: 'GET' }).catch(() => null),
])
const status = (projectData as { status?: string } | null)?.status
return {
id,
locked: lockResponse.locked,
expired: lockResponse.expired,
isOwnLock: lockResponse.is_own_lock,
slug: (projectData as { slug?: string })?.slug,
projectType: (projectData as { project_type?: string })?.project_type,
slug: (projectData as { slug?: string } | null)?.slug,
projectType: (projectData as { project_type?: string } | null)?.project_type,
status,
isProcessing: projectData === null ? true : status === 'processing',
}
}),
)
// Use forEach with index to avoid indexOf bug on PromiseSettledResult
checks.forEach((result, index) => {
if (result.status === 'fulfilled') {
results.set(result.value.id, result.value)
} else {
// On error, mark as needing fallback (no metadata)
results.set(projectIds[index], { locked: false })
results.set(projectIds[index], { locked: false, isProcessing: true })
}
})
return results
}
async function findNextEligibleQueueProject(candidateIds: string[]) {
const skippedIds: string[] = []
let checkedCount = 0
while (checkedCount < candidateIds.length) {
const batch = candidateIds.slice(checkedCount, checkedCount + PREFETCH_BATCH_SIZE)
checkedCount += batch.length
const results = await batchCheckQueueCandidates(batch)
for (const id of batch) {
const result = results.get(id)
if (isEligibleQueueCandidate(result)) {
return { projectId: id, result: result!, skippedIds: [...skippedIds] }
}
skippedIds.push(id)
}
}
return null
}
// Maintain a queue of prefetched unlocked projects for instant navigation
async function maintainPrefetchQueue() {
if (isPrefetching.value) return
@@ -947,13 +983,10 @@ async function maintainPrefetchQueue() {
const remainingItems =
currentIndex >= 0 ? queueItems.slice(currentIndex + 1) : queueItems.slice(1)
const candidateIds = remainingItems
.filter((id) => !prefetchedIds.has(id))
.slice(0, PREFETCH_BATCH_SIZE * 2) // Check up to 10 candidates
const candidateIds = remainingItems.filter((id) => !prefetchedIds.has(id))
if (candidateIds.length === 0) return
// 5. Batch check locks AND fetch metadata in parallel
const skippedIds: string[] = []
let checkedCount = 0
@@ -964,31 +997,18 @@ async function maintainPrefetchQueue() {
const batch = candidateIds.slice(checkedCount, checkedCount + PREFETCH_BATCH_SIZE)
checkedCount += batch.length
const results = await batchCheckLocksWithMetadata(batch)
const results = await batchCheckQueueCandidates(batch)
for (const id of batch) {
const result = results.get(id)
// Treat as unlocked if: not locked, OR expired, OR it's our own lock
if (!result?.locked || result?.expired || result?.isOwnLock) {
// Found unlocked project with metadata
if (result?.slug && result?.projectType) {
prefetchQueue.value.push({
projectId: id,
slug: result.slug,
projectType: result.projectType,
validatedAt: Date.now(),
skippedIds: [...skippedIds],
})
} else {
// No metadata - still add but will need fallback navigation
prefetchQueue.value.push({
projectId: id,
slug: '', // Empty = use fallback
projectType: '',
validatedAt: Date.now(),
skippedIds: [...skippedIds],
})
}
if (isEligibleQueueCandidate(result)) {
prefetchQueue.value.push({
projectId: id,
slug: result?.slug ?? '',
projectType: result?.projectType ?? '',
validatedAt: Date.now(),
skippedIds: [...skippedIds],
})
if (prefetchQueue.value.length >= PREFETCH_TARGET_COUNT) break
} else {
@@ -1004,8 +1024,6 @@ async function maintainPrefetchQueue() {
// Debounced prefetch to prevent spam from rapid stage changes
const debouncedPrefetch = useDebounceFn(maintainPrefetchQueue, 300)
const MAX_SKIP_ATTEMPTS = 10
async function skipToNextProject() {
// Skip the current project
const currentProjectId = projectV2.value?.id
@@ -1029,60 +1047,28 @@ async function skipToNextProject() {
debug('[skipToNextProject] No prefetch, entering fallback with batch checking')
// Fallback: batch check remaining projects with metadata (excluding current)
const remainingIds: string[] = []
const queueItems = moderationQueue.currentQueue.items
// Build list of remaining projects, excluding current
for (const id of queueItems) {
if (id === currentProjectId) continue
if (remainingIds.length >= MAX_SKIP_ATTEMPTS) break
remainingIds.push(id)
}
const remainingIds = moderationQueue.currentQueue.items.filter((id) => id !== currentProjectId)
if (remainingIds.length > 0) {
const results = await batchCheckLocksWithMetadata(remainingIds)
const next = await findNextEligibleQueueProject(remainingIds)
let skippedCount = 0
for (const id of remainingIds) {
const result = results.get(id)
// Treat as unlocked if: not locked, OR expired, OR it's our own lock
if (!result?.locked || result?.expired || result?.isOwnLock) {
// Found unlocked - skip the locked ones before it
if (skippedCount > 0) {
addNotification({
title: 'Skipped locked projects',
text: `Skipped ${skippedCount} project(s) being moderated by others.`,
type: 'info',
})
}
// Navigate to canonical URL if we have metadata
if (result?.slug && result?.projectType) {
const urlType = getProjectTypeForUrlShorthand(result.projectType, [], tags.value)
navigateTo({
path: `/${urlType}/${result.slug}`,
state: { showChecklist: true },
})
} else {
// Fallback: use project ID
navigateTo({
name: 'type-id',
params: { type: 'project', id },
state: { showChecklist: true },
})
}
return
}
await moderationQueue.completeCurrentProject(id, 'skipped')
skippedCount++
if (next) {
await Promise.all(
next.skippedIds.map((id) => moderationQueue.completeCurrentProject(id, 'skipped')),
)
notifySkippedQueueProjects(next.skippedIds.length)
navigateToQueueProject(next.result, next.projectId)
return
}
// All checked were locked
debug('[skipToNextProject] All projects were locked, skippedCount:', skippedCount)
await Promise.all(
remainingIds.map((id) => moderationQueue.completeCurrentProject(id, 'skipped')),
)
debug('[skipToNextProject] No eligible projects in queue')
addNotification({
title: 'All projects locked',
text: 'All remaining projects are currently being moderated by others.',
title: 'No projects available',
text: 'All remaining projects are already moderated or locked by others.',
type: 'warning',
})
}
@@ -1298,32 +1284,16 @@ onMounted(async () => {
document.addEventListener('visibilitychange', handleVisibilityChange)
notifications.setNotificationLocation('left')
// Check if project has already been reviewed (not in processing status)
if (projectV2.value.status !== 'processing') {
alreadyReviewed.value = true
return
}
// Try to acquire lock
const result = await moderationQueue.acquireLock(projectV2.value.id)
if (result.success) {
handleLockAcquired()
} else if (result.locked_by) {
// Actually locked by another moderator
// In queue mode with more projects - auto-skip to next project
if (moderationQueue.isQueueMode && moderationQueue.queueLength > 1) {
addNotification({
title: 'Project locked',
text: `Skipped project locked by @${result.locked_by.username}.`,
type: 'info',
})
// skipToNextProject already calls completeCurrentProject
await skipToNextProject()
return
}
// Single project mode or last in queue - show locked UI
lockStatus.value = {
locked: true,
lockedBy: result.locked_by,
@@ -2085,72 +2055,36 @@ async function endChecklist(status?: string) {
})
}
} else {
// Use prefetched data if available for instant navigation
if (!(await navigateToNextUnlockedProject())) {
// Fallback: batch check remaining projects with metadata
const remainingIds: string[] = []
const currentProjectId = projectV2.value?.id
const queueItems = moderationQueue.currentQueue.items
const remainingIds = moderationQueue.currentQueue.items.filter(
(id) => id !== currentProjectId,
)
// Build list of remaining projects, excluding current
for (const id of queueItems) {
if (id === currentProjectId) continue
if (remainingIds.length >= MAX_SKIP_ATTEMPTS) break
remainingIds.push(id)
}
let foundUnlocked = false
let foundEligible = false
if (remainingIds.length > 0) {
const results = await batchCheckLocksWithMetadata(remainingIds)
const next = await findNextEligibleQueueProject(remainingIds)
let skippedCount = 0
for (const id of remainingIds) {
const result = results.get(id)
// Treat as unlocked if: not locked, OR expired, OR it's our own lock
if (!result?.locked || result?.expired || result?.isOwnLock) {
// Found unlocked - skip the locked ones before it
if (skippedCount > 0) {
addNotification({
title: 'Skipped locked projects',
text: `Skipped ${skippedCount} project(s) being moderated by others.`,
type: 'info',
})
}
// Navigate to canonical URL if we have metadata
if (result?.slug && result?.projectType) {
const urlType = getProjectTypeForUrlShorthand(result.projectType, [], tags.value)
navigateTo({
path: `/${urlType}/${result.slug}`,
state: { showChecklist: true },
})
} else {
// Fallback: use project ID
navigateTo({
name: 'type-id',
params: { type: 'project', id },
state: { showChecklist: true },
})
}
foundUnlocked = true
break
}
await moderationQueue.completeCurrentProject(id, 'skipped')
skippedCount++
}
// If no unlocked projects found, show notification
if (!foundUnlocked && skippedCount > 0) {
if (next) {
await Promise.all(
next.skippedIds.map((id) => moderationQueue.completeCurrentProject(id, 'skipped')),
)
notifySkippedQueueProjects(next.skippedIds.length)
navigateToQueueProject(next.result, next.projectId)
foundEligible = true
} else {
await Promise.all(
remainingIds.map((id) => moderationQueue.completeCurrentProject(id, 'skipped')),
)
addNotification({
title: 'All projects locked',
text: 'All remaining projects are currently being moderated by others.',
title: 'No projects available',
text: 'All remaining projects are already moderated or locked by others.',
type: 'warning',
})
}
}
// If no unlocked projects found, go back to moderation queue
if (!foundUnlocked) {
if (!foundEligible) {
await navigateTo({
name: 'moderation',
})
+38 -19
View File
@@ -1,3 +1,10 @@
function normalizeAuthToken(value) {
if (typeof value === 'string') {
return value
}
return ''
}
export const useAuth = async (oldToken = null) => {
const auth = useState('auth', () => ({
user: null,
@@ -32,27 +39,35 @@ export const initAuth = async (oldToken = null) => {
})
if (oldToken) {
authCookie.value = oldToken
const normalized = normalizeAuthToken(oldToken)
if (normalized) {
authCookie.value = normalized
}
}
if (route.query.code && !route.fullPath.includes('new_account=true')) {
authCookie.value = route.query.code
const oauthCode = normalizeAuthToken(route.query.code)
if (oauthCode && !route.fullPath.includes('new_account=true')) {
authCookie.value = oauthCode
}
if (route.fullPath.includes('new_account=true') && route.path !== '/auth/welcome') {
const redirect = route.path.startsWith('/auth/') ? null : route.fullPath
await navigateTo(
`/auth/welcome?authToken=${route.query.code}${
`/auth/welcome?authToken=${oauthCode}${
redirect ? `&redirect=${encodeURIComponent(redirect)}` : ''
}`,
)
}
if (authCookie.value) {
auth.token = authCookie.value
const tokenStr = normalizeAuthToken(authCookie.value)
if (!auth.token || !auth.token.startsWith('mra_')) {
if (authCookie.value != null && tokenStr === '') {
authCookie.value = null
} else if (tokenStr) {
auth.token = tokenStr
if (!auth.token.startsWith('mra_')) {
return auth
}
@@ -71,7 +86,7 @@ export const initAuth = async (oldToken = null) => {
}
}
if (!auth.user && auth.token) {
if (!auth.user && auth.token && typeof auth.token === 'string') {
try {
const session = await useBaseFetch(
'session/refresh',
@@ -84,18 +99,22 @@ export const initAuth = async (oldToken = null) => {
true,
)
auth.token = session.session
authCookie.value = auth.token
auth.user = await useBaseFetch(
'user',
{
headers: {
Authorization: auth.token,
auth.token = normalizeAuthToken(session.session)
if (auth.token) {
authCookie.value = auth.token
auth.user = await useBaseFetch(
'user',
{
headers: {
Authorization: auth.token,
},
},
},
true,
)
true,
)
} else {
authCookie.value = null
auth.token = ''
}
} catch {
authCookie.value = null
}
@@ -63,7 +63,11 @@ export function useCdnDownloadContext() {
})
function createProjectDownloadUrl(originalUrl: string, context?: DownloadContext): string {
if (!originalUrl.startsWith('https://cdn.modrinth.com')) {
if (
typeof originalUrl !== 'string' ||
!originalUrl ||
!originalUrl.startsWith('https://cdn.modrinth.com')
) {
return originalUrl
}
+4 -1
View File
@@ -199,17 +199,20 @@ export type ModerationOwnership = ModerationOwnershipUser | ModerationOwnershipO
export interface ProjectWithOwnership {
ownership: ModerationOwnership
external_dependencies_count: number
[key: string]: any
}
export interface ModerationProject {
project: any
ownership: ModerationOwnership | null
external_dependencies_count: number
}
export function toModerationProjects(projects: ProjectWithOwnership[]): ModerationProject[] {
return projects.map(({ ownership, ...project }) => ({
return projects.map(({ ownership, external_dependencies_count, ...project }) => ({
project,
ownership: ownership ?? null,
external_dependencies_count: external_dependencies_count,
}))
}
+30 -1
View File
@@ -761,9 +761,13 @@ import {
commonMessages,
commonProjectTypeCategoryMessages,
commonSettingsMessages,
createHostingIntercomIdentityKey,
defineMessages,
injectModrinthClient,
injectPageContext,
OverflowMenu,
providePageContext,
useHostingIntercom,
useVIntl,
} from '@modrinth/ui'
import TeleportOverflowMenu from '@modrinth/ui/src/components/base/TeleportOverflowMenu.vue'
@@ -808,6 +812,25 @@ const router = useNativeRouter()
const signInRouteObj = computed(() => getSignInRouteObj(route))
const link = config.public.siteUrl + route.path.replace(/\/+$/, '')
const client = injectModrinthClient()
const pageContext = injectPageContext()
const hostingIntercomActive = computed(() => route.path.startsWith('/hosting') && !!auth.value.user)
const hostingIntercomServerId = computed(() => {
const rawId = route.params.id
return Array.isArray(rawId) ? rawId[0] : rawId
})
const hostingIntercom = useHostingIntercom({
enabled: hostingIntercomActive,
appId: computed(() => config.public.intercomAppId),
fetchToken: fetchIntercomToken,
identityKey: computed(() =>
createHostingIntercomIdentityKey(auth.value.user, hostingIntercomServerId.value),
),
})
providePageContext({
...pageContext,
intercomBubble: hostingIntercom.intercomBubble,
})
const { data: payoutBalance } = useQuery({
queryKey: ['payout', 'balance'],
@@ -836,6 +859,12 @@ const showTinMismatchBanner = computed(() => {
const basePopoutId = useId()
async function fetchIntercomToken() {
return $fetch('/api/intercom/messenger-jwt', {
query: hostingIntercomServerId.value ? { server_id: hostingIntercomServerId.value } : {},
})
}
const navMenuMessages = defineMessages({
home: {
id: 'layout.nav.home',
@@ -1148,7 +1177,7 @@ const isDiscovering = computed(
)
const isDiscoveringSubpage = computed(
() => route.name && route.name.startsWith('type-id') && !route.query.sid,
() => route.name && route.name.startsWith('type-project') && !route.query.sid,
)
const isRussia = computed(() => country.value === 'ru')
+1 -1
View File
@@ -942,7 +942,7 @@
"message": "موعد"
},
"dashboard.withdraw.completion.email-confirmation": {
"message": "ستتلقى رسالة بريد إلكتروني في <b>{email}<b> مع تعليمات لاسترداد المبلغ المسحوب. "
"message": "ستتلقى رسالة بريد إلكتروني في <b>{email}</b> مع تعليمات لاسترداد المبلغ المسحوب. "
},
"dashboard.withdraw.completion.exchange-rate": {
"message": "سعر الصرف "
+159
View File
@@ -38,6 +38,9 @@
"app-marketing.download.options-title": {
"message": "Stahovácí možnosti"
},
"app-marketing.download.terms": {
"message": "Stažením aplikace Modrinth vyjadřujete souhlas s našimi <terms-link>Podmínkami</terms-link> a <privacy-link>Zásadami ochrany osobních údajů</privacy-link>."
},
"app-marketing.download.title": {
"message": "Stáhnout Modrinth App (Beta)"
},
@@ -104,6 +107,9 @@
"app-marketing.features.performance.cpu-percent": {
"message": "% CPU"
},
"app-marketing.features.performance.description": {
"message": "Aplikace Modrinth je výkonnější než mnoho předních správců modů a využívá pouze 150MB paměti RAM!"
},
"app-marketing.features.performance.discord": {
"message": "Discord"
},
@@ -398,6 +404,48 @@
"collection.title": {
"message": "{name} - Kolekce"
},
"conversation-thread.action.add-private-note": {
"message": "Přidat soukromou poznámku"
},
"conversation-thread.action.close-thread": {
"message": "Uzavřít vlákno"
},
"conversation-thread.action.close-with-reply": {
"message": "Uzavřít s odpovědí"
},
"conversation-thread.action.reject": {
"message": "Zamítnout"
},
"conversation-thread.action.reject-with-reply": {
"message": "Zamítnout s odpovědí"
},
"conversation-thread.action.reopen-thread": {
"message": "Znovuotevřít vlákno"
},
"conversation-thread.action.reply": {
"message": "Odpovědět"
},
"conversation-thread.action.reply-to-thread": {
"message": "Odpovědět vláknu"
},
"conversation-thread.action.send": {
"message": "Odeslat"
},
"conversation-thread.action.send-to-review": {
"message": "Odeslat ke kontrole"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Odeslat ke kontrole s odpovědí"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Odpovědět vláknu..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Odeslat zprávu..."
},
"conversation-thread.reply-modal.header": {
"message": "Odpovědět vláknu"
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Doplňkové soubory slouží jako podpůrné materiály (např. zdrojový kód), ne jako alternativní verze či varianty."
},
@@ -494,6 +542,9 @@
"create.project.name-placeholder": {
"message": "Zadejte název projektu..."
},
"create.project.owner-label": {
"message": "Vlastník"
},
"create.project.summary-description": {
"message": "Popiště vaši organizace dvěma nebo jednou větou."
},
@@ -545,9 +596,18 @@
"dashboard.affiliate-links.revoke-confirm.title": {
"message": "Jste si jistý, že chcete zrušit svůj affiliate odkaz „{title}“?"
},
"dashboard.analytics.total-downloads": {
"message": "Celková stažení"
},
"dashboard.analytics.total-followers": {
"message": "Celkoví sledující"
},
"dashboard.collections.button.create-new": {
"message": "Vytvořit novou"
},
"dashboard.collections.empty.get-started-hint": {
"message": "Vytvořte svou první kolekci a začněte!"
},
"dashboard.collections.label.projects-count": {
"message": "{count} {countPlural, plural, one {project} other {projects}}"
},
@@ -557,6 +617,15 @@
"dashboard.collections.long-title": {
"message": "Vaše kolekce"
},
"dashboard.collections.sort.name-ascending": {
"message": "Jméno (A-Z)"
},
"dashboard.collections.sort.recently-created": {
"message": "Nedávno vytvořeno"
},
"dashboard.collections.sort.recently-updated": {
"message": "Nedávno aktualizováno"
},
"dashboard.creator-tax-form-modal.confirmation.title": {
"message": "Hotovo! 🎉"
},
@@ -572,9 +641,18 @@
"dashboard.creator-withdraw-modal.details-label": {
"message": "Detaily"
},
"dashboard.creator-withdraw-modal.fee-breakdown-amount": {
"message": "Množství"
},
"dashboard.creator-withdraw-modal.fee-breakdown-fee": {
"message": "Poplatek"
},
"dashboard.creator-withdraw-modal.fee-breakdown-gift-card-value": {
"message": "Hodnota dárkové karty"
},
"dashboard.creator-withdraw-modal.fee-breakdown-usd-equivalent": {
"message": "Ekvivalent americkému dolaru"
},
"dashboard.creator-withdraw-modal.method-selection.country-placeholder": {
"message": "Zvolte vaši zemi"
},
@@ -623,9 +701,18 @@
"dashboard.creator-withdraw-modal.stage.tax-form": {
"message": ""
},
"dashboard.creator-withdraw-modal.tremendous-details.enter-denomination-placeholder": {
"message": "Zadejte množství"
},
"dashboard.creator-withdraw-modal.tremendous-details.payment-method": {
"message": "Platební metoda"
},
"dashboard.creator-withdraw-modal.tremendous-details.reward": {
"message": "Odměna"
},
"dashboard.creator-withdraw-modal.tremendous-details.reward-placeholder": {
"message": "Vyberte odměnu"
},
"dashboard.creator-withdraw-modal.tremendous-details.reward-plural": {
"message": "Odměny"
},
@@ -635,9 +722,57 @@
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
"message": "Vyčerpali jste svůj limit pro výběr <b>{withdrawLimit}</b>. Pro vyšší výběr musíte vyplnit daňový formulář."
},
"dashboard.organizations.button.create": {
"message": "Vytvořit organizaci"
},
"dashboard.organizations.empty.cta": {
"message": "Vytvořte organizaci!"
},
"dashboard.organizations.error.fetch": {
"message": "Nepodařilo se načíst organizace"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Označit vše jako přečtené"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Ukázat historii"
},
"dashboard.overview.notifications.history.label": {
"message": "Historie"
},
"dashboard.overview.notifications.history.title": {
"message": "Historie oznámení"
},
"dashboard.overview.notifications.loading": {
"message": "Načítání oznámení..."
},
"dashboard.projects.head-title": {
"message": "Projekty"
},
"dashboard.projects.links.discord-invite.label": {
"message": "Discord pozvánka"
},
"dashboard.projects.links.placeholder.valid-url": {
"message": "Zadejte platnou URL"
},
"dashboard.projects.sort.option.name": {
"message": "Jméno"
},
"dashboard.projects.sort.option.status": {
"message": "Stav"
},
"dashboard.projects.table.name": {
"message": "Jméno"
},
"dashboard.projects.table.status": {
"message": "Stav"
},
"dashboard.revenue.available-now": {
"message": "K dispozici nyní"
},
"dashboard.revenue.balance": {
"message": "Zůstatek"
},
"dashboard.revenue.estimated-with-date": {
"message": "Odhadováno {date}"
},
@@ -647,18 +782,39 @@
"dashboard.revenue.transactions.btn.download-csv": {
"message": "Stáhnout jako CSV"
},
"dashboard.sidebar.label.creators": {
"message": "Tvůrci"
},
"dashboard.sidebar.label.notifications": {
"message": "Oznámení"
},
"dashboard.sidebar.label.organizations": {
"message": "Organizace"
},
"dashboard.sidebar.label.projects": {
"message": "Projekty"
},
"dashboard.withdraw.completion.account": {
"message": "Účet"
},
"dashboard.withdraw.completion.amount": {
"message": "Množství"
},
"dashboard.withdraw.completion.date": {
"message": "Datum"
},
"dashboard.withdraw.completion.fee": {
"message": "Poplatek"
},
"dashboard.withdraw.completion.transactions-button": {
"message": "Transakce"
},
"dashboard.withdraw.completion.wallet": {
"message": "Peněženka"
},
"discover.install.back-to-server": {
"message": "Zpět na server"
},
"error.collection.404.list_item.1": {
"message": "Možná jste zadali URL adresu kolekce špatně."
},
@@ -749,6 +905,9 @@
"frog.title": {
"message": "Žába"
},
"hosting-marketing.included.custom-url": {
"message": "Vlastní URL"
},
"landing.creator.feature.monetization.title": {
"message": "Monetizace"
},
@@ -1013,9 +1013,6 @@
"hosting-marketing.faq.location": {
"message": "Hvor er Modrinth Hosting servere placeret? Kan jeg vælge et område?"
},
"hosting-marketing.faq.location.answer": {
"message": "Vi har servere tilgængelig i Nord Amerika, Europa, og Sydøst Asien på nuværende tidspunkt som du kan vælge imellem under købet. Flere områder kommer i fremtiden! Hvis du gerne vil skifte til dit område, venligst kontakt support."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Hvilken Minecraft version og loaders kan blive brugt?"
},
+98 -23
View File
@@ -407,6 +407,51 @@
"collection.title": {
"message": "{name} - Kollektion"
},
"conversation-thread.action.add-private-note": {
"message": "Private Notiz hinzufügen"
},
"conversation-thread.action.approve": {
"message": "Genehmigen"
},
"conversation-thread.action.approve-with-reply": {
"message": "Mit Antwort genehmigen"
},
"conversation-thread.action.close-thread": {
"message": ""
},
"conversation-thread.action.reject": {
"message": "Ablehnen"
},
"conversation-thread.action.reject-with-reply": {
"message": "Mit Antwort ablehnen"
},
"conversation-thread.action.reply": {
"message": "Antworten"
},
"conversation-thread.action.send": {
"message": "Senden"
},
"conversation-thread.action.withhold": {
"message": "Zurückhalten"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Mit Antwort zurückhalten"
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Sende eine Nachricht..."
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Mir ist bewusst, dass dieser Thread nicht aktiv von den Moderatoren überwacht wird."
},
"conversation-thread.resubmit-modal.description": {
"message": "Du schickst <project-title>{projectTitle}</project-title> zur Wiederprüfung."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Erneut zur Überprüfung einreichen"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Erneut zur Überprüfung einreichen"
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Ergänzende Dateien dienen zur unterstützung von Ressourcen wie Quellcode, nicht für alternative Versionen oder Varianten."
},
@@ -875,23 +920,8 @@
"dashboard.head-title": {
"message": "Dashboard"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Alle als gelesen markieren"
},
"dashboard.notifications.button.view-history": {
"message": "Verlauf ansehen"
},
"dashboard.notifications.empty.no-unread": {
"message": "Du hast keine ungelesenen Nachrichten."
},
"dashboard.notifications.error.loading": {
"message": "Fehler beim laden von Benachrichtigungen:"
},
"dashboard.notifications.history.label": {
"message": "Verlauf"
},
"dashboard.notifications.history.title": {
"message": "Benachrichtigungsverlauf"
"message": "Du hast keine ungelesenen Benachrichtigungen."
},
"dashboard.notifications.link.see-all": {
"message": "Alle ansehen"
@@ -902,9 +932,6 @@
"dashboard.notifications.link.view-more": {
"message": "Siehe {extraNotifs} weitere {extraNotifs, plural, one {Benachrichtigung} other {Benachrichtigungen}}"
},
"dashboard.notifications.loading": {
"message": "Lade Benachrichtigungen..."
},
"dashboard.organizations.button.create": {
"message": "Organisation erstellen"
},
@@ -920,6 +947,27 @@
"dashboard.organizations.title": {
"message": "Organisationen"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Alle als gelesen markieren"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Verlauf ansehen"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Du hast keine ungelesenen Benachrichtigungen."
},
"dashboard.overview.notifications.error.loading": {
"message": "Fehler beim Laden von Benachrichtigungen:"
},
"dashboard.overview.notifications.history.label": {
"message": "Verlauf"
},
"dashboard.overview.notifications.history.title": {
"message": "Benachrichtigungsverlauf"
},
"dashboard.overview.notifications.loading": {
"message": "Benachrichtigungen werden geladen..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Du kannst mehrere Projekte gleichzeitig bearbeiten, indem du sie unden auswählst."
},
@@ -1421,9 +1469,6 @@
"hosting-marketing.faq.location": {
"message": "Wo befinden sich Server von Modrinth Hosting? Kann ich eine Region auswählen?"
},
"hosting-marketing.faq.location.answer": {
"message": "Derzeit sind Server in Nordamerika, Europa und Südostasien verfügbar, die du beim Kauf auswählen kannst. Weitere Regionen werden in Zukunft dazukommen! Falls du deine Region wechseln möchtest, wende dich bitte an den Support."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Welche Minecraft-Versionen und Loader können verwendet werden?"
},
@@ -1754,14 +1799,20 @@
"layout.banner.add-email.description": {
"message": "Aus Sicherheitsgründen verlangt Modrinth, dass du eine E-Mail Adresse für dein Konto registrierst."
},
"layout.banner.build-fail.always-ignore": {
"message": "Immer ignorieren"
},
"layout.banner.build-fail.description": {
"message": "Diese Deployment von Modrinth's Frontend konnte keinen Status von der API generieren. Dies könnte aufgrund eines Ausfalls oder eines Konfigurationsfehlers sein. Erstelle neu wenn die API verfügbar ist. Fehlercodes: {errors}; Aktuelle API URL ist: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Ignorieren"
},
"layout.banner.build-fail.title": {
"message": "Fehler beim generieren des Status von der API beim erstellen."
},
"layout.banner.preview.description": {
"message": "Falls du die offizielle Modrinth-Website aufrufen wolltest, besuch <link>https://modrinth.com</link>. Diese Vorschauversion wird von Modrinth-Mitarbeitern zu Testzwecken genutzt. Sie wurde unter Verwendung von <branch-link>{owner}/{branch}</branch-link> @ {commit} erstellt."
"message": "Falls du die offizielle Modrinth-Website aufrufen wolltest, besuche {url}. Diese Vorschauversion wird von Modrinth-Mitarbeitern zu Testzwecken genutzt. Sie wurde unter Verwendung von <branch-link>{owner}/{branch}</branch-link> @ {commit} erstellt."
},
"layout.banner.preview.title": {
"message": "Dies ist eine Vorschauversion der Modrinth-Webseite."
@@ -2591,6 +2642,30 @@
"project.license.title": {
"message": "Lizenz"
},
"project.moderation.admonition.approved.body.private": {
"message": "Dein Projekt ist privat, was bedeutet, dass nur du und von dir eingeladene Personen darauf zugreifen können."
},
"project.moderation.admonition.approved.header": {
"message": "Projekt genehmigt"
},
"project.moderation.admonition.rejected.header": {
"message": "Änderungen angefragt"
},
"project.moderation.admonition.under-review.body.1": {
"message": "Dein Projekt ist in der Warteschlange, um von Modrinths Moderationsteam überprüft zu werden."
},
"project.moderation.admonition.under-review.header": {
"message": "Projekt wird überprüft"
},
"project.moderation.admonition.withheld.header": {
"message": "Von Mitarbeitern entlistet"
},
"project.moderation.error.unauthorized": {
"message": "Nicht autorisiert"
},
"project.moderation.thread.title": {
"message": "Moderationsnachrichten"
},
"project.moderation.title": {
"message": "Moderation"
},
+104 -23
View File
@@ -407,6 +407,51 @@
"collection.title": {
"message": "{name} - Kollektion"
},
"conversation-thread.action.add-private-note": {
"message": "Private Notiz hinzufügen"
},
"conversation-thread.action.approve": {
"message": "Genehmigen"
},
"conversation-thread.action.approve-with-reply": {
"message": "Mit Antwort genehmigen"
},
"conversation-thread.action.close-thread": {
"message": ""
},
"conversation-thread.action.reject": {
"message": "Ablehnen"
},
"conversation-thread.action.reject-with-reply": {
"message": "Mit Antwort ablehnen"
},
"conversation-thread.action.reply": {
"message": "Antworten"
},
"conversation-thread.action.send": {
"message": "Senden"
},
"conversation-thread.action.withhold": {
"message": "Zurückhalten"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Mit Antwort zurückhalten"
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Sende eine Nachricht..."
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Mir ist bewusst, dass dieser Thread nicht aktiv von den Moderatoren überwacht wird."
},
"conversation-thread.resubmit-modal.description": {
"message": "Du schickst <project-title>{projectTitle}</project-title> zur Wiederprüfung."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Erneut zur Überprüfung einreichen"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Erneut zur Überprüfung einreichen"
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Ergänzende Dateien dienen zur Unterstützung von Ressourcen wie Quellcode, nicht für alternative Versionen oder Varianten."
},
@@ -875,24 +920,9 @@
"dashboard.head-title": {
"message": "Dashboard"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Alle als gelesen markieren"
},
"dashboard.notifications.button.view-history": {
"message": "Verlauf ansehen"
},
"dashboard.notifications.empty.no-unread": {
"message": "Du hast keine ungelesenen Benachrichtigungen."
},
"dashboard.notifications.error.loading": {
"message": "Fehler beim Laden von Benachrichtigungen:"
},
"dashboard.notifications.history.label": {
"message": "Verlauf"
},
"dashboard.notifications.history.title": {
"message": "Benachrichtigungsverlauf"
},
"dashboard.notifications.link.see-all": {
"message": "Alle ansehen"
},
@@ -902,9 +932,6 @@
"dashboard.notifications.link.view-more": {
"message": "Siehe {extraNotifs} weitere {extraNotifs, plural, one {Benachrichtigung} other {Benachrichtigungen}} an"
},
"dashboard.notifications.loading": {
"message": "Benachrichtigungen werden geladen..."
},
"dashboard.organizations.button.create": {
"message": "Organisation erstellen"
},
@@ -920,6 +947,27 @@
"dashboard.organizations.title": {
"message": "Organisationen"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Alle als gelesen markieren"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Verlauf ansehen"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Du hast keine ungelesenen Benachrichtigungen."
},
"dashboard.overview.notifications.error.loading": {
"message": "Fehler beim Laden von Benachrichtigungen:"
},
"dashboard.overview.notifications.history.label": {
"message": "Verlauf"
},
"dashboard.overview.notifications.history.title": {
"message": "Benachrichtigungsverlauf"
},
"dashboard.overview.notifications.loading": {
"message": "Benachrichtigungen werden geladen..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Du kannst mehrere Projekte gleichzeitig bearbeiten, indem du sie unten auswählst."
},
@@ -1241,6 +1289,12 @@
"discover.install.error.no-server-world": {
"message": "Keine Serverwelt ist zur Installation verfügbar."
},
"discover.install.error.unsupported-content-type": {
"message": "Dieser Inhaltstyp kann nicht vom Durchstöbern zu einem Server hinzugefügt werden."
},
"discover.install.heading.reset-modpack": {
"message": "Modpack zur Installation nach dem Zurücksetzen auswählen"
},
"discover.seo.description": {
"message": "Durchsuche und entdecke tausende Minecraft {projectType, select, mod {Mods} modpack {Modpacks} resourcepack {Ressourcenpakete} shader {Shader} plugin {Plugins} datapack {Datenpakete} other {Projekte}} auf Modrinth mit sofortigen und präzisen Suchergebnissen. Unsere Filter helfen dir dabei, schnell die besten Minecraft {projectType, select, mod {Mods} modpack {Modpacks} resourcepack {Ressourcenpakete} shader {Shader} plugin {Plugins} datapack {Datenpakete} other {Projekte}} zu finden."
},
@@ -1415,9 +1469,6 @@
"hosting-marketing.faq.location": {
"message": "Wo befinden sich Server von Modrinth Hosting? Kann ich eine Region auswählen?"
},
"hosting-marketing.faq.location.answer": {
"message": "Derzeit sind Server in Nordamerika, Europa und Südostasien verfügbar, die du beim Kauf auswählen kannst. Weitere Regionen werden in Zukunft dazukommen! Falls du deine Region wechseln möchtest, wende dich bitte an den Support."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Welche Minecraft-Versionen und Loader können verwendet werden?"
},
@@ -1748,14 +1799,20 @@
"layout.banner.add-email.description": {
"message": "Aus Sicherheitsgründen verlangt Modrinth, dass du eine E-Mail-Adresse für dein Konto registrierst."
},
"layout.banner.build-fail.always-ignore": {
"message": "Immer ignorieren"
},
"layout.banner.build-fail.description": {
"message": "Dieses Deployment des Modrinth-Frontends konnte keinen Status aus der API generieren. Dies kann an einer Störung oder einem Fehler in der Konfiguration liegen. Erneut erstellen, wenn die API verfügbar ist. Fehlercodes: {errors}; Aktuelle API-URL lautet: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Ignorieren"
},
"layout.banner.build-fail.title": {
"message": "Fehler beim Generieren des Status aus der API beim Erstellen."
},
"layout.banner.preview.description": {
"message": "Falls du die offizielle Modrinth-Website aufrufen wolltest, besuch <link>https://modrinth.com</link>. Diese Vorschauversion wird von Modrinth-Mitarbeitern zu Testzwecken genutzt. Sie wurde unter Verwendung von <branch-link>{owner}/{branch}</branch-link> @ {commit} erstellt."
"message": "Falls du die offizielle Modrinth-Website aufrufen wolltest, besuche {url}. Diese Vorschauversion wird von Modrinth-Mitarbeitern zu Testzwecken genutzt. Sie wurde unter Verwendung von <branch-link>{owner}/{branch}</branch-link> @ {commit} erstellt."
},
"layout.banner.preview.title": {
"message": "Dies ist eine Vorschauversion der Modrinth-Website."
@@ -2585,6 +2642,30 @@
"project.license.title": {
"message": "Lizenz"
},
"project.moderation.admonition.approved.body.private": {
"message": "Dein Projekt ist privat, was bedeutet, dass nur du und von dir eingeladene Personen darauf zugreifen können."
},
"project.moderation.admonition.approved.header": {
"message": "Projekt genehmigt"
},
"project.moderation.admonition.rejected.header": {
"message": "Änderungen angefragt"
},
"project.moderation.admonition.under-review.body.1": {
"message": "Dein Projekt ist in der Warteschlange, um von Modrinths Moderationsteam überprüft zu werden."
},
"project.moderation.admonition.under-review.header": {
"message": "Projekt wird überprüft"
},
"project.moderation.admonition.withheld.header": {
"message": "Von Mitarbeitern entlistet"
},
"project.moderation.error.unauthorized": {
"message": "Nicht autorisiert"
},
"project.moderation.thread.title": {
"message": "Moderationsnachrichten"
},
"project.moderation.title": {
"message": "Moderation"
},
@@ -3645,7 +3726,7 @@
"message": "Methode aktualisieren"
},
"settings.billing.upgrade": {
"message": "Verbessern"
"message": "Upgraden"
},
"settings.display.banner.developer-mode.button": {
"message": "Entwicklermodus deaktivieren"
+2 -2
View File
@@ -1536,7 +1536,7 @@
"message": "Where are Modrinth Hosting servers located? Can I choose a region?"
},
"hosting-marketing.faq.location.answer": {
"message": "We have servers available in North America, Europe, and Southeast Asia at the moment that you can choose upon purchase. More regions to come in the future! If you'd like to switch your region, please contact support."
"message": "We have servers available across North America, Europe, and Southeast Asia at the moment that you can choose upon purchase. More regions to come in the future! If you'd like to switch your region, please contact support."
},
"hosting-marketing.faq.versions-loaders": {
"message": "What Minecraft versions and loaders can be used?"
@@ -1881,7 +1881,7 @@
"message": "Error generating state from API when building."
},
"layout.banner.preview.description": {
"message": "If you meant to access the official Modrinth website, visit {url}. This preview deploy is used by Modrinth staff for testing purposes. It was built using <branch-link>{owner}/{branch}</branch-link> @ {commit}."
"message": "If you meant to access the official Modrinth website, visit {url}. This preview deploy is used by Modrinth staff for testing purposes. It was built using {ref}."
},
"layout.banner.preview.title": {
"message": "This is a preview deploy of the Modrinth website."
+252 -24
View File
@@ -42,7 +42,7 @@
"message": "Al descargar la Modrinth App, aceptas nuestros <terms-link>Términos</terms-link> y <privacy-link>Política de Privacidad</privacy-link>."
},
"app-marketing.download.title": {
"message": "Descargar la Modrinth App (Beta)"
"message": "Descarga Modrinth App (Beta)"
},
"app-marketing.download.windows": {
"message": "Windows"
@@ -407,6 +407,117 @@
"collection.title": {
"message": "{name} - Colección"
},
"conversation-thread.action.add-private-note": {
"message": "Añadir nota privada"
},
"conversation-thread.action.approve": {
"message": "Aprovar"
},
"conversation-thread.action.approve-with-reply": {
"message": "Aprovar con respuesta"
},
"conversation-thread.action.close-thread": {
"message": "Cerrar hilo"
},
"conversation-thread.action.close-with-reply": {
"message": "Cerrar con respuesta"
},
"conversation-thread.action.reject": {
"message": "Rechazar"
},
"conversation-thread.action.reject-with-reply": {
"message": "Rechazar con respuesta"
},
"conversation-thread.action.reopen-thread": {
"message": "Reabrir hilo"
},
"conversation-thread.action.reply": {
"message": "Responder"
},
"conversation-thread.action.reply-to-thread": {
"message": "Responder hilo"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Resubir para revisión"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Resubir para revisión con respuesta"
},
"conversation-thread.action.send": {
"message": "Enviar"
},
"conversation-thread.action.send-to-review": {
"message": "Enviar a revisión"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Enviar a revisión con respuesta"
},
"conversation-thread.action.set-to-draft": {
"message": "Cambiar a borrador"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "Cambiar a borrador con respuesta"
},
"conversation-thread.action.withhold": {
"message": "Retener"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Retener con respuesta"
},
"conversation-thread.closed-thread.description": {
"message": "Este hilo está cerrado y no se pueden enviar nuevos mensajes."
},
"conversation-thread.error.closing-report": {
"message": "Error cerrando el reporte"
},
"conversation-thread.error.reopening-report": {
"message": "Error al reabrir el reporte"
},
"conversation-thread.error.sending-message": {
"message": "Error al enviar el mensaje"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Respuesta al hilo..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Envía un mensaje..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Confirmación que moderadores no monitorean esto activamente"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Comprendo que los moderadores no monitorean este hilo activamente."
},
"conversation-thread.reply-modal.description": {
"message": "Tu proyecto ya ha sido aprovado. Por ello, el equipo de moderación no monitorea activamente este hilo. Sin embargo, puede que vean tu mensaje de todos modos de haber algún problema con tu proyecto."
},
"conversation-thread.reply-modal.header": {
"message": "Responder al hilo"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Si necesitas ponerte en contacto con el equipo de moderación, por favor utiliza el <help-center-link>Centro de ayuda de Modrinth</help-center-link> y haz clic en la burbuja azúl en la esquina inferior derecha para contactar soporte."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "Confirma que has atendido las observaciones de los moderadores"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Confirmo que he atendido correctamente las observaciones de los moderadores."
},
"conversation-thread.resubmit-modal.description": {
"message": "Estás enviando <project-title>{projectTitle}</project-title> para ser revisado de nuevo por los moderadores."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Enviando de nuevo para revisión"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Enviando para revisión"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "Asegúrate de haber leído y resuelto todas las observaciones del equipo de moderación."
},
"conversation-thread.resubmit-modal.warning": {
"message": "Envíos repetidos sin atender las observaciones de los moderadores pueden resultar en la suspensión de la cuenta."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Los archivos complementarios sirven para recursos de apoyo, como código fuente, no para versiones o variantes alternativas."
},
@@ -875,23 +986,8 @@
"dashboard.head-title": {
"message": "Panel de control"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Marcar todas cómo leídas"
},
"dashboard.notifications.button.view-history": {
"message": "Ver historial"
},
"dashboard.notifications.empty.no-unread": {
"message": "No tienes ningúna notificación sin leer."
},
"dashboard.notifications.error.loading": {
"message": "Error al cargar las notificaciones:"
},
"dashboard.notifications.history.label": {
"message": "Historial"
},
"dashboard.notifications.history.title": {
"message": "Historial de notificaciones"
"message": "No tienes notificaciones sin leer."
},
"dashboard.notifications.link.see-all": {
"message": "Ver todas"
@@ -902,9 +998,6 @@
"dashboard.notifications.link.view-more": {
"message": "Ver {extraNotifs} {extraNotifs, plural,one {notificación} other {notificaciones}} más"
},
"dashboard.notifications.loading": {
"message": "Cargando notificaciones..."
},
"dashboard.organizations.button.create": {
"message": "Crear organización"
},
@@ -912,7 +1005,7 @@
"message": "¡Haz una organización!"
},
"dashboard.organizations.error.fetch": {
"message": "No se pudo obtener las organizaciones"
"message": "Fallo en obtener las organizaciones"
},
"dashboard.organizations.member-count": {
"message": "{count} {count, plural,one {miembro} other {miembros}}"
@@ -920,6 +1013,27 @@
"dashboard.organizations.title": {
"message": "Organizaciones"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Marcar todo como leído"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Ver historial"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "No tienes notificaciones sin leer."
},
"dashboard.overview.notifications.error.loading": {
"message": "Error cargando notificaciones:"
},
"dashboard.overview.notifications.history.label": {
"message": "Historial"
},
"dashboard.overview.notifications.history.title": {
"message": "Historial de notificaciones"
},
"dashboard.overview.notifications.loading": {
"message": "Cargando notificaciones..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Puedes editar varios proyectos a la vez seleccionándolos a continuación."
},
@@ -1229,6 +1343,33 @@
"dashboard.withdraw.error.tax-form.title": {
"message": "Por favor, llena el formulario fiscal"
},
"discover.install.back-to-server": {
"message": "Volver al servidor"
},
"discover.install.back-to-setup": {
"message": "Volver al setup"
},
"discover.install.cancel-reset": {
"message": "Cancelar reinicio"
},
"discover.install.error.no-server-world": {
"message": "No hay mundos de servidores disponibles para la instalación."
},
"discover.install.error.unsupported-content-type": {
"message": "Este tipo de contenido no puede ser instalado a un servidor por búsqueda."
},
"discover.install.heading.reset-modpack": {
"message": "Seleccionando modpack para instalar antes del reinicio"
},
"discover.seo.description": {
"message": "Busca y navega miles de {projectType, select, mod {mods} modpack {modpacks} resourcepack {packs de recursos} shader {shaders} plugin {plugins} datapack {datapacks} other {proyectos}} para Minecraft en Modrinth con resultados de busqueda instantáneos y precisos. Nuestros filtradores te ayudarán a encontrar rápidamente los mejores {projectType, select, mod {mods} modpack {modpacks} resourcepack {packs de recursos} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}} para Minecraft."
},
"discover.seo.title": {
"message": "Buscar {projectType, select, mod {mods} modpack {modpacks} resourcepack {paquetes de recursos} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}}"
},
"discover.seo.title-with-query": {
"message": "Buscar {projectType, select, mod {mods} modpack {modpacks} resourcepack {paquetes de recursos} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}} | {query}"
},
"error.collection.404.list_item.1": {
"message": "Puede que hayas escrito mal la URL de la colección."
},
@@ -1395,7 +1536,7 @@
"message": "¿Dónde se encuentran los servidores de Modrinth Hosting? ¿Puedo elegir una región?"
},
"hosting-marketing.faq.location.answer": {
"message": "Actualmente disponemos de servidores en Norteamérica, Europa y el Sudeste Asiático entre los que puede elegir al realizar la compra. ¡En el futuro añadiremos más regiones! Si deseas cambiar de región, ponte en contacto con soporte."
"message": "Tenemos servidores disponibles a través de Norteamérica, Europa y el sudeste asiático que puedes seleccionar en el momento de tu compra. ¡Más regiones en el futuro! Si deseas cambiar tu región, por favor contacta con soporte."
},
"hosting-marketing.faq.versions-loaders": {
"message": "¿Qué versiones y loaders de Minecraft se pueden utilizar?"
@@ -1727,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "Por motivos de seguridad, Modrinth necesita que registres una dirección de correo electrónico en tu cuenta."
},
"layout.banner.build-fail.always-ignore": {
"message": "Ignorar siempre"
},
"layout.banner.build-fail.description": {
"message": "Esta implementación del frontend de Modrinth no pudo generar el estado desde la API. Esto puede deberse a una interrupción del servicio o a un error de configuración. Vuelve a construir cuando la API esté disponible. Códigos de error: {errors}; La URL actual de la API es: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Ignorar"
},
"layout.banner.build-fail.title": {
"message": "Error al generar el estado desde la API durante la compilación."
},
"layout.banner.preview.description": {
"message": "Si desea acceder al sitio web oficial de Modrinth, visite <link>https://modrinth.com</link>. El equipo de Modrinth utiliza esta versión preliminar para realizar pruebas. Se creó con <branch-link>{owner}/{branch}</branch-link> @ {commit}.."
"message": "Si buscas acceder al sitio oficial de Modrinth visita {url}. Este sitio de previsualización es usado por el staff de Modrinth para fines de pruebas. Fue creado usando <branch-link>{owner}/{branch}</branch-link> @{commit}."
},
"layout.banner.preview.title": {
"message": "Esta es una vista previa de la implementación del sitio web de Modrinth."
@@ -2564,6 +2711,84 @@
"project.license.title": {
"message": "Licencia"
},
"project.moderation.admonition.approved.body.private": {
"message": "Tu proyecto es privado, lo que significa que solo pueden acceder tú y las personas a las que invites."
},
"project.moderation.admonition.approved.body.public": {
"message": "Tu proyecto está publicado y aparece en las búsquedas de Modrinth."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "Tu proyecto no está listado, lo que significa que solo se puede acceder a él a través de un link directo y no aparece en las búsquedas de Modrinth."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "Puedes cambiar la visibilidad de tu proyecto en la <visibility-settings-link>configuración de visibilidad</visibility-settings-link> de tu proyecto."
},
"project.moderation.admonition.approved.header": {
"message": "Proyecto aprobado"
},
"project.moderation.admonition.draft.body": {
"message": "Este es un borrador de tu proyecto que nadie puede ver hasta que sea enviado para ser revisado y aprobado por el equipo de moderación de Modrinth."
},
"project.moderation.admonition.draft.header": {
"message": "Borrador"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Una vez que hayas completado todos los pasos necesarios y te hayas asegurado de que tu proyecto cumple con las <rules-link>Reglas de contenido</rules-link> de Modrinth, puedes enviar tu proyecto a revisión."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "Por favor resuelve todas las observaciones de moderación, incluyendo cualquiera listada abajo, antes de enviar de nuevo el proyecto."
},
"project.moderation.admonition.rejected.header": {
"message": "Cambios solicitados"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "Enviar en repetidas ocasiones tu proyecto sin atender antes todas las observaciones de moderación puede resultar en la suspensión de la cuenta."
},
"project.moderation.admonition.under-review.body.1": {
"message": "Tu proyecto está en lista de espera para ser revisado por el equipo de moderación de Modrinth."
},
"project.moderation.admonition.under-review.body.2": {
"message": "Tu proyecto será escaneado y después revisado por moderadores humanos para asegurarnos de que esté de acuerdo con las <rules-link>Reglas de contenido</rules-link> y los <terms-link>Términos de uso</terms-link> de Modrinth."
},
"project.moderation.admonition.under-review.body.3": {
"message": "Aún puedes modificar tu proyecto, no afectará tu posición en la cola."
},
"project.moderation.admonition.under-review.body.4": {
"message": "Buscamos revisar envíos en un plazo de 24-48 horas, pero algunos proyectos pueden sufrir retrasos. Esto no indica ningún problema con tu envío."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>¡Apreciamos tu paciencia mientras nuestros moderadores trabajan duro para mantener Modrinth seguro y estaremos encantados de poder ayudarte a compartir tu contenido! 💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Proyecto bajo revisión"
},
"project.moderation.admonition.withheld.body": {
"message": "Tu proyecto no aparecerá públicamente y solo se podrá acceder a él por un enlace directo.{requestedStatus, select,unlisted { Según tu <visibility-settings-link>configuración de visibilidad</visibility-settings-link>, es muy probable que no se necesite ninguna acción adicional.} other { Por favor resuelve todas las observaciones de moderación, incluyendo las listadas abajo, antes de enviar de nuevo el proyecto.}}"
},
"project.moderation.admonition.withheld.header": {
"message": "Deslistado por el staff"
},
"project.moderation.error.unauthorized": {
"message": "Sin autorización"
},
"project.moderation.thread.approved-warning": {
"message": "Este hilo no esta siendo monitorizado de manera activa, pero puede ser revisado para más información sobre tu proyecto de ser necesario."
},
"project.moderation.thread.help-center-note.1": {
"message": "Los moderadores de contenido no pueden dar soporte a la mayoría de los problemas y los mensajes de este hilo no notifican al staff."
},
"project.moderation.thread.help-center-note.2": {
"message": "Si necesitas ayuda o tienes consultas adicionales, por favor visita el <help-center-link>Centro de ayuda de Modrinth</help-center-link> y haz click en la burbuja azúl para contactar con soporte."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "Mostrar vista de miembro"
},
"project.moderation.thread.private-description": {
"message": "Este es un hilo de conversación con los moderadores de Modrinth. Podrían enviarte un mensaje con observaciones relacionadas a este proyecto."
},
"project.moderation.thread.title": {
"message": "Mensajes de moredación"
},
"project.moderation.title": {
"message": "Moderación"
},
@@ -3062,6 +3287,9 @@
"search.filter.locked.server.sync": {
"message": "Sincronizar con el servidor"
},
"servers.manage.content.title": {
"message": "Contenido - {serverName} - Modrinth"
},
"servers.notice.actions": {
"message": "Acciones"
},
@@ -3561,7 +3789,7 @@
"message": "Error al renovar la suscripción"
},
"settings.billing.pyro.resubscribe.request-submitted.text": {
"message": "Si el servidor se encuentra cancelado, puede tomar 10-15 minutos en preparar el servidor"
"message": "Si el servidor se encuentra cancelado, puede tomar de 10 a 15 minutos en preparar el servidor."
},
"settings.billing.pyro.resubscribe.request-submitted.title": {
"message": "Solicitud de renovación de suscripción enviada"
@@ -875,24 +875,6 @@
"dashboard.head-title": {
"message": "Panel de control"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Marcar todo como leido"
},
"dashboard.notifications.button.view-history": {
"message": "Ver historial"
},
"dashboard.notifications.empty.no-unread": {
"message": "No tienes ninguna notificación sin leer."
},
"dashboard.notifications.error.loading": {
"message": "Error al cargar las notificaciones:"
},
"dashboard.notifications.history.label": {
"message": "Historial"
},
"dashboard.notifications.history.title": {
"message": "Historial de notificaciones"
},
"dashboard.notifications.link.see-all": {
"message": "Ver todos"
},
@@ -902,9 +884,6 @@
"dashboard.notifications.link.view-more": {
"message": "Mostrar {extraNotifs} {extraNotifs, plural,one {notificación}other {otras notificaciones}}"
},
"dashboard.notifications.loading": {
"message": "Cargando notificaciones..."
},
"dashboard.organizations.button.create": {
"message": "Crear organización"
},
@@ -1388,9 +1367,6 @@
"hosting-marketing.faq.location": {
"message": "¿Dónde están localizados los servidores de Modrinth Hosting? ¿Puedo elegir la región?"
},
"hosting-marketing.faq.location.answer": {
"message": "Tenemos servidores disponibles en América del Norte, Europa y Sureste de Asia por el momento, que puedes elegir al momento de comprarlo. ¡Más regiones estarán disponibles en el futuro! Si te gustaría cambiar tu región por favor contáctate con soporte."
},
"hosting-marketing.faq.versions-loaders": {
"message": "¿Que versiones de Minecraft y loaders se pueden usar?"
},
@@ -1724,9 +1700,6 @@
"layout.banner.build-fail.title": {
"message": "Error al generar el estado desde la API durante la compilación."
},
"layout.banner.preview.description": {
"message": "Si quieres acceder al sitio web oficial de Modrinth, visita <link>https://modrinth.com</link>. El personal de Modrinth utiliza esta implementación de vista previa para fines de prueba. Se creó con <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Esta es una vista previa de la implementación del sitio web de Modrinth."
},
+336
View File
@@ -191,9 +191,21 @@
"app-marketing.hero.download-modrinth-app-for-os": {
"message": "Lataa Modrinth App alustalle {os}"
},
"app-marketing.hero.minecraft-screenshot-alt": {
"message": "Kuvakaappaus Cobblemon instanssin pää valikko näytöstä."
},
"app-marketing.hero.more-download-options": {
"message": "Lisää lataus vaihtoehtoja"
},
"app-marketing.hide-other-packages": {
"message": "Piilota muut paketit"
},
"app-marketing.not-recommended": {
"message": "Emme suosittele että käytät näitä ellet tiedä mitä teet."
},
"app-marketing.show-other-packages": {
"message": "Näytä muut paketit"
},
"auth.authorize.action.authorize": {
"message": "Valtuuta"
},
@@ -335,36 +347,171 @@
"collection.button.edit-icon": {
"message": "Muokkaa kuvaketta"
},
"collection.button.remove-icon": {
"message": "Poista kuvake"
},
"collection.button.remove-project": {
"message": "Poista projekti"
},
"collection.button.replace-icon": {
"message": "Korvaa kuvake"
},
"collection.button.select-icon": {
"message": "Valitse kuvake"
},
"collection.button.unfollow-project": {
"message": "Lopeta projektin seuraaminen"
},
"collection.delete-modal.description": {
"message": "Tämä poistaa pysyvästi tämän kokoelman. Tätä toimea ei voida peruuttaa."
},
"collection.delete-modal.title": {
"message": "Oletko varma että haluat poistaa tämän kokoelman?"
},
"collection.editing": {
"message": "Muokataan kokoelmaa"
},
"collection.error.not-found": {
"message": "Kokoelmaa ei löydy"
},
"collection.label.created-at": {
"message": "Luotu {ago}"
},
"collection.label.curated-by": {
"message": "Kuratoinut"
},
"collection.label.no-projects": {
"message": "Ei vielä projekteja kokelmassa"
},
"collection.label.projects-count": {
"message": "{count, plural, =0 {No projects yet} other {<stat>{count}</stat> {type}}}"
},
"collection.label.updated-at": {
"message": "Päivitetty {ago}"
},
"collection.return-link.dashboard-collections": {
"message": "Kokoelmasi"
},
"collection.return-link.user": {
"message": "{user}:n profiili"
},
"collection.title": {
"message": "{name} - kokoelma"
},
"conversation-thread.action.add-private-note": {
"message": "Lisää yksityinen muistiinpano"
},
"conversation-thread.action.approve": {
"message": "Hyväksy"
},
"conversation-thread.action.approve-with-reply": {
"message": "Hyväksy vastauksella"
},
"conversation-thread.action.close-thread": {
"message": "Sulje keskustelu"
},
"conversation-thread.action.close-with-reply": {
"message": "Sulje vastauksella"
},
"conversation-thread.action.reject": {
"message": "Hylkää"
},
"conversation-thread.action.reject-with-reply": {
"message": "Hylkää vastauksella"
},
"conversation-thread.action.reopen-thread": {
"message": "Avaa keskustelu uudelleen"
},
"conversation-thread.action.reply": {
"message": "Vastaa"
},
"conversation-thread.action.reply-to-thread": {
"message": "Vastaa keskusteluun"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Lähetä uudelleen arvioitavaksi"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Lähetä uudelleen arvioitavaksi vastauksella"
},
"conversation-thread.action.send": {
"message": "Lähetä"
},
"conversation-thread.action.send-to-review": {
"message": "Lähetä arvioitavaksi"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Lähetä arvioitavaksi vastauksella"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Vastaa keskusteluun..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Lähetä viesti..."
},
"conversation-thread.reply-modal.header": {
"message": "Vastaa keskusteluun"
},
"create.collection.collection-info": {
"message": "Sinun uusi kokoelma luodaan julkiseksi kokoelmaksi {count, plural, =0 {no projects} one {# project} other {# projects}}:lla. "
},
"create.collection.create-collection": {
"message": "Luo kokoelma"
},
"create.collection.name-label": {
"message": "Nimi"
},
"create.collection.name-placeholder": {
"message": "Syötä kokoelman nimi..."
},
"create.collection.summary-label": {
"message": "Yhteenveto"
},
"create.collection.title": {
"message": "Luodaan kokoelmaa"
},
"create.limit-alert.contact-support": {
"message": "Ota yhteyttä tukeen"
},
"create.limit-alert.type-collection": {
"message": "kokoelma"
},
"create.limit-alert.type-organization": {
"message": "organisaatio"
},
"create.limit-alert.type-plural-collection": {
"message": "kokoelmat"
},
"create.limit-alert.type-plural-organization": {
"message": "organisaatiot"
},
"create.limit-alert.type-plural-project": {
"message": "projektit"
},
"create.limit-alert.type-project": {
"message": "projekti"
},
"create.organization.create-organization": {
"message": "Luo organisaatio"
},
"create.organization.name-label": {
"message": "Nimi"
},
"create.organization.name-placeholder": {
"message": "Syötä organisaation nimi..."
},
"create.organization.summary-label": {
"message": "Yhteenveto"
},
"create.project.visibility-private": {
"message": "Yksityinen"
},
"create.project.visibility-public": {
"message": "Julkinen"
},
"create.project.visibility-unlisted": {
"message": "Piilotettu"
},
"dashboard.collections.button.create-new": {
"message": "Luo uusi"
},
@@ -374,18 +521,165 @@
"dashboard.collections.long-title": {
"message": "Kokoelmasi"
},
"dashboard.collections.sort.name-ascending": {
"message": "Nimi (A-Z)"
},
"dashboard.collections.sort.recently-created": {
"message": "Äskettäin luotu"
},
"dashboard.collections.sort.recently-updated": {
"message": "Äskettäin päivitetty"
},
"dashboard.creator-tax-form-modal.confirmation.download-button": {
"message": "Lataa {formType}"
},
"dashboard.creator-tax-form-modal.confirmation.title": {
"message": "Kaikki valmista! 🎉"
},
"dashboard.creator-tax-form-modal.entity.private-individual": {
"message": "Yksityishenkilö"
},
"dashboard.creator-tax-form-modal.header": {
"message": "Vero lomake"
},
"dashboard.creator-tax-form-modal.us-citizen.question": {
"message": "Oletko Yhdysvaltain kansalainen?"
},
"dashboard.creator-withdraw-modal.details-label": {
"message": "Lisätiedot"
},
"dashboard.creator-withdraw-modal.fee-breakdown-amount": {
"message": "Määrä"
},
"dashboard.creator-withdraw-modal.kyc.private-individual": {
"message": "Yksityishenkilö"
},
"dashboard.creator-withdraw-modal.muralpay-details.crypto-warning-header": {
"message": "Vahvista lompakkosi osoite"
},
"dashboard.creator-withdraw-modal.paypal-details.payment-method": {
"message": "Maksutapa"
},
"dashboard.creator-withdraw-modal.paypal-details.paypal-account": {
"message": "PayPal-tili"
},
"dashboard.creator-withdraw-modal.tremendous-details.unverified-email-header": {
"message": "Vavhistamaton sähköposti"
},
"dashboard.creator-withdraw-modal.tremendous-details.usd-paypal-warning-header": {
"message": "Matalammat maksut saatavilla"
},
"dashboard.head-title": {
"message": "Hallintapaneeli"
},
"dashboard.notifications.empty.no-unread": {
"message": "Sinulla ei ole lukemattomia ilmoituksia."
},
"dashboard.notifications.link.see-all": {
"message": "Näytä kaikki"
},
"dashboard.notifications.link.view-history": {
"message": "Näytä ilmoitushistoria"
},
"dashboard.organizations.button.create": {
"message": "Luo organisaatio"
},
"dashboard.organizations.empty.cta": {
"message": "Tee organisaatio!"
},
"dashboard.organizations.error.fetch": {
"message": "Organisaatioiden haku epäonnistui"
},
"dashboard.organizations.member-count": {
"message": "{count} {count, plural, one {jäsen} other {jäsentä}}"
},
"dashboard.projects.head-title": {
"message": "Projektit"
},
"dashboard.projects.links.and-more": {
"message": "ja {count} lisää..."
},
"dashboard.projects.links.button.clear-link": {
"message": "Tyhjennä linkki"
},
"dashboard.projects.links.button.edit": {
"message": "Muokkaa linkkejä"
},
"dashboard.projects.links.discord-invite.description": {
"message": "Kutsulinkki sinun Discord-palvelimellesi."
},
"dashboard.projects.links.discord-invite.label": {
"message": "Discord-kutsu"
},
"dashboard.projects.links.placeholder.cleared": {
"message": "Olemassa oleva linkki tyhjennetään"
},
"dashboard.projects.links.placeholder.valid-discord-url": {
"message": "Syötä kelvollinen Discord-kutsu URL"
},
"dashboard.projects.links.placeholder.valid-url": {
"message": "Syötä kelvollinen URL"
},
"dashboard.projects.links.show-all-projects": {
"message": "Näytä kaikki projektit"
},
"dashboard.projects.links.source-code.label": {
"message": "Lähdekoodi"
},
"dashboard.projects.links.wiki-page.label": {
"message": "Wikisivu"
},
"dashboard.projects.project.icon-alt": {
"message": "Kuvake projektille {title}"
},
"dashboard.projects.sort.ascending": {
"message": "Nouseva"
},
"dashboard.projects.sort.descending": {
"message": "Laskeva"
},
"dashboard.projects.sort.option.name": {
"message": "Nimi"
},
"dashboard.projects.sort.option.status": {
"message": "Tila"
},
"dashboard.projects.sort.option.type": {
"message": "Tyyppi"
},
"dashboard.projects.table.icon": {
"message": "Kuvake"
},
"dashboard.projects.table.id": {
"message": "ID"
},
"dashboard.projects.table.name": {
"message": "Nimi"
},
"dashboard.projects.table.status": {
"message": "Tila"
},
"dashboard.projects.table.type": {
"message": "Tyyppi"
},
"dashboard.report.title": {
"message": "Raportti {id}"
},
"dashboard.reports.active-title": {
"message": "Aktiiviset raportit"
},
"dashboard.reports.title": {
"message": "Raportit"
},
"dashboard.revenue.available-now": {
"message": "Saatavilla nyt"
},
"dashboard.revenue.processing": {
"message": "Prosessoidaan"
},
"dashboard.revenue.transactions.btn.download-csv": {
"message": "Lataa CSV-tiedostona"
},
"error.collection.404.list_item.1": {
"message": "Saatoit kirjoittaa kokoelman URL osoitteen väärin."
},
@@ -419,12 +713,51 @@
"error.project.404.list_title": {
"message": "Miksi?"
},
"error.project.404.title": {
"message": "Projektia ei löytynyt"
},
"error.user.404.list_title": {
"message": "Miksi?"
},
"error.user.404.title": {
"message": "Käyttäjää ei löytynyt"
},
"frog": {
"message": "Löysit sammakon! 🐸"
},
"frog.title": {
"message": "Sammakko"
},
"hosting-marketing.included.backups-included": {
"message": "Varmuuskopiot sisällyttäen"
},
"hosting-marketing.included.file-manager": {
"message": "Helppokäyttöinen tiedostoselain"
},
"hosting-marketing.included.file-manager.description": {
"message": "Etsi, hallinnoi, muokkaa ja lataa tiedostoja suoraan palvelimellesi helposti."
},
"hosting-marketing.included.help": {
"message": "Apua kun sitä tarvitset"
},
"hosting-marketing.included.help.description": {
"message": "Ota yhteyttä Modrinthin tiimiin milloin tahansa palvelinasioissa."
},
"hosting-marketing.included.sftp-access": {
"message": "SFTP pääsy"
},
"hosting-marketing.know-what-you-need": {
"message": "Tiedät jo mitä tarvitset?"
},
"hosting-marketing.medal.info": {
"message": "Kokeile ilmaista <orange>3Gt palvelinta</orange> 5 päivän ajan, jonka tarjoaa <orange>Medal</orange>"
},
"hosting-marketing.medal.learn-more": {
"message": "Lue lisää"
},
"hosting.plan.out-of-stock": {
"message": "Loppuunmyyty"
},
"landing.button.discover-mods": {
"message": "Löydä modeja"
},
@@ -512,6 +845,9 @@
"layout.action.new-project": {
"message": "Uusi projekti"
},
"layout.action.publish": {
"message": "Julkaise"
},
"layout.avatar.alt": {
"message": "Avatarisi"
},
@@ -875,24 +875,6 @@
"dashboard.head-title": {
"message": "Dashboard"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Tratuhing binasa na"
},
"dashboard.notifications.button.view-history": {
"message": "Tingnan ang kasaysayan"
},
"dashboard.notifications.empty.no-unread": {
"message": "Wala kang di-nababasang notipikasyon."
},
"dashboard.notifications.error.loading": {
"message": "Error sa paglo-load ng mga notipikasyon:"
},
"dashboard.notifications.history.label": {
"message": "Kasaysayan"
},
"dashboard.notifications.history.title": {
"message": "Kasaysayan ng notipikasyon"
},
"dashboard.notifications.link.see-all": {
"message": "Tingnan lahat"
},
@@ -902,9 +884,6 @@
"dashboard.notifications.link.view-more": {
"message": "Tingnan ang {extraNotifs} pang {extraNotifs, plural, other {notipikasyon}}"
},
"dashboard.notifications.loading": {
"message": "Naglo-load ang mga notipikasyon..."
},
"dashboard.organizations.button.create": {
"message": "Lumikha ng organisasyon"
},
@@ -1256,9 +1235,6 @@
"hosting-marketing.faq.location": {
"message": "Nasaan ang mga server ng Modrinth Hosting? Makapipili ba ako ng rehiyon?"
},
"hosting-marketing.faq.location.answer": {
"message": "Mayroon kaming mga server na magagamit sa Hilagang Amerika, Yuropa, at Timog-silangang Asya sa kasalukuyang sandali na maaari mong piliin pagkatapos bumili. Dadating ang higit pang rehiyon sa hinaharap! Kung nais mong magpalit ng rehiyon, mangyaring abutin ang suporta."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Ano bang bersiyon ng Minecraft at loader ang magagamit?"
},
@@ -1592,9 +1568,6 @@
"layout.banner.build-fail.title": {
"message": "Error sa pagbubuo ng estado galing sa API habang nagpapatayo."
},
"layout.banner.preview.description": {
"message": "Kung ibig mong maakses ang opisyal na website ng Modrinth, bisitahin ang <link>https://modrinth.com</link>. Ito ay isang pinakalat na pasilip na ginagamit lamang ng kawani ng Modrinth sa pagsusubok nito. Ito ay pinatayo gamit ang <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Ito ay isang pinakalat na pasilip ng website ng Modrinth."
},
+218 -20
View File
@@ -407,6 +407,117 @@
"collection.title": {
"message": "{name} - Collection"
},
"conversation-thread.action.add-private-note": {
"message": "Ajouter une note privée"
},
"conversation-thread.action.approve": {
"message": "Approuver"
},
"conversation-thread.action.approve-with-reply": {
"message": "Approuver avec réponse"
},
"conversation-thread.action.close-thread": {
"message": "Fermer le fil"
},
"conversation-thread.action.close-with-reply": {
"message": "Fermer avec réponse"
},
"conversation-thread.action.reject": {
"message": "Rejeter"
},
"conversation-thread.action.reject-with-reply": {
"message": "Rejeter avec réponse"
},
"conversation-thread.action.reopen-thread": {
"message": "Rouvrir le fil"
},
"conversation-thread.action.reply": {
"message": "Répondre"
},
"conversation-thread.action.reply-to-thread": {
"message": "Répondre au fil"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Soumettre de nouveau à la révision"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Soumettre de nouveau avec réponse"
},
"conversation-thread.action.send": {
"message": "Envoyer"
},
"conversation-thread.action.send-to-review": {
"message": "Envoyer à la révision"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Envoyer"
},
"conversation-thread.action.set-to-draft": {
"message": "Ajouter aux brouillons"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "Ajouter aux brouillons avec réponse"
},
"conversation-thread.action.withhold": {
"message": "Retenir"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Retenir avec réponse"
},
"conversation-thread.closed-thread.description": {
"message": "Ce fil est fermé et aucun message ne peut y être envoyé."
},
"conversation-thread.error.closing-report": {
"message": "Impossible de fermer le rapport"
},
"conversation-thread.error.reopening-report": {
"message": "Impossible de rouvrir le rapport"
},
"conversation-thread.error.sending-message": {
"message": "Impossible d'envoyer le message"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Répondre au fil..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Envoyer un message..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Confirmer que les modérateurs ne surveillent pas activement cela"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Je comprends que les modérateurs ne sont pas actifs sur ce fil."
},
"conversation-thread.reply-modal.description": {
"message": "Votre projet est déjà approuvé. De ce fait, l'équipe de modération ne surveillent pas beaucoup ce fil. En revanche, ils pourront quand même voir votre message s'il y a un problème avec votre projet."
},
"conversation-thread.reply-modal.header": {
"message": "Répondre au fil"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Si vous devez entrer en contact avec l'équipe de modération, veuillez utiliser le <help-center-link>Modrinth Help Center</help-center-link> et cliquez sur la bulle bleue dans le coin inférieur droit pour contacter le support."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "Confirmer que j'ai adressé les messages des modérateurs"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Je confirme que j'ai bel et bien adressé les messages des modérateurs."
},
"conversation-thread.resubmit-modal.description": {
"message": "Vous soumettez <project-title>{projectTitle}</project-title> à revoir de nouveau par les modérateurs."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Soumettre de nouveau à la révision"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Nouvelle soumission à la révision en cours"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "Assurez-vous davoir répondu à tous les commentaires de l’équipe de modération."
},
"conversation-thread.resubmit-modal.warning": {
"message": "Les soumissions répétées sans répondre aux commentaires des modérateurs peuvent entraîner une suspension de compte."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Les fichiers supplémentaires servent à fournir des ressources complémentaires comme le code source, et non des versions alternatives ou des variantes."
},
@@ -875,24 +986,9 @@
"dashboard.head-title": {
"message": "Tableau de bord"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Marquer tout comme lu"
},
"dashboard.notifications.button.view-history": {
"message": "Voir l'historique"
},
"dashboard.notifications.empty.no-unread": {
"message": "Vous n'avez pas de notifications non lues."
},
"dashboard.notifications.error.loading": {
"message": "Échec lors du chargement des notifications :"
},
"dashboard.notifications.history.label": {
"message": "Historique"
},
"dashboard.notifications.history.title": {
"message": "Historique des notifications"
},
"dashboard.notifications.link.see-all": {
"message": "Voir tout"
},
@@ -902,9 +998,6 @@
"dashboard.notifications.link.view-more": {
"message": "Voir {extraNotifs} {extraNotifs, plural, one {notification} other {notifications}} de plus"
},
"dashboard.notifications.loading": {
"message": "Chargement des notifications..."
},
"dashboard.organizations.button.create": {
"message": "Créer une organisation"
},
@@ -920,6 +1013,27 @@
"dashboard.organizations.title": {
"message": "Organisations"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Marquer tout comme lu"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Voire l'historique"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Vous n'avez pas de notifications non lues."
},
"dashboard.overview.notifications.error.loading": {
"message": "Erreur en essayant de charger les notifications :"
},
"dashboard.overview.notifications.history.label": {
"message": "Historique"
},
"dashboard.overview.notifications.history.title": {
"message": "Historique des notifications"
},
"dashboard.overview.notifications.loading": {
"message": "Chargement des notifications..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Vous pouvez modifier plusieurs projets en même temps en les sélectionnant ci-dessous."
},
@@ -1422,7 +1536,7 @@
"message": "Où se trouvent les serveurs de Modrinth Hosting ? Puis-je choisir une région ?"
},
"hosting-marketing.faq.location.answer": {
"message": "Nous avons des serveurs disponibles en Amérique du Nord, en Europe et en Asie du Sud-Est en ce moment-même que vous pouvez choisir dès l'achat. Plus de régions à venir dans le futur ! Si vous souhaitez changer de région, veuillez contacter le support."
"message": "Nous avons des serveurs disponibles en Amérique du Nord, en Europe et en Asie du Sud-Est pour le moment que vous pouvez choisir lors de l'achat. Plus de régions sont à venir ! Si vous voulez changer de région, contactez le support."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Quelles versions de Minecraft et loaders peuvent-être utilisés ?"
@@ -1754,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "Pour des raisons de sécurité, Modrinth a besoin que vous enregistriez une adresse e-mail sur votre compte."
},
"layout.banner.build-fail.always-ignore": {
"message": "Toujours ignorer"
},
"layout.banner.build-fail.description": {
"message": "Ce déploiement du frontend de Modrinth na pas pu générer l’état à partir de lAPI. Cela peut être dû à une panne ou à une erreur de configuration. Rebuild lorsque lAPI sera disponible. Codes derreur : {errors} ; LURL actuelle de lAPI est : {url}"
},
"layout.banner.build-fail.ignore": {
"message": "ignorer"
},
"layout.banner.build-fail.title": {
"message": "Erreur lors de la génération de l’état à partir de lAPI pendant la construction."
},
"layout.banner.preview.description": {
"message": "Si vous souhaitez accéder au site officiel de Modrinth, visitez <link>https://modrinth.com</link>. Ce déploiement d'aperçu est utilisé par le personnel de Modrinth à des fins de test. Il a été construit en utilisant <branch-link>{owner}/{branch}</branch-link> @ {commit}."
"message": "Si vous voulez accéder au site officiel de Modrinth, visitez {url}. Cet aperçu\nde déploiement est utilisée par le staff de Modrinth pour des raisons d'essai.\nIl a été construit en utilisant <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Ceci est un déploiement de prévisualisation du site Modrinth."
@@ -2591,6 +2711,84 @@
"project.license.title": {
"message": "License"
},
"project.moderation.admonition.approved.body.private": {
"message": "Votre projet est privé, il n'est accessible que par vous et les personnes que vous invitez."
},
"project.moderation.admonition.approved.body.public": {
"message": "Votre projet est publié et est découvrable sur Modrinth."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "Votre projet est non répertorié, ce qui signifie qu'il n'est accessible qu'avec un lien direct et ne sera pas découvrable sur Modrinth."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "Vous pouvez changer la visibilité de votre projet dans les <visibility-settings-link>paramètres de visibilité</visibility-settings-link> de votre projet."
},
"project.moderation.admonition.approved.header": {
"message": "Projet approuvé"
},
"project.moderation.admonition.draft.body": {
"message": "Ce projet est un brouillon et ne peut être vu par les autres jusqu'à ce qu'il soit soumis à la révision et approuvé par les modérateurs de Modrinth."
},
"project.moderation.admonition.draft.header": {
"message": "Brouillon"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Une fois que vous avez terminé toutes les étapes requises et que vous vous êtes assuré que votre projet est conforme aux <rules-link>Règles de contenu</rules-link>, vous pouvez soumettre votre projet pour examen."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "Veuillez répondre à toutes les préoccupations de modération, y compris les problèmes énumérés dans les messages ci-dessous, avant de soumettre à nouveau ce projet."
},
"project.moderation.admonition.rejected.header": {
"message": "Changements demandés"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "Soumettre à plusieurs reprises votre projet sans répondre à toutes les préoccupations de modération peut d'abord entraîner une suspension de compte."
},
"project.moderation.admonition.under-review.body.1": {
"message": "Votre projet est en file d'attente pour être examiné par l'équipe de modération de Modrinth."
},
"project.moderation.admonition.under-review.body.2": {
"message": "Votre projet sera scanné puis examiné par les modérateurs humains pour s'assurer qu'il répond aux règles des <rules-link>règle du contenu</rules-link> et des <terms-link>conditions d'utilisation</terms-link> de Modrinth."
},
"project.moderation.admonition.under-review.body.3": {
"message": "Vous pouvez toujours modifier votre projet, cela n'affectera pas votre position dans la file d'attente."
},
"project.moderation.admonition.under-review.body.4": {
"message": "Nous visons à examiner les soumissions dans les 24 à 48 heures, mais certains projets peuvent être menacés. Cela ne reflète pas un problème avec votre soumission."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>Nous apprécions votre patience pendant que nos modérateurs travaillent dur pour garder Modrinth en sécurité, et nous sommes impatients de vous aider à partager votre contenu !</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Projet en cours de révision"
},
"project.moderation.admonition.withheld.body": {
"message": "Votre projet n'apparaîtra pas en public et ne peut être accédé qu'avec un lien direct. {requestedStatus, select, unlisted {Vu vos <visibility-settings-link>paramètres de visibilité </visibility-settings-link> sélectionnés, il est fort probable qu'aucune action ne soit nécessaire.} other {Veuillez répondre à toutes les préoccupations de modération, y compris tout problème énuméré dans les messages ci-dessous avant de soumettre à nouveau ce projet.}}"
},
"project.moderation.admonition.withheld.header": {
"message": "Non répertorié par le personnel"
},
"project.moderation.error.unauthorized": {
"message": "Non autorisé"
},
"project.moderation.thread.approved-warning": {
"message": "Ce fil nest pas surveillé activement, mais peut être examiné pour obtenir des informations sur votre projet si nécessaire."
},
"project.moderation.thread.help-center-note.1": {
"message": "Les modérateurs de contenu ne peuvent pas fournir de support pour la plupart des problèmes et les messages à ce fil ne notifient pas le personnel."
},
"project.moderation.thread.help-center-note.2": {
"message": "Si vous avez besoin d'aide ou si vous avez des demandes de renseignements supplémentaires, veuillez visiter le <help-center-link>Modrinth Help Center</help-center-link> et cliquez sur la bulle bleue pour contacter le support."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "Montrer l'interface des membres"
},
"project.moderation.thread.private-description": {
"message": "Il s'agit d'un fil de conversation privé avec les modérateurs du Modrinthe. Ils peuvent vous envoyer un message avec des problèmes concernant ce projet."
},
"project.moderation.thread.title": {
"message": "Messages de modération"
},
"project.moderation.title": {
"message": "Modération"
},
@@ -1163,9 +1163,6 @@
"hosting-marketing.faq.location": {
"message": "היכן ממוקמים שרתי האחסון של Modrinth? האם ניתן לבחור אזור?"
},
"hosting-marketing.faq.location.answer": {
"message": "כרגע זמינים עבורכם שרתים בצפון אמריקה, אירופה ודרום-מזרח אסיה, אותם ניתן לבחור בעמד הרכישה. אזורים נוספים יתווספו בעתיד! אם תרצו להחליף את האזור שלכם, אנא צרו קשר עם התמיכה."
},
"hosting-marketing.faq.versions-loaders": {
"message": "באילו גרסאות של מיינקראפט ובאילו Loaders ניתן להשתמש?"
},
@@ -1499,9 +1496,6 @@
"layout.banner.build-fail.title": {
"message": "שגיאה ביצירת נתונים מהAPI במהלך הבנייה."
},
"layout.banner.preview.description": {
"message": "אם התכוונת לגשת לאתר הרשמי של Modrinth, בקר בכתובת <link>https://modrinth.com</link>. פריסת תצוגה מקדימה זו משמשת את צוות Modrinth למטרות בדיקה בלבד. היא נבנתה באמצעות <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "זוהי פריסת תצוגה מקדימה של אתר Modrinth."
},
+215 -38
View File
@@ -258,10 +258,10 @@
"message": "Jelszavad visszaállítása"
},
"auth.sign-in.2fa.description": {
"message": "Kérk írja be a kétlépcsős hitelesítés kódját a folytatáshoz."
"message": "Kérlek írd be a kétlépcsős hitelesítés kódját a folytatáshoz."
},
"auth.sign-in.2fa.label": {
"message": "Írja be a kétlépcsős hitelesítés kódját"
"message": "Írd be a kétlépcsős hitelesítés kódját"
},
"auth.sign-in.2fa.placeholder": {
"message": "Kód beírása..."
@@ -291,7 +291,7 @@
"message": "Már van fiókod?"
},
"auth.sign-up.subscribe.label": {
"message": "Iratkozzon fel a Modrinth frissítéseiről szóló értesítésekre"
"message": "Feliratkozás a Modrinth híreire és frissítéseire"
},
"auth.sign-up.title": {
"message": "Regisztráció"
@@ -333,7 +333,7 @@
"message": "Email-cím hitelesítése"
},
"auth.welcome.checkbox.subscribe": {
"message": "Iratkozzon fel a Modrinth frissítéseiről szóló értesítésekre"
"message": "Feliratkozás a Modrinth híreire és frissítéseire"
},
"auth.welcome.description": {
"message": "Most már része vagy annak a fantasztikus fejlesztők és felfedezők közösségének, akik már építenek, letöltenek és naprakészek maradnak a csodálatos modokkal kapcsolatban."
@@ -407,6 +407,87 @@
"collection.title": {
"message": "{name} - Gyűjtemény"
},
"conversation-thread.action.add-private-note": {
"message": "Privát megjegyzés"
},
"conversation-thread.action.approve": {
"message": "Jóváhagyás"
},
"conversation-thread.action.approve-with-reply": {
"message": "Jóváhagyás és válasz"
},
"conversation-thread.action.close-thread": {
"message": "Gondolatmenet lezárása"
},
"conversation-thread.action.close-with-reply": {
"message": "Bezárás és válasz"
},
"conversation-thread.action.reject": {
"message": "Elutasítás"
},
"conversation-thread.action.reject-with-reply": {
"message": "Elutasítás és válasz"
},
"conversation-thread.action.reopen-thread": {
"message": "Szál újramegnyitása"
},
"conversation-thread.action.reply": {
"message": "Válasz"
},
"conversation-thread.action.reply-to-thread": {
"message": "Válasz a beszélgetésre"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Benyújtás újra felülvizsgálatra"
},
"conversation-thread.action.send": {
"message": "Küldés"
},
"conversation-thread.action.send-to-review": {
"message": "Küldés áttekintésre"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Küldés áttekintésre válasszal"
},
"conversation-thread.action.set-to-draft": {
"message": "Beállítás vázlatként"
},
"conversation-thread.action.withhold": {
"message": "Visszatartás"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Visszatartás és válasz"
},
"conversation-thread.error.closing-report": {
"message": "Hiba a jelentés bezárásában"
},
"conversation-thread.error.reopening-report": {
"message": "Hiba a jelentés újranyitásában"
},
"conversation-thread.error.sending-message": {
"message": "Hiba történt az üzenet elküldésekor"
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Üzenet írása..."
},
"conversation-thread.reply-modal.description": {
"message": "A projekted már jóváhagyásra került, ezért a moderátorcsapat nem követi aktívan ezt a témát. Ugyanakkor előfordulhat, hogy meglátják az üzenetedet, ha valami probléma adódik a projekteddel kapcsolatban."
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Ha kapcsolatba szeretnél lépni a moderátorcsapattal, kérjük, használd a <help-center-link>Modrinth Súgó</help-center-link> oldalt, és kattints a jobb alsó sarokban található kék buborékra az ügyfélszolgálat elérése érdekében."
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Megerősítem, hogy a moderátorok észrevételeit megfelelően figyelembe vettem."
},
"conversation-thread.resubmit-modal.description": {
"message": "A(z) <project-title>{projectTitle}</project-title> projektet újra benyújtod a moderátorok felülvizsgálatára."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Benyújtás újra felülvizsgálatra"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Benyújtás felülvizsgálatra"
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "A kiegészítő fájlok olyan kiegészítő forrásokhoz tartoznak, mint például a forráskód, nem pedig alternatív verziókhoz vagy változatokhoz."
},
@@ -474,7 +555,7 @@
"message": "Név"
},
"create.organization.name-placeholder": {
"message": "Adj meg a szerverzetednek egy nevet..."
"message": "Adj meg a szervezetednek egy nevet..."
},
"create.organization.ownership-info": {
"message": "Át fogod ruházni a tulajdonjogod erre a szervezetre, de már meghívhatsz másokat és átruházhatod a tulajdonjogot bármikor."
@@ -872,24 +953,9 @@
"dashboard.head-title": {
"message": "Irányítópult"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Összes megjelölése olvasottként"
},
"dashboard.notifications.button.view-history": {
"message": "Előzmények megtekintése"
},
"dashboard.notifications.empty.no-unread": {
"message": "Nincsenek olvasatlan értesítéseid."
},
"dashboard.notifications.error.loading": {
"message": "Hiba az értesítések betöltése során:"
},
"dashboard.notifications.history.label": {
"message": "Előzmények"
},
"dashboard.notifications.history.title": {
"message": "Értesítési előzmények"
},
"dashboard.notifications.link.see-all": {
"message": "Összes megtekintése"
},
@@ -899,9 +965,6 @@
"dashboard.notifications.link.view-more": {
"message": "További {extraNotifs} értesítés megtekintése"
},
"dashboard.notifications.loading": {
"message": "Értesítések betöltése"
},
"dashboard.organizations.button.create": {
"message": "Szervezet létrehozása"
},
@@ -914,6 +977,27 @@
"dashboard.organizations.title": {
"message": "Szervezetek"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Összes megjelölése olvasottként"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Előzmények megtekintése"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Nincsenek olvasatlan értesítéseid."
},
"dashboard.overview.notifications.error.loading": {
"message": "Hiba az értesítések betöltése során:"
},
"dashboard.overview.notifications.history.label": {
"message": "Előzmények"
},
"dashboard.overview.notifications.history.title": {
"message": "Értesítési előzmények"
},
"dashboard.overview.notifications.loading": {
"message": "Értesítések betöltése..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Több projektet is szerkeszthetsz egyszerre, ha kiválasztod őket alább."
},
@@ -924,10 +1008,10 @@
"message": "Projektek"
},
"dashboard.projects.links.and-more": {
"message": "és még {count} további..."
"message": "és még {count} másik..."
},
"dashboard.projects.links.button.clear-link": {
"message": "Link törlése"
"message": "Hivatkozás törlése"
},
"dashboard.projects.links.button.edit": {
"message": "Linkek szerkesztése"
@@ -974,6 +1058,9 @@
"dashboard.projects.project.moderator-message-aria": {
"message": "A projekt üzenetet kapott a moderátoroktól. További információkért nézd meg a projektet."
},
"dashboard.projects.project.review-environment-metadata": {
"message": "Kérlek ellenőrizd a környezeti metaadatokat"
},
"dashboard.projects.sort.ascending": {
"message": "Növekvő"
},
@@ -1211,6 +1298,27 @@
"discover.install.back-to-server": {
"message": "Vissza a szerverhez"
},
"discover.install.back-to-setup": {
"message": "Vissza a beállításhoz"
},
"discover.install.cancel-reset": {
"message": "Visszaállítás visszavonása"
},
"discover.install.error.no-server-world": {
"message": "Nem található szerver világ ami letölthető."
},
"discover.install.error.unsupported-content-type": {
"message": "Ez a tartalomtípus nem telepíthető a szerverre a „” menüpontból."
},
"discover.seo.description": {
"message": "Keress és böngéssz több ezer Minecraft-{projectType, select, mod {mod} modpack {modcsomag} resourcepack {forráscsomag} shader {shader} plugin {bővítmény} datapack {adatcsomag} other {projekt}} között a Modrinthon gyors és pontos keresési találatokkal. Szűrőink segítenek gyorsan megtalálni a legjobb Minecraft-{projectType, select, mod {modokat} modpack {modcsomagokat} resourcepack {forráscsomagokat} shader {shadereket} plugin {bővítményeket} datapack {adatcsomagokat} other {projekteket}}."
},
"discover.seo.title": {
"message": "{projectType, select, mod {Modok} modpack {Modcsomagok} resourcepack {Forráscsomagok} shader {Shaderek} plugin {Bővítmények} datapack {Adatcsomagok} other {Projektek}} keresése"
},
"discover.seo.title-with-query": {
"message": "{projectType, select, mod {Modok} modpack {Modcsomagok} resourcepack {Forráscsomagok} shader {Shaderek} plugin {Bővítmények} datapack {Adatcsomagok} other {Projektek}} keresése | {query}"
},
"error.collection.404.list_item.1": {
"message": "Elírhatad a gyűjtemémyed linkjét."
},
@@ -1226,6 +1334,12 @@
"error.collection.404.title": {
"message": "Nem található gyűjtemény"
},
"error.generic.401.signed-in-as": {
"message": "Jelenleg a következőként vagy bejelentkezve:"
},
"error.generic.401.title": {
"message": "Nincs hozzáférésed ehhez az oldalhoz"
},
"error.generic.404.subtitle": {
"message": "Ez az oldal ami iránt érdeklődsz úgy látszik, hogy nem létezik."
},
@@ -1370,9 +1484,6 @@
"hosting-marketing.faq.location": {
"message": "Hol találhatók a Modrinth Hosting szerverei? Kiválaszthatom a régiót?"
},
"hosting-marketing.faq.location.answer": {
"message": "Jelenleg Észak-Amerikában, Európában és Délkelet-Ázsiában állnak rendelkezésre szerverek, amelyek közül vásárláskor választhatsz. A jövőben további régiók is elérhetővé válnak! Ha szeretnéd megváltoztatni a régiót, vedd fel a kapcsolatot az ügyfélszolgálattal."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Melyik Minecraft verziók és betöltők használhatók?"
},
@@ -1641,7 +1752,7 @@
"message": "Játékosoknak"
},
"landing.section.for-players.tagline": {
"message": "Fedez fel több mint {count, number} alkotást"
"message": "Fedezz fel több mint {count, number} alkotást"
},
"landing.subheading": {
"message": "Fedezz fel, játssz és ossz meg Minecraft-tartalmakat a közösség számára létrehozott nyílt forráskódú platformunkon."
@@ -1652,6 +1763,9 @@
"layout.action.create-new": {
"message": "Új létrehozása..."
},
"layout.action.external-projects": {
"message": "Külső projektek"
},
"layout.action.file-lookup": {
"message": "Fájl keresés"
},
@@ -1700,17 +1814,23 @@
"layout.banner.add-email.description": {
"message": "Biztonsági okok miatt a Modrinthon kell egy e-mail cím a fiókodhoz."
},
"layout.banner.build-fail.always-ignore": {
"message": "Mindig mellőzd"
},
"layout.banner.build-fail.description": {
"message": "A Modrinth felhasználói felületének jelenlegi telepítése nem tudta az API-ból lekérni az állapotadatokat. Ennek oka lehet egy szolgáltatáskimaradás vagy konfigurációs hiba. Kérünk, próbáld meg újra, amikor az API újra elérhetővé válik. Hibakódok: {errors}; Az API jelenlegi linkje: {url}"
"message": "A Modrinth felhasználói felületének jelenlegi telepítése nem tudta az API-ból lekérni az állapotadatokat. Ennek oka lehet egy szolgáltatáskimaradás vagy konfigurációs hiba. Kérlek próbáld meg újra, amikor az API újra elérhetővé válik. Hibakódok: {errors}; Az API jelenlegi linkje: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Mellőz"
},
"layout.banner.build-fail.title": {
"message": "Hiba történt az API állapotának generálása közben a fordítás során."
},
"layout.banner.preview.description": {
"message": "Ha a hivatalos Modrinth weboldalt szeretnéd elérni, látogass el az <link>https://modrinth.com</link> oldalra. Ezt az előzetes telepítést a Modrinth munkatársai tesztelési célokra használják. A <branch-link>{owner}/{branch</branch-link> @ {commit} használatával készült."
"message": "Ha a hivatalos Modrinth weboldalt szeretnéd elérni, látogass el a {url} oldalra. Ezt az előzetes verziót a Modrinth munkatársai tesztelési célokra használják. A <branch-link>{owner}/{branch</branch-link> @ {commit} használatával készült."
},
"layout.banner.preview.title": {
"message": "Ez a Modrinth weboldal előzetes telepítése."
"message": "Ez a Modrinth weboldal előzetes verziója."
},
"layout.banner.staging.description": {
"message": "A tesztelési környezet teljesen elkülönül az éles Modrinth adatbázistól. Ezt tesztelési és hibakeresési célokra használják, és a Modrinth backend vagy frontend fejlesztés alatt álló, az éles példánynál újabb verzióit futtathatja."
@@ -1904,12 +2024,18 @@
"moderation.moderate": {
"message": "Moderált"
},
"moderation.page.external-projects": {
"message": "Külső projektek"
},
"moderation.page.projects": {
"message": "Projektek"
},
"moderation.page.reports": {
"message": "Jelentések"
},
"moderation.page.technicalReview": {
"message": "Technikai áttekintés"
},
"muralpay.account-type.checking": {
"message": "Ellenőrzés"
},
@@ -2478,7 +2604,7 @@
"message": "Játékverziók keresése..."
},
"project.download.search-game-versions-label": {
"message": "Játékverziók keresése"
"message": "Játékverziók keresése..."
},
"project.download.select-game-version": {
"message": "Játékverzió kiválasztása"
@@ -2505,10 +2631,10 @@
"message": "Átdolgoztuk a Modrinth Környezetek rendszerét, és új lehetőségek érhetők el. Kérjük, ellenőrizd, hogy a metaadatok helyesek-e."
},
"project.environment.migration.review-button": {
"message": "Környezet beállítások Átnézése"
"message": "Környezeti beállítások áttekintése"
},
"project.environment.migration.title": {
"message": "Kérjük, tekintse át a környezet metaadatait"
"message": "Kérlek tekintsd át a környezeti metaadatokat"
},
"project.error.loading": {
"message": "Hiba a projektadatok {message} betöltése közben"
@@ -2531,6 +2657,33 @@
"project.license.title": {
"message": "Licensz"
},
"project.moderation.admonition.approved.body.private": {
"message": "A projekted privát, vagyis csak te és az általad meghívott személyek férhetnek hozzá."
},
"project.moderation.admonition.approved.header": {
"message": "Projekt jóváhagyva"
},
"project.moderation.admonition.draft.body": {
"message": "Ez egy projektvázlat, amelyet mások nem láthatnak, amíg azt felülvizsgálatra nem nyújtják be, és a Modrinth moderátori csapata jóvá nem hagyja."
},
"project.moderation.admonition.draft.header": {
"message": "Projektvázlat"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Miután elvégezted az összes szükséges lépést, és meggyőződtél arról, hogy a projekted megfelel a Modrinth <rules-link>Tartalmi szabályainak</rules-link>, benyújthatod a projektedet felülvizsgálatra."
},
"project.moderation.admonition.rejected.header": {
"message": "Változtatások kérve lettek"
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>Köszönjük türelmedet, amíg moderátoraink keményen dolgoznak a Modrinth biztonságának fenntartásán, és alig várjuk, hogy segíthessünk tartalmaid megosztásában! 💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Projekt áttekintés alatt"
},
"project.moderation.thread.title": {
"message": "Moderációs üzenetek"
},
"project.moderation.title": {
"message": "Moderáció"
},
@@ -2594,6 +2747,18 @@
"project.settings.general.url.title": {
"message": "Link"
},
"project.settings.permissions.empty-state.description": {
"message": "Egyik verziód sem tartalmaz külső tartalmat, így nem kell aggódnod a jogosultságok beszerzése miatt."
},
"project.settings.permissions.empty-state.heading": {
"message": "Kész is van!"
},
"project.settings.permissions.learn-more": {
"message": "További információ"
},
"project.settings.permissions.search-placeholder": {
"message": "Keresés {count} külső projekt között..."
},
"project.settings.title": {
"message": "Beállítások"
},
@@ -2612,6 +2777,15 @@
"project.versions.title": {
"message": "Verziók"
},
"project.versions.withheld-versions-warning.description": {
"message": "{count, plural, one {Ez a verzió} other {Ezek a verziók}} jelenleg vissza van tartva, és nem érhető{count, plural, one {} other {k}} el nyilvánosan. Kérjük, igazold, hogy engedéllyel rendelkezel a modcsomag {count, plural, one {verziójában} other {verzióiban}} található bizonyos fájlok terjesztésére."
},
"project.versions.withheld-versions-warning.resolve-button": {
"message": "Megoldás"
},
"project.versions.withheld-versions-warning.title": {
"message": "{count, plural, one {A(z) {version_name} verzió} other {A verziók}} ismeretlen beágyazott tartalom miatt vissza lett{count, plural, one {} other {ek}} tartva"
},
"report.already-reported": {
"message": "Már feljelentetted ezt: {title}"
},
@@ -2981,6 +3155,9 @@
"search.filter.locked.server.sync": {
"message": "Szinkronizálás a szerverrel"
},
"servers.manage.content.title": {
"message": "Tartalom {serverName} Modrinth"
},
"servers.notice.actions": {
"message": "Műveletek"
},
@@ -3318,10 +3495,10 @@
"message": "által"
},
"settings.authorizations.description": {
"message": "Amikor engedélyezel egy alkalmazást a Modrinth-fiókjoddal, hozzáférést biztosítasz számára a fiókodhoz. A fiókodhoz való hozzáférést bármikor kezelheted és ellenőrizheted itt."
"message": "Amikor engedélyezel egy alkalmazást a Modrinth fiókoddal, hozzáférést biztosítasz számára a fiókodhoz. A fiókodhoz való hozzáférést bármikor kezelheted és ellenőrizheted itt."
},
"settings.authorizations.empty-state": {
"message": "Jelenleg nem tudjuk megjeleníteni a jogosult alkalmazásait, dolgozunk a probléma megoldásán. Kérjük, látogassa meg ezt az oldalt később!"
"message": "Jelenleg nem tudjuk megjeleníteni az azonosított alkalmazásokat, dolgozunk a probléma megoldásán. Kérlek látogasd meg ezt az oldalt később!"
},
"settings.authorizations.head-title": {
"message": "Engedélyek"
@@ -3699,7 +3876,7 @@
"message": "Bemutatkozás"
},
"settings.profile.description": {
"message": "A rofiladataid nyilvánosan megtekinthetők a Modrinth oldalon és a <docs-link>Modrinth API</docs-link>-n keresztül."
"message": "A profiladataid nyilvánosan megtekinthetők a Modrinthon és a <docs-link>Modrinth API</docs-link>-n keresztül."
},
"settings.profile.head-title": {
"message": "Profilbeállítások"
@@ -1163,9 +1163,6 @@
"hosting-marketing.faq.location": {
"message": "Di mana server Modrinth Hosting terletak? Dapatkah saya memilih wilayah?"
},
"hosting-marketing.faq.location.answer": {
"message": "Server kami tersedia di Amerika Utara, Eropa, dan Asia Tenggara dan Anda dapat memilihnya saat membeli. Wilayah-wilayah lain akan segera hadir di masa mendatang! Bila Anda ingin mengganti wilayah Anda, mohon hubungi dukungan."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Versi dan pemuat Minecraft apa sajakah yang dapat digunakan?"
},
@@ -1499,9 +1496,6 @@
"layout.banner.build-fail.title": {
"message": "Terjadi kesalahan saat menghasilkan keadaan dari API saat membangun."
},
"layout.banner.preview.description": {
"message": "Bila Anda bermaksud untuk mengakses situs resmi Modrinth, kunjungi <link>https://modrinth.com</link>. Penerapan pratinjau ini digunakan oleh staf Modrinth untuk tujuan pengujian dan dibangun menggunakan <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Ini adalah penerapan pratinjau dari situs web Modrinth."
},
+226 -28
View File
@@ -407,6 +407,117 @@
"collection.title": {
"message": "{name} - Raccolta"
},
"conversation-thread.action.add-private-note": {
"message": "Aggiungi nota privata"
},
"conversation-thread.action.approve": {
"message": "Approva"
},
"conversation-thread.action.approve-with-reply": {
"message": "Approva con risposta"
},
"conversation-thread.action.close-thread": {
"message": "Chiudi thread"
},
"conversation-thread.action.close-with-reply": {
"message": "Chiudi con risposta"
},
"conversation-thread.action.reject": {
"message": "Rifiuta"
},
"conversation-thread.action.reject-with-reply": {
"message": "Rifiuta con risposta"
},
"conversation-thread.action.reopen-thread": {
"message": "Riapri thread"
},
"conversation-thread.action.reply": {
"message": "Rispondi"
},
"conversation-thread.action.reply-to-thread": {
"message": "Rispondi al thread"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Ripresenta per la revisione"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Ripresenta per la revisione con risposta"
},
"conversation-thread.action.send": {
"message": "Invia"
},
"conversation-thread.action.send-to-review": {
"message": "Presenta per la revisione"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Presenta per la revisione con risposta"
},
"conversation-thread.action.set-to-draft": {
"message": "Imposta come bozza"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "Imposta come bozza con risposta"
},
"conversation-thread.action.withhold": {
"message": "Sospendi"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Sospendi con risposta"
},
"conversation-thread.closed-thread.description": {
"message": "Questo thread è stato chiuso. Non potranno essere inviati nuovi messaggi."
},
"conversation-thread.error.closing-report": {
"message": "Impossibile chiudere la segnalazione"
},
"conversation-thread.error.reopening-report": {
"message": "Impossibile riaprire la segnalazione"
},
"conversation-thread.error.sending-message": {
"message": "Impossibile inviare il messaggio"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Rispondi al thread..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Invia un messaggio..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Conferma che i moderatori non monitorano continuamente qui"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Comprendo che i moderatori non monitorano questo thread attivamente."
},
"conversation-thread.reply-modal.description": {
"message": "Il tuo progetto è già stato approvato. Perciò, il team di moderazione non monitora attivamente questo thread. Tuttavia, potrebbero comunque notare il tuo messaggio se c'è un problema col progetto."
},
"conversation-thread.reply-modal.header": {
"message": "Rispondi al thread"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Se hai bisogno di contattare il team di moderazione, usa il <help-center-link>centro assistenza di Modrinth</help-center-link> e clicca sulla bolla blu nell'angolo in basso a destra."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "Confermo di aver risposto ai messaggi dei moderatori"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Confermo di aver risposto adeguatamente ai messaggi dei moderatori."
},
"conversation-thread.resubmit-modal.description": {
"message": "Stai ripresentando <project-title>{projectTitle}</project-title> per farlo revisionare nuovamente ai moderatori."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Ripresentazione"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Presentazione"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "Assicurati di aver risposto a tutti i commenti del team di moderazione."
},
"conversation-thread.resubmit-modal.warning": {
"message": "Ripresentare il progetto di continuo senza rispondere ai moderatori potrebbe portare alla sospensione dell'account."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "I file aggiuntivi sono per risorse di supporto come il codice sorgente, non per versioni alternative o varianti."
},
@@ -875,24 +986,9 @@
"dashboard.head-title": {
"message": "Bacheca"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Segna tutte come lette"
},
"dashboard.notifications.button.view-history": {
"message": "Mostra cronologia"
},
"dashboard.notifications.empty.no-unread": {
"message": "Hai letto tutte le notifiche."
},
"dashboard.notifications.error.loading": {
"message": "Impossibile caricare le notifiche:"
},
"dashboard.notifications.history.label": {
"message": "Cronologia"
},
"dashboard.notifications.history.title": {
"message": "Cronologia delle notifiche"
},
"dashboard.notifications.link.see-all": {
"message": "Mostra tutte"
},
@@ -902,9 +998,6 @@
"dashboard.notifications.link.view-more": {
"message": "Mostra {extraNotifs, plural, one {un'altra notifica} other {altre # notifiche}}"
},
"dashboard.notifications.loading": {
"message": "Caricando le notifiche..."
},
"dashboard.organizations.button.create": {
"message": "Crea organizzazione"
},
@@ -920,6 +1013,27 @@
"dashboard.organizations.title": {
"message": "Organizzazioni"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Segna tutte come lette"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Mostra cronologia"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Hai letto tutte le notifiche."
},
"dashboard.overview.notifications.error.loading": {
"message": "Impossibile caricare le notifiche:"
},
"dashboard.overview.notifications.history.label": {
"message": "Cronologia"
},
"dashboard.overview.notifications.history.title": {
"message": "Cronologia delle notifiche"
},
"dashboard.overview.notifications.loading": {
"message": "Caricando le notifiche..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Puoi modificare più progetti contemporaneamente selezionandoli qui sotto."
},
@@ -1239,22 +1353,22 @@
"message": "Annulla ripristino"
},
"discover.install.error.no-server-world": {
"message": "Nessun mondo del server può essere installato."
"message": "Nessun mondo per server può essere installato."
},
"discover.install.error.unsupported-content-type": {
"message": "Questo tipo di contenuto non può essere installato da esplora."
"message": "Questo tipo di contenuto non può essere installato da Esplora."
},
"discover.install.heading.reset-modpack": {
"message": "Selezione dei pacchetti da installare dopo il ripristino"
"message": "Pacchetti da installare dopo il ripristino"
},
"discover.seo.description": {
"message": "Cerca e esplora tra migliaia di {projectType, select, mod {mod} modpack {pacchetti di mod} resourcepack {pacchetti di risorse} shader {shader} plugin {plugin} datapack {pacchetti di dati} other {progetti}} presenti su Modrinth attraverso ricerche rapide e accurate. I nostri filtri ti aiuteranno a trovarne i migliori."
"message": "Cerca e esplora tra migliaia di {projectType, select, mod {mod} modpack {pacchetti di mod} resourcepack {pacchetti di risorse} shader {shader} plugin {plugin} datapack {pacchetti di dati} other {progetti}} presenti su Modrinth attraverso ricerche rapide e accurate. I nostri filtri ti aiuteranno a trovare quello che fa al caso tuo."
},
"discover.seo.title": {
"message": "Ricerca di {projectType, select, mod {mod} modpack {pacchetti di mod} resourcepack {pacchetti di risorse} shader {shader} plugin {plugin} datapack {pacchetti di dati} other {progetti}}"
"message": "Trova {projectType, select, mod {mod} modpack {pacchetti di mod} resourcepack {pacchetti di risorse} shader {shader} plugin {plugin} datapack {pacchetti di dati} other {progetti}}"
},
"discover.seo.title-with-query": {
"message": "Ricerca di {projectType, select, mod {mod} modpack {pacchetti di mod} resourcepack {pacchetti di risorse} shader {shader} plugin {plugin} datapack {pacchetti di dati} other {progetti}} | {query}"
"message": "Trova {projectType, select, mod {mod} modpack {pacchetti di mod} resourcepack {pacchetti di risorse} shader {shader} plugin {plugin} datapack {pacchetti di dati} other {progetti}} | {query}"
},
"error.collection.404.list_item.1": {
"message": "Forse c'è un errore di battitura nell'URL della raccolta."
@@ -1431,7 +1545,7 @@
"message": "I server di Modrinth Hosting possono eseguire qualsiasi versione di Minecraft: Java Edition superiore alla 1.2.5, inclusi gli snapshot."
},
"hosting-marketing.faq.versions-loaders.answer.two": {
"message": "Supportiamo anche un'ampia gamma di loader di mod e plugin, tra cui Fabric, Quilt, Forge e NeoForge per le mod, così come Paper e Purpur per i plugin. È necessario però che questi loader supportino la versione di Minecraft selezionata."
"message": "Supportiamo anche un'ampia gamma di loader di mod e plugin, tra cui Fabric, Quilt, Forge e NeoForge per le mod, così come Paper e Purpur per i plugin. È necessario però che questi loader supportino la versione di Minecraft scelta."
},
"hosting-marketing.get-started": {
"message": "Inizia"
@@ -1754,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "Per motivi di sicurezza, Modrinth richiede l'associazione di un indirizzo email al tuo account."
},
"layout.banner.build-fail.always-ignore": {
"message": "Non mostrare più"
},
"layout.banner.build-fail.description": {
"message": "Questo deploy del frontend di Modrinth non è riuscito a generare uno stato dall'API. Questo potrebbe essere dovuto a un malfunzionamento o a un errore nella configurazione. Rieffettua il build quando l'API è disponibile. Codici di errore: {errors}; L'URL di API corrente è: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Ignora"
},
"layout.banner.build-fail.title": {
"message": "Errore nella generazione dello stato da API durante il build."
},
"layout.banner.preview.description": {
"message": "Se volevi accedere al sito ufficiale, visita <link>https://modrinth.com</link>. Questa versione serve allo staff di Modrinth per condurre test; basata su <branch-link>{owner}/{branch}</branch-link> @ {commit}."
"message": "Se volevi accedere al sito ufficiale, visita {url}. Questa versione serve allo staff di Modrinth per condurre test; basata su <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Questa versione del sito di Modrinth è un'anteprima."
@@ -2591,6 +2711,84 @@
"project.license.title": {
"message": "Licenza"
},
"project.moderation.admonition.approved.body.private": {
"message": "Il progetto è privato: solo tu e chiunque inviti potranno accederci."
},
"project.moderation.admonition.approved.body.public": {
"message": "Il progetto è pubblico e accessibile su Modrinth."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "Il progetto è fuori elenco: sarà accessibile solo tramite link e non apparirà su Modrinth."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "Puoi modificare la visibilità del progetto nelle <visibility-settings-link>impostazioni di visibilità</visibility-settings-link>."
},
"project.moderation.admonition.approved.header": {
"message": "Progetto approvato"
},
"project.moderation.admonition.draft.body": {
"message": "Questo progetto è in bozza e sarà pubblico solo quando verrà revisionato e approvato dal team di moderazione di Modrinth."
},
"project.moderation.admonition.draft.header": {
"message": "Progetto in bozza"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Appena avrai soddisfatto tutti i requisiti e ti sarai assicurato che il progetto rispetti le <rules-link>Regole sui contenuti</rules-link>, potrai presentarlo per la revisione."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "Rispondi a tutti i dubbi dei moderatori, inclusi i problemi elencati nei messaggi sottostanti, prima di ripresentare il progetto."
},
"project.moderation.admonition.rejected.header": {
"message": "Modifiche richieste"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "Ripresentare il progetto di continuo senza rispondere ai moderatori potrebbe portare alla sospensione dell'account."
},
"project.moderation.admonition.under-review.body.1": {
"message": "Il progetto è in coda per essere revisionato dal team di moderazione di Modrinth."
},
"project.moderation.admonition.under-review.body.2": {
"message": "Il progetto sarà scansionato, poi analizzato manualmente dai moderatori per assicurarsi che rispetti le <rules-link>Regole sui contenuti</rules-link> e i <terms-link>Termini d'uso</terms-link>."
},
"project.moderation.admonition.under-review.body.3": {
"message": "Puoi ancora modificare il progetto; non influirà sulla tua posizione in coda."
},
"project.moderation.admonition.under-review.body.4": {
"message": "Puntiamo a revisionare i progetti entro le 24-48 ore, ma potrebbero esserci dei ritardi; ciò non vuol dire che abbiamo trovato un problema."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>Apprezziamo la tua pazienza. Mentre i nostri moderatori si impegnano a tenere Modrinth un posto sicuro, non vediamo l'ora di aiutare a condividere i tuoi contenuti! 💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Progetto in revisione"
},
"project.moderation.admonition.withheld.body": {
"message": "Il progetto non sarà visibile pubblicamente e potrà essere accesso solo tramite link. {requestedStatus, select, unlisted {Date le <visibility-settings-link>impostazioni di visibilità</visibility-settings-link> attuali, non dovrebbe essere necessaria alcuna azione.} other {Rispondi a tutti i dubbi dei moderatori, inclusi i problemi elencati nei messaggi sottostanti, prima di ripresentare il progetto.}}"
},
"project.moderation.admonition.withheld.header": {
"message": "Nascosto dallo staff"
},
"project.moderation.error.unauthorized": {
"message": "Accesso negato"
},
"project.moderation.thread.approved-warning": {
"message": "Questo thread non è monitorato attivamente, ma potrebbe essere revisionato se necessario."
},
"project.moderation.thread.help-center-note.1": {
"message": "I moderatori non forniscono supporto per tutti i problemi e i messaggi inviati non raggiungono lo staff."
},
"project.moderation.thread.help-center-note.2": {
"message": "Se hai bisogno di assistenza o hai altre richieste, visita il <help-center-link>centro assistenza di Modrinth</help-center-link> e clicca sulla bolla blu nell'angolo in basso a destra."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "Mostra interfaccia degli utenti"
},
"project.moderation.thread.private-description": {
"message": "Questa è una conversazione privata con i moderatori di Modrinth. Sarai contattato per eventuali problemi riguardanti questo progetto."
},
"project.moderation.thread.title": {
"message": "Messaggi di moderazione"
},
"project.moderation.title": {
"message": "Moderazione"
},
@@ -2679,7 +2877,7 @@
"message": "Non hai il permesso di ridistribuire alcuni dei contenuti esterni che hai incluso. Per pubblicare su Modrinth, rimuovi i contenuti illeciti."
},
"project.settings.permissions.fail.title": {
"message": "Non puoi includere questi contenuti"
"message": "Alcuni contenuti non possono essere pubblicati"
},
"project.settings.permissions.info-banner.description": {
"message": "Se includi dei contenuti esterni a Modrinth, devi dichiarare la loro origine e dimostrare di avere il permesso di ridistribuirli. Controlla la <link>nostra guida</link> per farlo nel modo giusto!"
@@ -3501,7 +3699,7 @@
"message": "Hai annullato l'abbonamento."
},
"settings.billing.midas.status.cancelled.line2": {
"message": "I vantaggi rimarranno attivi fino alla fine di questo ciclo di fatturazione."
"message": "Manterrai i tuoi vantaggi fino alla fine del ciclo di fatturazione in corso."
},
"settings.billing.midas.status.failed": {
"message": "La transazione non è andata a buon fine. Aggiorna il tuo metodo di pagamento."
@@ -875,24 +875,6 @@
"dashboard.head-title": {
"message": "ダッシュボード"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "全て既読にする"
},
"dashboard.notifications.button.view-history": {
"message": "履歴を表示"
},
"dashboard.notifications.empty.no-unread": {
"message": "未読の通知はありません"
},
"dashboard.notifications.error.loading": {
"message": "通知の読み込み中にエラーが発生しました:"
},
"dashboard.notifications.history.label": {
"message": "履歴"
},
"dashboard.notifications.history.title": {
"message": "通知履歴"
},
"dashboard.notifications.link.see-all": {
"message": "すべて見る"
},
@@ -902,9 +884,6 @@
"dashboard.notifications.link.view-more": {
"message": "{extraNotifs} 件の通知をさらに表示"
},
"dashboard.notifications.loading": {
"message": "通知を読み込み中..."
},
"dashboard.organizations.button.create": {
"message": "組織を作成"
},
@@ -1394,9 +1373,6 @@
"hosting-marketing.faq.location": {
"message": "Modrinthでホストするサーバーはどこにありますか?地域を選択できますか?"
},
"hosting-marketing.faq.location.answer": {
"message": "現時点では、北アメリカ、ヨーロッパ、東南アジアのサーバーを購入時に選択できます。今後、より多くの地域に対応予定です!地域を変更したい場合はサポートまでお問い合わせください。"
},
"hosting-marketing.faq.versions-loaders": {
"message": "どのMinecraftのバージョンとローダーが使えますか?"
},
@@ -1733,9 +1709,6 @@
"layout.banner.build-fail.title": {
"message": "ビルド時にAPIからステートを生成できませんでした。"
},
"layout.banner.preview.description": {
"message": "公式のModrinthウェブサイトにアクセスしたい場合は、<link>https://modrinth.com</link> をご覧ください。このプレビュー環境はModrinthスタッフによるテスト目的で使用されています。<branch-link>{owner}/{branch}</branch-link> @ {commit} を基に構築されています。"
},
"layout.banner.preview.title": {
"message": "これはModrinthウェブサイトのプレビューデプロイです。"
},
+251 -23
View File
@@ -407,6 +407,117 @@
"collection.title": {
"message": "{name} - 컬렉션"
},
"conversation-thread.action.add-private-note": {
"message": "비공개 노트 추가"
},
"conversation-thread.action.approve": {
"message": "승인"
},
"conversation-thread.action.approve-with-reply": {
"message": "답글과 함께 승인"
},
"conversation-thread.action.close-thread": {
"message": "스레드 닫기"
},
"conversation-thread.action.close-with-reply": {
"message": "답글과 함께 닫기"
},
"conversation-thread.action.reject": {
"message": "거부"
},
"conversation-thread.action.reject-with-reply": {
"message": "답글과 함께 거부"
},
"conversation-thread.action.reopen-thread": {
"message": "스레드 다시 열기"
},
"conversation-thread.action.reply": {
"message": "답글 게시"
},
"conversation-thread.action.reply-to-thread": {
"message": "스레드에 답글 게시"
},
"conversation-thread.action.resubmit-for-review": {
"message": "검토를 위해 다시 제출"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "검토를 위해 답글과 함께 다시 제출"
},
"conversation-thread.action.send": {
"message": "전송됨"
},
"conversation-thread.action.send-to-review": {
"message": "검토 요청"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "답글과 함께 검토 요청"
},
"conversation-thread.action.set-to-draft": {
"message": "초안으로 설정"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "답글과 함께 초안으로 설정"
},
"conversation-thread.action.withhold": {
"message": "보류"
},
"conversation-thread.action.withhold-with-reply": {
"message": "답글과 함께 보류"
},
"conversation-thread.closed-thread.description": {
"message": "이 스레드는 닫혔으며, 더 이상 새로운 메시지를 작성할 수 없습니다."
},
"conversation-thread.error.closing-report": {
"message": "신고 닫기 오류"
},
"conversation-thread.error.reopening-report": {
"message": "신고 다시 열기 오류"
},
"conversation-thread.error.sending-message": {
"message": "메시지 전송 오류"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "스레드에 답글 게시..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "메시지 전송..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "운영진이 적극적으로 모니터링하지 않습니다"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "관리자들이 이 스레드를 적극적으로 모니터링하지 않는다는 점을 인지하고 있습니다."
},
"conversation-thread.reply-modal.description": {
"message": "프로젝트가 이미 승인되었습니다. 따라서 운영진은 이 스레드를 적극적으로 모니터링하지 않습니다. 다만, 프로젝트에 문제가 발생할 경우 운영진이 메시지를 확인할 수 있습니다."
},
"conversation-thread.reply-modal.header": {
"message": "스레드에 답글 게시"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "운영진에게 문의하려면 <help-center-link>Modrinth 도움말 센터</help-center-link>를 이용하고, 오른쪽 하단에 있는 파란색 말풍선을 클릭하여 지원 센에 문의해 주세요."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "운영진이 보낸 메시지에 답변했는지 확인"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "운영진의 지적 사항을 적절히 반영했음을 확인합니다."
},
"conversation-thread.resubmit-modal.description": {
"message": "<project-title>{projectTitle}</project-title> 프로젝트를 운영진의 재검토를 위해 제출하려고 합니다."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "검토를 위해 다시 제출"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "검토를 위해 제출"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "운영진에서 제시한 모든 의견을 반영했는지 확인해 주세요."
},
"conversation-thread.resubmit-modal.warning": {
"message": "운영진의 지적 사항을 반영하지 않고 반복적으로 제출할 경우, 계정이 정지될 수 있습니다."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "보조 파일은 소스 코드와 같은 지원용 리소스를 위한 것이며, 대체 버전이나 변형을 위한 것이 아닙니다."
},
@@ -576,7 +687,7 @@
"message": "제휴 링크 검색..."
},
"dashboard.analytics.from-projects": {
"message": "프로젝트 {count}개"
"message": "{count} {count, plural, one {프로젝트} other {프로젝트}}로"
},
"dashboard.analytics.total-downloads": {
"message": "다운로드 수"
@@ -875,24 +986,9 @@
"dashboard.head-title": {
"message": "대시보드"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "모두 읽음으로 표시"
},
"dashboard.notifications.button.view-history": {
"message": "기록 보기"
},
"dashboard.notifications.empty.no-unread": {
"message": "읽지 않은 알림이 없습니다."
},
"dashboard.notifications.error.loading": {
"message": "알림 불러오기 오류:"
},
"dashboard.notifications.history.label": {
"message": "기록"
},
"dashboard.notifications.history.title": {
"message": "알림 기록"
},
"dashboard.notifications.link.see-all": {
"message": "모두 보기"
},
@@ -902,9 +998,6 @@
"dashboard.notifications.link.view-more": {
"message": "알림 {extraNotifs}개 더 보기"
},
"dashboard.notifications.loading": {
"message": "알림 불러오는 중..."
},
"dashboard.organizations.button.create": {
"message": "조직 생성"
},
@@ -920,6 +1013,27 @@
"dashboard.organizations.title": {
"message": "조직"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "모두 읽음으로 표시"
},
"dashboard.overview.notifications.button.view-history": {
"message": "기록 보기"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "읽지 않은 알림이 없습니다."
},
"dashboard.overview.notifications.error.loading": {
"message": "알림 불러오기 오류:"
},
"dashboard.overview.notifications.history.label": {
"message": "기록"
},
"dashboard.overview.notifications.history.title": {
"message": "알림 기록"
},
"dashboard.overview.notifications.loading": {
"message": "알림 불러오는 중..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "아래에서 여러 프로젝트를 선택하면 한 번에 편집할 수 있습니다."
},
@@ -1229,6 +1343,33 @@
"dashboard.withdraw.error.tax-form.title": {
"message": "세금 신고서를 작성해 주세요"
},
"discover.install.back-to-server": {
"message": "서버로 돌아가기"
},
"discover.install.back-to-setup": {
"message": "설정으로 돌아가기"
},
"discover.install.cancel-reset": {
"message": "리셋 취소"
},
"discover.install.error.no-server-world": {
"message": "설치에 필요한 서버 월드가 없습니다."
},
"discover.install.error.unsupported-content-type": {
"message": "이 콘텐츠 유형은 찾아보기로서 서버에 설치할 수 없습니다."
},
"discover.install.heading.reset-modpack": {
"message": "리셋 후 설치할 모드팩 선택"
},
"discover.seo.description": {
"message": "Modrinth에서 수천 개의 마인크래프트 {projectType, select, mod {모드를} modpack {모드팩을} resourcepack {리소스팩을} shader {셰이더를} plugin {플러그인을} datapack {데이터팩을} other {프로젝트를}} 즉각적이고 정확한 검색 결과로 찾아보세요. 제공되는 필터로 최적의 마인크래프트 {projectType, select, mod {모드를} modpack {모드팩을} resourcepack {리소스팩을} shader {쉐이더를} plugin {플러그인을} datapack {데이터팩을} other {프로젝트를}} 빠르게 찾을 수 있습니다."
},
"discover.seo.title": {
"message": "{projectType, select, mod {모드} modpack {모드팩} resourcepack {리소스팩} shader {셰이더} plugin {플러그인} datapack {데이터팩} other {프로젝트}} 검색"
},
"discover.seo.title-with-query": {
"message": "{projectType, select, mod {모드} modpack {모드팩} resourcepack {리소스팩} shader {셰이더} plugin {플러그인} datapack {데이터팩} other {프로젝트}} {query} 검색"
},
"error.collection.404.list_item.1": {
"message": "컬렉션 URL을 잘못 입력했을 수 있습니다."
},
@@ -1395,7 +1536,7 @@
"message": "Modrinth 호스팅 서버는 어디에 위치해 있나요? 지역을 선택할 수 있나요?"
},
"hosting-marketing.faq.location.answer": {
"message": "현재 서버는 구매 시 북미, 유럽, 동남아 지역 중에서 선택할 수 있습니다. 향후 더 많은 지역에서 서비스를 제공할 예정입니다! 지역을 변경이 필요하면 지원팀에 문의해 주세요."
"message": "현재 북미, 유럽, 동남아시아 전역에서 구매 시 선택할 수 있는 서버가 있습니다. 앞으로 더 많은 지역이 추가될 예정입니다! 지역을 변경하고 싶으시면 지원팀에 문의해 주세요."
},
"hosting-marketing.faq.versions-loaders": {
"message": "어떤 마인크래프트 버전과 로더를 사용할 수 있나요?"
@@ -1727,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "보안상의 이유로 Modrinth 계정에 이메일을 등록해야 합니다."
},
"layout.banner.build-fail.always-ignore": {
"message": "항상 무시"
},
"layout.banner.build-fail.description": {
"message": "Modrinth 프론트엔드 배포가 API로부터 상태를 생성하지 못했습니다. 이는 서비스 중단 또는 구성 오류 때문일 수 있습니다. API가 사용 가능해지면 재빌드하십시오. 오류 코드: {errors}; 현재 API URL: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "무시"
},
"layout.banner.build-fail.title": {
"message": "빌드 중 API에서 상태 생성 오류가 발생했습니다."
},
"layout.banner.preview.description": {
"message": "공식 Modrinth 웹사이트에 접속하려는 경우, <link>https://modrinth.com</link>를 방문하세요. 이 미리보기 배포판은 Modrinth 직원이 테스트 목적으로 사용하며, 이는 <branch-link>{owner}/{branch}</branch-link> @ {commit}을 사용해 빌드되었습니다."
"message": "공식 Modrinth 웹사이트에 접속하려는 경우, {url}을(를) 방문하세요. 이 미리보기 배포판은 Modrinth 운영진이 테스트 목적으로 사용하며, 이는 <branch-link>{owner}/{branch}</branch-link> @ {commit} 기반으로 빌드되었습니다."
},
"layout.banner.preview.title": {
"message": "이 웹사이트는 Modrinth의 미리보기입니다."
@@ -1890,7 +2037,7 @@
"message": "콘텐츠 탐색하기"
},
"layout.nav.get-modrinth-app": {
"message": "Modrinth 받기"
"message": "Modrinth App 받기"
},
"layout.nav.home": {
"message": "홈"
@@ -2564,6 +2711,84 @@
"project.license.title": {
"message": "라이선스"
},
"project.moderation.admonition.approved.body.private": {
"message": "이 프로젝트는 비공개로 설정되어 있어, 본인과 본인이 초대한 사람만 접근할 수 있습니다."
},
"project.moderation.admonition.approved.body.public": {
"message": "프로젝트가 Modrinth에 게시되어 누구나 확인할 수 있습니다."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "프로젝트는 일부 공개로 설정되어 있어, 직접 링크를 통해서만 접근할 수 있으며 Modrinth에서 검색할 수 없습니다."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "프로젝트의 <visibility-settings-link>공개 범위 설정</visibility-settings-link>에서 프로젝트의 공개 범위를 변경할 수 있습니다."
},
"project.moderation.admonition.approved.header": {
"message": "프로젝트 승인됨"
},
"project.moderation.admonition.draft.body": {
"message": "이 프로젝트는 검토를 위해 제출되고 Modrinth 운영진의 승인을 받기 전까지는 다른 사람이 볼 수 없는 초안입니다."
},
"project.moderation.admonition.draft.header": {
"message": "프로젝트 초안"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "필요한 모든 단계를 완료하고 프로젝트가 Modrinth의 <rules-link>콘텐츠 규정</rules-link>을 준수하는지 확인한 후, 프로젝트를 검토를 위해 제출할 수 있습니다."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "이 프로젝트를 다시 제출하기 전에, 아래 메시지에 언급된 문제를 포함하여 모든 검토 관련 사항을 해결해야 합니다."
},
"project.moderation.admonition.rejected.header": {
"message": "수정 요청"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "검토 과정에서 제기된 모든 문제를 먼저 해결하지 않고 프로젝트를 반복적으로 제출할 경우, 계정이 정지될 수 있습니다."
},
"project.moderation.admonition.under-review.body.1": {
"message": "프로젝트가 Modrinth 운영진의 검토 대기열에 등록되었습니다."
},
"project.moderation.admonition.under-review.body.2": {
"message": "프로젝트가 스캔 과정을 거친 후, Modrinth의 <rules-link>콘텐츠 규정</rules-link> 및 <terms-link>이용 약관</terms-link>을 준수하는지 확인하기 위해 운영진이 검토하게 됩니다."
},
"project.moderation.admonition.under-review.body.3": {
"message": "프로젝트를 수정해도 대기열 우선 순위에는 영향을 미치지 않습니다."
},
"project.moderation.admonition.under-review.body.4": {
"message": "제출한 내용을 24~48시간 이내에 검토하는 것을 목표로 하고 있으나, 일부 프로젝트의 경우 지연될 수 있습니다. 이는 제출한 내용에 문제가 있다는 것을 의미하지 않습니다."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>운영진들이 Modrinth의 안전한 환경을 유지하기 위해 최선을 다하고 있는 동안 기다려 주셔서 감사합니다. 여러분의 콘텐츠를 공유하실 수 있도록 도와드릴 수 있기를 기대합니다! 💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "프로젝트 검토 중"
},
"project.moderation.admonition.withheld.body": {
"message": "이 프로젝트는 공개되지 않으며, 직접 링크를 통해서만 접근할 수 있습니다.{requestedStatus, select,unlisted { 선택한 <visibility-settings-link>공개 범위 설정</visibility-settings-link>에 따라, 별도의 조치가 필요하지 않을 가능성이 높습니다.} other { 이 프로젝트를 다시 제출하기 전에, 아래 메시지에 나열된 문제를 포함하여 모든 검토 관련 사항을 해결해야 합니다.}}"
},
"project.moderation.admonition.withheld.header": {
"message": "운영진에 의해 숨겨짐"
},
"project.moderation.error.unauthorized": {
"message": "권한 없음"
},
"project.moderation.thread.approved-warning": {
"message": "이 스레드는 적극적으로 관리되지는 않지만, 필요한 경우 프로젝트에 관한 정보를 확인하기 위해 검토될 수 있습니다."
},
"project.moderation.thread.help-center-note.1": {
"message": "콘텐츠 관리자는 대부분의 문제에 대해 지원을 제공할 수 없으며, 이 스레드에 남겨진 메시지는 운영진에 전달되지 않습니다."
},
"project.moderation.thread.help-center-note.2": {
"message": "도움이 필요하거나 추가 문의 사항이 있다면 <help-center-link>Modrinth 도움말 센터</help-center-link>를 방문하여 파란색 말풍선을 클릭해 지원 센터에 문의해 주세요."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "멤버 UI 표시"
},
"project.moderation.thread.private-description": {
"message": "이곳은 Modrinth 운영진과의 비공개 대화 스레드입니다. 운영진이 이 프로젝트와 관련된 사항에 대해 메시지를 보낼 수 있습니다."
},
"project.moderation.thread.title": {
"message": "운영진 메시지"
},
"project.moderation.title": {
"message": "관리"
},
@@ -3062,6 +3287,9 @@
"search.filter.locked.server.sync": {
"message": "서버와 동기화"
},
"servers.manage.content.title": {
"message": "콘텐츠 - {serverName} - Modrinth"
},
"servers.notice.actions": {
"message": "활동"
},
@@ -3696,7 +3924,7 @@
"message": "새 탭에서 외부 링크 열기"
},
"settings.display.sidebar.hide-app-promos.description": {
"message": "기본 네비게이선에서 \"Modrinth 받기\" 버튼을 숨깁니다. Modrinth 페이지는 여전히 시작 페이지 또는 하단에서 찾을 수 있습니다."
"message": "기본 네비게이선에서 \"Modrinth App 받기\" 버튼을 숨깁니다. Modrinth App 페이지는 여전히 시작 페이지 또는 하단에서 찾을 수 있습니다."
},
"settings.display.sidebar.hide-app-promos.title": {
"message": "Modrinth 앱 프로모션 숨기기"
+327 -9
View File
@@ -407,6 +407,78 @@
"collection.title": {
"message": "{name} - Koleksi"
},
"conversation-thread.action.approve": {
"message": "Luluskan"
},
"conversation-thread.action.approve-with-reply": {
"message": "Luluskan dengan balasan"
},
"conversation-thread.action.close-thread": {
"message": "Tutup bebenang"
},
"conversation-thread.action.close-with-reply": {
"message": "Tutup dengan balasan"
},
"conversation-thread.action.reject": {
"message": "Tolak"
},
"conversation-thread.action.reject-with-reply": {
"message": "Tolak dengan balasan"
},
"conversation-thread.action.reopen-thread": {
"message": "Buka semula bebenang"
},
"conversation-thread.action.reply": {
"message": "Balas"
},
"conversation-thread.action.reply-to-thread": {
"message": "Balas bebenang"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Serah semula untuk semakan"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Serah semula untuk semakan dengan balasan"
},
"conversation-thread.action.send": {
"message": "Hantar"
},
"conversation-thread.action.send-to-review": {
"message": "Hantar untuk semakan"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Hantar untuk semakan dengan balasan"
},
"conversation-thread.error.closing-report": {
"message": "Ralat semasa menutup laporan"
},
"conversation-thread.error.reopening-report": {
"message": "Ralat semasa membuka semula laporan"
},
"conversation-thread.error.sending-message": {
"message": "Ralat semasa menghantar mesej"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Balas bebenang..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Hantar mesej..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Sahkan bahawa penyederhana tidak memantau bebenang ini secara aktif"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Saya akui bahawa penyederhana tidak memantau bebenang ini secara aktif."
},
"conversation-thread.resubmit-modal.description": {
"message": "Anda sedang menghantar <project-title>{projectTitle}</project-title> untuk disemak semula oleh penyederhana."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Sedang menyerahkan semula untuk semakan"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Sedang menyerahkan untuk semakan"
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Fail tambahan adalah untuk sumber sokongan seperti kod sumber, bukan untuk versi atau varian alternatif."
},
@@ -572,6 +644,15 @@
"dashboard.affiliate-links.search": {
"message": "Cari pautan afiliasi..."
},
"dashboard.analytics.from-projects": {
"message": "daripada {count} {count, plural, other {projek}}"
},
"dashboard.analytics.total-downloads": {
"message": "Jumlah muat turun"
},
"dashboard.analytics.total-followers": {
"message": "Jumlah pengikut"
},
"dashboard.collections.button.create-new": {
"message": "Cipta baharu"
},
@@ -596,6 +677,15 @@
"dashboard.collections.long-title": {
"message": "Koleksi anda"
},
"dashboard.collections.sort.name-ascending": {
"message": "Nama (A-Z)"
},
"dashboard.collections.sort.recently-created": {
"message": "Dicipta Baru-baru Ini"
},
"dashboard.collections.sort.recently-updated": {
"message": "Dikemas Kini Baru-baru Ini"
},
"dashboard.creator-tax-form-modal.confirmation.download-button": {
"message": "Muat turun {formType}"
},
@@ -848,12 +938,90 @@
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
"message": "Anda telah menggunakan had pengeluaran anda sebanyak <b>{withdrawLimit}</b>. Anda mesti melengkapkan borang cukai untuk mengeluarkan lebih banyak wang."
},
"dashboard.notifications.history.label": {
"message": "Sejarah"
"dashboard.head-title": {
"message": "Papan Pemuka"
},
"dashboard.notifications.empty.no-unread": {
"message": "Anda tidak mempunyai pemberitahuan yang belum dibaca."
},
"dashboard.notifications.link.see-all": {
"message": "Lihat semua"
},
"dashboard.notifications.link.view-history": {
"message": "Lihat sejarah pemberitahuan"
},
"dashboard.notifications.link.view-more": {
"message": "Lihat {extraNotifs} lagi {extraNotifs, plural, other {pemberitahuan}}"
},
"dashboard.organizations.button.create": {
"message": "Cipta organisasi"
},
"dashboard.overview.notifications.history.title": {
"message": "Sejarah pemberitahuan"
},
"dashboard.overview.notifications.loading": {
"message": "Sedang memuat pemberitahuan..."
},
"dashboard.projects.links.changes-applied": {
"message": "Perubahan akan diterapkan kepada <strong>{count}</strong> {count, plural, other {projek}}."
},
"dashboard.projects.links.description": {
"message": "Sebarang pautan yang anda nyatakan di bawah akan ditulis ganti pada setiap projek yang dipilih. Sebarang pautan yang anda biarkan kosong akan diabaikan. Anda boleh memadamkan pautan daripada semua projek yang dipilih menggunakan butang tong sampah."
},
"dashboard.projects.links.discord-invite.description": {
"message": "Pautan jemputan ke pelayan Discord anda."
},
"dashboard.projects.links.discord-invite.label": {
"message": "Jemputan Discord"
},
"dashboard.projects.links.issue-tracker.description": {
"message": "Tempat untuk pengguna melaporkan pepijat, isu dan kebimbangan tentang projek anda."
},
"dashboard.projects.links.issue-tracker.label": {
"message": "Penjejak isu"
},
"dashboard.projects.links.placeholder.cleared": {
"message": "Pautan sedia ada akan dikosongkan"
},
"dashboard.projects.links.placeholder.valid-discord-url": {
"message": "Masukkan URL jemputan Discord yang sah"
},
"dashboard.projects.links.placeholder.valid-url": {
"message": "Masukkan URL yang sah"
},
"dashboard.projects.links.show-all-projects": {
"message": "Tunjukkan semua projek"
},
"dashboard.projects.links.source-code.description": {
"message": "Laman/repositori yang mengandungi kod sumber untuk projek anda"
},
"dashboard.projects.links.source-code.label": {
"message": "Kod sumber"
},
"dashboard.projects.links.wiki-page.description": {
"message": "Laman yang mengandungi maklumat, dokumentasi dan bantuan untuk projek ini."
},
"dashboard.projects.links.wiki-page.label": {
"message": "Laman wiki"
},
"dashboard.projects.notification.bulk-edit-success": {
"message": "Pautan projek yang dipilih telah disunting secara pukal."
},
"dashboard.projects.project.icon-alt": {
"message": "Ikon untuk {title}"
},
"dashboard.projects.project.moderator-message-aria": {
"message": "Projek ini mempunyai mesej daripada penyederhana. Lihat projek untuk melihat lebih lanjut."
},
"dashboard.projects.project.review-environment-metadata": {
"message": "Sila semak metadata persekitaran"
},
"dashboard.projects.sort.ascending": {
"message": "Menaik"
},
"dashboard.projects.sort.descending": {
"message": "Menurun"
},
"dashboard.projects.sort.option.name": {
"message": "Nama"
},
@@ -878,6 +1046,12 @@
"dashboard.projects.table.type": {
"message": "Jenis"
},
"dashboard.reports.active-title": {
"message": "Laporan yang aktif"
},
"dashboard.reports.title": {
"message": "Laporan"
},
"dashboard.revenue.available-now": {
"message": "Tersedia sekarang"
},
@@ -914,6 +1088,9 @@
"dashboard.revenue.transactions.btn.download-csv": {
"message": "Muat turun sebagai CSV"
},
"dashboard.revenue.transactions.head-title": {
"message": "Sejarah transaksi"
},
"dashboard.revenue.transactions.header": {
"message": "Transaksi"
},
@@ -938,6 +1115,12 @@
"dashboard.revenue.withdraw.header": {
"message": "Pengeluaran"
},
"dashboard.sidebar.label.projects": {
"message": "Projek"
},
"dashboard.sidebar.label.revenue": {
"message": "Pendapatan"
},
"dashboard.withdraw.completion.account": {
"message": "Akaun"
},
@@ -1034,6 +1217,15 @@
"dashboard.withdraw.error.tax-form.title": {
"message": "Sila lengkapkan borang cukai"
},
"discover.install.back-to-server": {
"message": "Kembali ke pelayan"
},
"discover.install.back-to-setup": {
"message": "Kembali ke persediaan"
},
"discover.install.cancel-reset": {
"message": "Batalkan penetapan semula"
},
"discover.seo.description": {
"message": "Cari dan layari beribu-ribu {projectType, select, mod {mod} modpack {pek mod} resourcepack {pek sumber} shader {pembayang} plugin {pemalam} datapack {pek data} other {projek}} Minecraft di Modrinth dengan hasil carian yang segera dan tepat. Penapis kami akan membantu anda mencari {projectType, select, mod {mod} modpack {pek mod} resourcepack {pek sumber} shader {pembayang} plugin {pemalam} datapack {pek data} other {projek}} yang terbaik."
},
@@ -1202,9 +1394,6 @@
"hosting-marketing.faq.location": {
"message": "Di manakah pelayan Modrinth Hosting terletak? Bolehkah saya memilih rantau?"
},
"hosting-marketing.faq.location.answer": {
"message": "Kami mempunyai pelayan yang tersedia di Amerika Utara, Eropah dan Asia Tenggara pada masa ini yang boleh anda pilih semasa pembelian. Lebih banyak rantau akan datang pada masa hadapan! Jika anda ingin menukar rantau anda, sila hubungi sokongan."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Versi Minecraft dan pemuat apa yang boleh digunakan?"
},
@@ -1539,7 +1728,7 @@
"message": "Ralat menjana keadaan daripada API semasa membina."
},
"layout.banner.preview.description": {
"message": "Jika anda bermaksud untuk mengakses laman sesawang rasmi Modrinth, kunjungi <link>https://modrinth.com</link>. Pralihat pelaksanaan ini digunakan oleh kakitangan Modrinth untuk tujuan pengujian. Ia dibina menggunakan <branch-link>{owner}/{branch}</branch-link> @ {commit}."
"message": "Jika anda bermaksud untuk mengakses laman sesawang rasmi Modrinth, kunjungi {url}. Pralihat pelaksanaan ini digunakan oleh kakitangan Modrinth untuk tujuan pengujian. Ia dibina menggunakan <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Ini ialah pengaturan pralihat laman sesawang Modrinth."
@@ -1736,12 +1925,18 @@
"moderation.moderate": {
"message": "Sederhanakan"
},
"moderation.page.external-projects": {
"message": "Projek luaran"
},
"moderation.page.projects": {
"message": "Projek"
},
"moderation.page.reports": {
"message": "Laporan"
},
"moderation.page.technicalReview": {
"message": "Semakan teknikal"
},
"muralpay.account-type.checking": {
"message": "Cek"
},
@@ -2136,7 +2331,7 @@
"message": "Diperlukan"
},
"project-moderation-nags.resubmit-for-review": {
"message": "Serah semula untuk penilaian"
"message": "Serah semula untuk semakan"
},
"project-moderation-nags.resubmit-for-review-desc": {
"message": "Projek anda telah {status, select, rejected {ditolak} withheld {ditahan} other {{status}}} oleh staf Modrinth. Dalam kebanyakan kes, anda boleh menyerahkan semula untuk semakan selepas menangani masalah yang dikemukakan dalam mesej kakitangan."
@@ -2145,10 +2340,10 @@
"message": "Anda mesti melengkapkan langkah-langkah yang diperlukan dalam senarai semak penerbitan!"
},
"project-moderation-nags.submit-for-review": {
"message": "Serah untuk penilaian"
"message": "Serah untuk semakan"
},
"project-moderation-nags.submit-for-review-button": {
"message": "Serah untuk penilaian"
"message": "Serah untuk semakan"
},
"project-moderation-nags.submit-for-review-desc": {
"message": "Projek anda hanya boleh dilihat oleh ahli projek. Ia mesti dinilai oleh penyederhana untuk diterbitkan."
@@ -2363,6 +2558,84 @@
"project.license.title": {
"message": "Lesen"
},
"project.moderation.admonition.approved.body.private": {
"message": "Projek anda adalah peribadi, yang bermakna ia hanya boleh diakses oleh anda dan orang yang anda jemput."
},
"project.moderation.admonition.approved.body.public": {
"message": "Projek anda adalah diterbitkan dan boleh ditemui di Modrinth."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "Projek anda adalah tidak tersenarai, yang bermakna ia hanya boleh diakses dengan pautan langsung dan tidak boleh ditemui di Modrinth."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "Anda boleh menukar keterlihatan projek anda dalam <visibility-settings-link>tetapan keterlihatan</visibility-settings-link> projek anda."
},
"project.moderation.admonition.approved.header": {
"message": "Projek diluluskan"
},
"project.moderation.admonition.draft.body": {
"message": "Ini merupakan draf projek yang tidak boleh dilihat oleh orang lain sehingga dihantar untuk semakan dan diluluskan oleh pasukan penyederhanaan Modrinth."
},
"project.moderation.admonition.draft.header": {
"message": "Draf projek"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Sebaik sahaja anda telah menyelesaikan semua langkah yang diperlukan dan memastikan projek anda mematuhi <rules-link>Peraturan Kandungan</rules-link> Modrinth, anda boleh menghantar projek anda untuk semakan."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "Mohon tangani semua kebimbangan tentang penyederhanaan, termasuk sebarang isu yang disenaraikan dalam mesej di bawah, sebelum menghantar semula projek ini."
},
"project.moderation.admonition.rejected.header": {
"message": "Perubahan diminta"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "Menyerahkan projek anda berulang kali tanpa menangani semua kebimbangan penyederhanaan terlebih dahulu boleh mengakibatkan penggantungan akaun."
},
"project.moderation.admonition.under-review.body.1": {
"message": "Projek anda sedang dalam barisan untuk disemak oleh pasukan penyederhanaan Modrinth."
},
"project.moderation.admonition.under-review.body.2": {
"message": "Projek anda akan diimbas dan kemudian disemak oleh penyederhana manusia untuk memastikan ia mematuhi <rules-link>Peraturan Kandungan</rules-link> dan <terms-link>Terma Penggunaan</terms-link> Modrinth."
},
"project.moderation.admonition.under-review.body.3": {
"message": "Anda masih boleh mengubah suai projek anda, ia tidak akan menjejaskan kedudukan anda dalam barisan."
},
"project.moderation.admonition.under-review.body.4": {
"message": "Kami menyasarkan untuk menyemak penyerahan dalam masa 24-48 jam, tetapi sesetengah projek mungkin menghadapi kelewatan. Ini tidak mencerminkan masalah dengan penyerahan anda."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>Kami menghargai kesabaran anda sementara penyederhana kami berusaha keras untuk memastikan Modrinth kekal selamat, dan berharap dapat membantu anda berkongsi kandungan anda!💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Projek dalam semakan"
},
"project.moderation.admonition.withheld.body": {
"message": "Projek anda tidak akan dipaparkan secara terbuka dan hanya boleh diakses dengan pautan langsung.{requestedStatus, select, unlisted { Berdasarkan <visibility-settings-link>tetapan keterlihatan</visibility-settings-link> yang anda pilih, kemungkinan besar tiada tindakan diperlukan.} other { Mohon tangani semua kebimbangan tentang penyederhanaan, termasuk sebarang isu yang disenaraikan dalam mesej di bawah, sebelum menghantar semula projek ini.}}"
},
"project.moderation.admonition.withheld.header": {
"message": "Tidak disenaraikan oleh kakitangan"
},
"project.moderation.error.unauthorized": {
"message": "Tidak dibenarkan"
},
"project.moderation.thread.approved-warning": {
"message": "Bebenang ini tidak dipantau secara aktif, tetapi mungkin disemak untuk mendapatkan maklumat tentang projek anda jika perlu."
},
"project.moderation.thread.help-center-note.1": {
"message": "Penyederhana kandungan tidak dapat memberikan sokongan untuk kebanyakan isu dan mesej ke dalam bebenang ini tidak memaklumkan kakitangan."
},
"project.moderation.thread.help-center-note.2": {
"message": "Jika anda memerlukan bantuan atau mempunyai pertanyaan tambahan, sila lawati <help-center-link>Pusat Bantuan Modrinth</help-center-link> dan klik gelembung biru untuk menghubungi sokongan."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "Tunjukkan antara muka ahli"
},
"project.moderation.thread.private-description": {
"message": "Ini adalah bebenang perbualan peribadi dengan penyederhana Modrinth. Mereka mungkin akan menghantar mesej kepada anda tentang isu-isu berkaitan projek ini."
},
"project.moderation.thread.title": {
"message": "Mesej penyederhana"
},
"project.moderation.title": {
"message": "Penyederhanaan"
},
@@ -2426,9 +2699,45 @@
"project.settings.general.url.title": {
"message": "URL"
},
"project.settings.permissions.attention-needed.description.proj-approved": {
"message": "Sila berikan bukti bahawa anda mempunyai kebenaran untuk mengedarkan semula semua fail berikut dan sebarang versi yang ditahan akan diterbitkan secara automatik."
},
"project.settings.permissions.attention-needed.description.proj-draft": {
"message": "Sila berikan bukti bahawa anda mempunyai kebenaran untuk mengedarkan semula semua fail berikut sebelum anda boleh menghantar projek anda untuk semakan."
},
"project.settings.permissions.attention-needed.title": {
"message": "Kandungan terbenam yang tidak diketahui"
},
"project.settings.permissions.completed.description": {
"message": "Semua kandungan luaran mempunyai atribusi yang disediakan."
},
"project.settings.permissions.completed.title": {
"message": "Atribusi selesai!"
},
"project.settings.permissions.empty-state.description": {
"message": "Tiada satu pun versi anda mengandungi kandungan luaran, jadi anda tidak perlu risau tentang mendapatkan kebenaran."
},
"project.settings.permissions.empty-state.heading": {
"message": "Semuanya sudah siap!"
},
"project.settings.permissions.fail.description": {
"message": "Anda tidak mempunyai kebenaran untuk mengedarkan semula beberapa kandungan luaran yang ditambahkan. Untuk menerbitkan projek ini di Modrinth, sila buang kandungan yang melanggar hak."
},
"project.settings.permissions.fail.title": {
"message": "Sesetengah kandungan tidak boleh disertakan"
},
"project.settings.permissions.info-banner.description": {
"message": "Jika anda memasukkan kandungan yang tidak dihoskan di Modrinth, anda perlu memberitahu kami dari mana ia berasal dan mengesahkan bahawa anda mempunyai kebenaran untuk mengedarkan fail tersebut. Lihat <link>panduan kami</link> untuk mengetahui cara untuk melakukannya dengan betul!"
},
"project.settings.permissions.info-banner.title": {
"message": "Ketahui cara atribusi berfungsi"
},
"project.settings.permissions.learn-more": {
"message": "Ketahui lebih lanjut"
},
"project.settings.permissions.search-placeholder": {
"message": "Cari {count} {count, plural, other {projek luaran}}..."
},
"project.settings.title": {
"message": "Tetapan"
},
@@ -2450,6 +2759,12 @@
"project.versions.withheld-versions-warning.description": {
"message": "{count, plural, other {Versi ini}} kini ditahan dan tidak disenaraikan secara umum. Sila berikan bukti bahawa anda mempunyai kebenaran untuk mengedarkan semula fail tertentu yang disertakan dalam {count, plural, other {versi}} pek mod ini."
},
"project.versions.withheld-versions-warning.resolve-button": {
"message": "Selesaikan"
},
"project.versions.withheld-versions-warning.title": {
"message": "{count, plural, other {Versi}} telah ditahan kerana kandungan terbenam yang tidak diketahui"
},
"report.already-reported": {
"message": "Anda telah melaporkan {title}"
},
@@ -2819,6 +3134,9 @@
"search.filter.locked.server.sync": {
"message": "Selaraskan dengan pelayan"
},
"servers.manage.content.title": {
"message": "Kandungan - {serverName} - Modrinth"
},
"servers.notice.actions": {
"message": "Tindakan"
},
+35 -5
View File
@@ -407,11 +407,20 @@
"collection.title": {
"message": "{name} - Collectie"
},
"conversation-thread.reply-modal.description": {
"message": "Je project is al goedgekeurd. Daarom houdt het moderatieteam deze thread niet actief in de gaten. Mocht er echter een probleem met je project zijn, dan kunnen zij je bericht wel zien."
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Als je contact wilt opnemen met het moderatorteam, ga dan naar het <help-center-link>Modrinth Helpcentrum</help-center-link> en klik op het blauwe ballonnetje rechtsonder om contact op te nemen met de ondersteuning."
},
"conversation-thread.resubmit-modal.warning": {
"message": "Herhaaldelijk berichten plaatsen zonder in te gaan op de opmerkingen van de moderators kan leiden tot een opschorting van je account."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Aanvullende bestanden zijn bedoeld voor ondersteunende bronnen zoals source code, niet voor alternatieve versies of varianten."
},
"create.collection.collection-info": {
"message": "Je nieuwe collectie wordt gemaakt als een publieke collectie met {{count, plural,=0 {geen projecten}one {# project}other {# projecten}}."
"message": "Je nieuwe collectie wordt gemaakt als een publieke collectie met {count, plural,=0 {geen projecten}one {# project}other {# projecten}}."
},
"create.collection.create-collection": {
"message": "Collectie aanmaken"
@@ -572,6 +581,9 @@
"dashboard.affiliate-links.search": {
"message": "Zoek affiliatelinks..."
},
"dashboard.analytics.from-projects": {
"message": "van {count} {count, plural, one {project} other {projects}}"
},
"dashboard.collections.button.create-new": {
"message": "Maak nieuwe"
},
@@ -848,6 +860,18 @@
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
"message": "Je hebt je opnamelimiet <b>{withdrawLimit}</b> bereikt. Je moet een belastingformulier invullen om meer geld op te nemen."
},
"dashboard.notifications.link.view-more": {
"message": "Bekijk {extraNotifs} meer {extraNotifs, plural, one {notification} other {notifications}}"
},
"dashboard.organizations.member-count": {
"message": "{count} {count, plural, one {member} other {members}}"
},
"dashboard.projects.links.changes-applied": {
"message": "De wijzigingen worden toegepast op <strong>{count}</strong> {count, plural, one {project} other {projects}}."
},
"dashboard.projects.links.description": {
"message": "Alle links die u hieronder opgeeft, worden in elk van de geselecteerde projecten overschreven. Links die u leeg laat, worden genegeerd. U kunt een link uit alle geselecteerde projecten verwijderen met de prullenbakknop."
},
"dashboard.revenue.available-now": {
"message": "Nu beschikbaar"
},
@@ -1004,6 +1028,15 @@
"dashboard.withdraw.error.tax-form.title": {
"message": "Gelieve het belastingformulier in te vullen"
},
"discover.seo.description": {
"message": "Zoek en blader door duizenden Minecraft {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}} op Modrinth met directe, nauwkeurige zoekresultaten. Onze filters helpen je snel de beste Minecraft {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}}."
},
"discover.seo.title": {
"message": "Zoek {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}}"
},
"discover.seo.title-with-query": {
"message": "Zoek {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}} | {query}"
},
"error.collection.404.list_item.1": {
"message": "U heeft mogelijk de URL van de collectie fout ingetypt."
},
@@ -1164,7 +1197,7 @@
"message": "Waar bevinden de servers van Modrinth Hosting zich? Kan ik een regio kiezen?"
},
"hosting-marketing.faq.location.answer": {
"message": "We hebben momenteel servers beschikbaar in Noord-Amerika, Europa en Zuidoost-Azië, waaruit u bij aankoop kunt kiezen. In de toekomst zullen er meer regio's volgen! Als u uw regio wilt wijzigen, neem dan contact op met de klantenservice."
"message": "Op dit moment hebben we servers beschikbaar in Noord-Amerika, Europa en Zuidoost-Azië, waaruit u bij aankoop kunt kiezen. In de toekomst komen er nog meer regios bij! Als u van regio wilt wisselen, neem dan contact op met de klantenservice."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Welke Minecraft-versies en loaders kunnen worden gebruikt?"
@@ -1499,9 +1532,6 @@
"layout.banner.build-fail.title": {
"message": "Fout bij het genereren van de status vanuit de API tijdens het bouwen."
},
"layout.banner.preview.description": {
"message": "Als je de officiële Modrinth website wilde bezoeken, ga dan naar <link>https://modrinth.com</link>. Deze preview implementatie wordt door Modrinth medewerkers gebruikt voor testdoeleinden. Deze is gebouwd met <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Dit is een preview-versie van de Modrinth website."
},
@@ -875,24 +875,6 @@
"dashboard.head-title": {
"message": "Kontrollpanel"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Marker alt som lest"
},
"dashboard.notifications.button.view-history": {
"message": "Gå gjennom historie"
},
"dashboard.notifications.empty.no-unread": {
"message": "Du har ingen uleste varslinger."
},
"dashboard.notifications.error.loading": {
"message": "Error innen lasting av varsler:"
},
"dashboard.notifications.history.label": {
"message": "Historie"
},
"dashboard.notifications.history.title": {
"message": "Varslingshistorie"
},
"dashboard.notifications.link.see-all": {
"message": "Se alle"
},
@@ -902,9 +884,6 @@
"dashboard.notifications.link.view-more": {
"message": "Vis {extraNotifs} flere {extraNotifs, plural, one {varsling} other {varslinger}}"
},
"dashboard.notifications.loading": {
"message": "Laster inn varsler..."
},
"dashboard.organizations.button.create": {
"message": "Lag organisering"
},
@@ -1259,9 +1238,6 @@
"hosting-marketing.faq.location": {
"message": "Hvor oppholder Modrinth Hosting-serverne seg? Kan jeg velge en region?"
},
"hosting-marketing.faq.location.answer": {
"message": "Akkurat nå, så har tilgjengelige servere i Nord-Amerika, Europa, og Sørøst-Asia som du kan velge etter kjøpet ditt. Det kommer flere regioner i framtida! Viss du vil bytte regionen din, vær så snill å ta kontakt med støtte."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Hvilke Minecraft-versjoner-og-loadere kan brukes?"
},
@@ -1595,9 +1571,6 @@
"layout.banner.build-fail.title": {
"message": "Error når det kom til å generer tilstanden fra API-en når den blei bygd."
},
"layout.banner.preview.description": {
"message": "Viss du meinte å gå til den offisielle Modrinth-nettsida, gå til <link>https://modrinth.com</link>. Denne forhandsvisnigsutplasseringa blir brukt av Modrinth-personalet for testing. Den blei bygd ved å bruke <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Dette er ei forhandsvisning av distribusjonen til Modrinth-nettsida."
},
+245 -20
View File
@@ -407,6 +407,117 @@
"collection.title": {
"message": "{name} - Kolekcja"
},
"conversation-thread.action.add-private-note": {
"message": "Dodaj prywatną notatkę"
},
"conversation-thread.action.approve": {
"message": "Zatwierdź"
},
"conversation-thread.action.approve-with-reply": {
"message": "Zatwierdź z odpowiedzią "
},
"conversation-thread.action.close-thread": {
"message": "Zamknij wątek"
},
"conversation-thread.action.close-with-reply": {
"message": "Zamknij z odpowiedzią"
},
"conversation-thread.action.reject": {
"message": "Odrzuć"
},
"conversation-thread.action.reject-with-reply": {
"message": "Odrzuć z odpowiedzią"
},
"conversation-thread.action.reopen-thread": {
"message": "Otwórz ponownie wątek "
},
"conversation-thread.action.reply": {
"message": "Odpowiedz"
},
"conversation-thread.action.reply-to-thread": {
"message": "Odpowiedz na wątek"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Wyślij ponownie do przeglądu"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Wyślij ponownie do przeglądu z odpowiedzią"
},
"conversation-thread.action.send": {
"message": "Wyślij "
},
"conversation-thread.action.send-to-review": {
"message": "Wyślij do sprawdzenia"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Wyślij do przeglądu z odpowiedzią"
},
"conversation-thread.action.set-to-draft": {
"message": "Ustaw jako wersję roboczą"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "Ustaw jako wersję roboczą z odpowiedzią"
},
"conversation-thread.action.withhold": {
"message": "Wstrzymaj"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Wstrzymaj z odpowiedzią"
},
"conversation-thread.closed-thread.description": {
"message": "Ten wątek jest zamknięty i nie można wysyłać do niego nowych wiadomości."
},
"conversation-thread.error.closing-report": {
"message": "Błąd podczas zamykania zgłoszenia"
},
"conversation-thread.error.reopening-report": {
"message": "Błąd podczas ponownego otwierania zgłoszenia"
},
"conversation-thread.error.sending-message": {
"message": "Błąd podczas wysyłania wiadomości"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Odpowiedz na wątek..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Wyślij wiadomość..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Potwierdź, że moderatorzy nie monitorują aktywnie tego wątku"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Rozumiem, że moderatorzy nie monitorują aktywnie tego wątku."
},
"conversation-thread.reply-modal.description": {
"message": "Twój projekt jest już zaakceptowany. Oznacza to, że moderatorzy nie monitorują aktywnie tego wątku. Mogą jednak nadal odczytywać Twoje wiadomości, jeśli wystąpią dalsze problemy z Twoim projektem."
},
"conversation-thread.reply-modal.header": {
"message": "Odpowiedz na wątek"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Jeżeli musisz skontaktować się z zespołem moderatorów, odwiedź <help-center-link>centrum pomocy Modrinth</help-center-link> i kliknij w niebieskie kółko, by skontaktować się z obsługą."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "Potwierdzenie, że komentarze od zespołu moderacji zostały zaadresowane"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Potwierdzam, że komentarze od zespołu moderacji zostały zaadresowane."
},
"conversation-thread.resubmit-modal.description": {
"message": "Wysyłasz <project-title>{projectTitle}</project-title> do ponownego przeglądu przez naszych moderatorów."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Ponowne wysyłanie do przeglądu"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Wysyłanie do przeglądu"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "Upewnij się, że wszystkie komentarze od zespołu moderacji zostały zaadresowane."
},
"conversation-thread.resubmit-modal.warning": {
"message": "Powtórne wysyłanie projektu do sprawdzenia bez zaadresowania komentarzy moderatorów może skutkować zawieszeniem konta."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Pliki uzupełniające to np. kod źródłowy, a nie alternatywne wersje lub wariacje."
},
@@ -875,24 +986,9 @@
"dashboard.head-title": {
"message": "Kokpit"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Oznacz wszystkie jako przeczytane"
},
"dashboard.notifications.button.view-history": {
"message": "Pokaż historię"
},
"dashboard.notifications.empty.no-unread": {
"message": "Nie masz żadnych nieprzeczytanych powiadomień."
},
"dashboard.notifications.error.loading": {
"message": "Wystąpił błąd podczas ładowania powiadomień:"
},
"dashboard.notifications.history.label": {
"message": "Historia"
},
"dashboard.notifications.history.title": {
"message": "Historia powiadomień"
},
"dashboard.notifications.link.see-all": {
"message": "Zobacz wszystkie"
},
@@ -902,9 +998,6 @@
"dashboard.notifications.link.view-more": {
"message": "Pokaż jeszcze {extraNotifs} {extraNotifs, plural, one {powiadomienie} few {powiadomienia} other {powiadomień}}"
},
"dashboard.notifications.loading": {
"message": "Ładowanie powiadomień..."
},
"dashboard.organizations.button.create": {
"message": "Utwórz organizację"
},
@@ -920,6 +1013,27 @@
"dashboard.organizations.title": {
"message": "Organizacje"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Oznacz wszystkie jako przeczytane"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Pokaż historię"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Nie masz żadnych nieprzeczytanych powiadomień."
},
"dashboard.overview.notifications.error.loading": {
"message": "Wystąpił błąd podczas ładowania powiadomień:"
},
"dashboard.overview.notifications.history.label": {
"message": "Historia"
},
"dashboard.overview.notifications.history.title": {
"message": "Historia powiadomień"
},
"dashboard.overview.notifications.loading": {
"message": "Ładowanie powiadomień..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Możesz edytować kilka projektów naraz, zaznaczając je poniżej."
},
@@ -1229,9 +1343,33 @@
"dashboard.withdraw.error.tax-form.title": {
"message": "Wypełnij formularz podatkowy"
},
"discover.install.back-to-server": {
"message": "Powróć do serwera"
},
"discover.install.back-to-setup": {
"message": "Powróć do ustawiania"
},
"discover.install.cancel-reset": {
"message": "Anuluj resetowanie"
},
"discover.install.error.no-server-world": {
"message": "Brak świata serwera do zainstalowania."
},
"discover.install.error.unsupported-content-type": {
"message": "Ten rodzaj zawartości nie może być zainstalowany na serwerze z przeglądania."
},
"discover.install.heading.reset-modpack": {
"message": "Wybieranie paczki modów do zainstalowania po zresetowaniu"
},
"discover.seo.description": {
"message": "Szukaj i przeglądaj tysiące {projectType, select, mod {modów} modpack {paczek modów} resourcepack {paczek zasobów} shader {shaderów} plugin {pluginów} datapack {paczek danych} other {projektów}} Minecraft na Modrinth z natychmiastowymi, trafnymi wynikami wyszukiwania. Nasze filtry pomogą CI szybko znaleźć najlepsze projectType, select, mod {mody} modpack {paczki modów} resourcepack {paczki zasobów} shader {shadery} plugin {pluginy} datapack {paczki danych} other {projekty}} Minecraft."
},
"discover.seo.title": {
"message": "Szukaj {projectType, select, mod {modów} modpack {paczek modów} resourcepack {paczek zasobów} shader {shaderów} plugin {pluginów} datapack {paczek danych} other {projektów}}"
},
"discover.seo.title-with-query": {
"message": "Szukaj {projectType, select, mod {modów} modpack {paczek modów} resourcepack {paczek zasobów} shader {shaderów} plugin {pluginów} datapack {paczek danych} other {projektów}} | {query}"
},
"error.collection.404.list_item.1": {
"message": "Mogłeś źle napisać URL kolekcji."
},
@@ -1239,7 +1377,7 @@
"message": "Ta kolekcja może być prywatna."
},
"error.collection.404.list_item.3": {
"message": "Ta kolekcja została usunięta przez zespół moderacji Modrinth za naruszanie naszych <tou-link>Warunków użytkowania</tou-link>."
"message": "Ta kolekcja została usunięta przez zespół moderacji Modrinth za naruszenie naszych <tou-link>Warunków użytkowania</tou-link>."
},
"error.collection.404.list_title": {
"message": "Dlaczego?"
@@ -1730,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "Dla bezpieczeństwa, Modrinth musi zweryfikować e-maila powiązanego z twoim kontem."
},
"layout.banner.build-fail.always-ignore": {
"message": "Zawsze ignoruj"
},
"layout.banner.build-fail.description": {
"message": "Wdrożenie interfejsu użytkownika Modrinth nie udało się wygenerować stanu z API. Może to wynikać z awarii lub błędu w konfiguracji. Odbuduj, gdy API będzie dostępne. Kody błędów: {errors}; Aktualny adres URL interfejsu API to: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Ignoruj"
},
"layout.banner.build-fail.title": {
"message": "Błąd podczas generowania stanu z API przy kompilacji."
},
"layout.banner.preview.description": {
"message": "Jeśli chciałeś wejść na oficjalną stronę Modrinth, odwiedź <link>https://modrinth.com</link>. To wydanie poglądowe jest używane przez administrację Modrinth do testów. Zostało utworzone z <branch-link>{owner}/{branch}</branch-link> @ {commit}."
"message": "Jeśli chciałeś/aś wejść na oficjalną stronę Modrinth, odwiedź {url}. To wydanie poglądowe jest używane przez administrację Modrinth do testów. Zostało utworzone z <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "To jest wydanie poglądowe strony Modrinth."
@@ -2567,6 +2711,84 @@
"project.license.title": {
"message": "Licencja"
},
"project.moderation.admonition.approved.body.private": {
"message": "Twój projekt jest prywatny, co oznacza, że jest widoczny tylko dla ciebie i tych, których zaprosisz."
},
"project.moderation.admonition.approved.body.public": {
"message": "Twój projekt jest opublikowany i widoczny na Modrinth."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "Twój projekt jest niewymieniony, co oznacza, że nie jest odkrywalny na Modrinth i można go otworzyć tylko poprzez bezpośrednie łącze."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "Możesz zmienić widoczność projektu w jego <visibility-settings-link>ustawieniach widoczności</visibility-settings-link>."
},
"project.moderation.admonition.approved.header": {
"message": "Projekt został zaakceptowany"
},
"project.moderation.admonition.draft.body": {
"message": "Ten projekt jest ustawiony jako wersja robocza, więc nie może być oglądany przez innych, dopóki nie zostanie wysłany do przeglądu i sprawdzony przez zespół moderacji Modrinth."
},
"project.moderation.admonition.draft.header": {
"message": "Projekt ustawiony jako wersja robocza"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Po zakończeniu wszystkich wymaganych kroków i sprawdzeniu, czy Twój projekt jest zgodny z <rules-link>zasadami dotyczącymi treści</rules-link> na Modrinth, możesz wysłać swój projekt do przeglądu."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "Zaadresuj wszystkie uwagi moderatorów, w tym jakiekolwiek problemy wspomniane w poniższych wiadomościach, zanim ponownie wyślesz projekt do przeglądu."
},
"project.moderation.admonition.rejected.header": {
"message": "Zmiany wymagane"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "Powtórne wysyłanie Twojego projektu do sprawdzenia bez uprzedniego zaadresowania wszystkich komentarzy moderatorów może skutkować zawieszeniem konta."
},
"project.moderation.admonition.under-review.body.1": {
"message": "Twój projekt jest w kolejce do sprawdzenia przez zespół Modrinth."
},
"project.moderation.admonition.under-review.body.2": {
"message": "Twój projekt zostanie zeskanowany i sprawdzony przez ludzi by upewnić się, że jest zgodny z <rules-link>zasadami dotyczącymi treści</rules-link> i <terms-link>Warunkami użytkowania</terms-link> Modrinth."
},
"project.moderation.admonition.under-review.body.3": {
"message": "Możesz dalej zmieniać swój projekt, nie wpłynie to na Twoją pozycję w kolejce."
},
"project.moderation.admonition.under-review.body.4": {
"message": "Staramy się zakończyć przegląd w 24-48 godzin, ale sprawdzanie niektórych projektów może zająć dłużej. Nie oznacza to, że coś jest nie tak z Twoim projektem."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>Dziękujemy za cierpliwość podczas gdy nasi moderatorzy pracują ciężko by zapewnić, że Modrinth jest bezpiecznym miejscem i żeby Twój projekt został opublikowany! 💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Projekt w trakcie przeglądu"
},
"project.moderation.admonition.withheld.body": {
"message": "Twój projekt nie będzie widoczny publicznie i będzie go można otworzyć tylko poprzez bezpośrednie łącze. {requestedStatus, select, unlisted {Z uwagi na wybrane <visibility-settings-link>ustawienia widoczności</visibility-settings-link>, najprawdopodobniej nic nie musisz z tym zrobić.} other {Zaadresuj wszystkie uwagi moderatorów, w tym jakiekolwiek problemy wspomniane w poniższych wiadomościach, zanim ponownie wyślesz projekt do przeglądu.}}"
},
"project.moderation.admonition.withheld.header": {
"message": "Ukryte przez moderację"
},
"project.moderation.error.unauthorized": {
"message": "Brak autoryzacji"
},
"project.moderation.thread.approved-warning": {
"message": "Ten wątek nie jest aktywnie monitorowany, ale może być sprawdzany w celu znalezienia informacji o Twoim projekcie."
},
"project.moderation.thread.help-center-note.1": {
"message": "Moderatorzy zawartości nie mogą udzielać wsparcia z większością problemów i wiadomości w tym wątku nie powiadamiają reszty zespołu Modrinth."
},
"project.moderation.thread.help-center-note.2": {
"message": "Jeżeli potrzebujesz pomocy lub masz więcej pytań, odwiedź <help-center-link>centrum pomocy Modrinth</help-center-link> i kliknij w niebieskie kółko, by skontaktować się z obsługą."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "Pokaż UI członków"
},
"project.moderation.thread.private-description": {
"message": "Prywatny wątek konwersacji z moderatorami Modrinth. Mogą skontaktować się z Tobą w razie problemów z Twoim projektem."
},
"project.moderation.thread.title": {
"message": "Wiadomości od moderatorów"
},
"project.moderation.title": {
"message": "Moderacja"
},
@@ -3065,6 +3287,9 @@
"search.filter.locked.server.sync": {
"message": "Synchronizuj z serwerem"
},
"servers.manage.content.title": {
"message": "Zawartość - {serverName} - Modrinth"
},
"servers.notice.actions": {
"message": "Akcje"
},
+223 -25
View File
@@ -407,6 +407,117 @@
"collection.title": {
"message": "{name} - Coleção"
},
"conversation-thread.action.add-private-note": {
"message": "Adicionar nota privada"
},
"conversation-thread.action.approve": {
"message": "Aprovar"
},
"conversation-thread.action.approve-with-reply": {
"message": "Aprovar com resposta"
},
"conversation-thread.action.close-thread": {
"message": "Fechar tópico"
},
"conversation-thread.action.close-with-reply": {
"message": "Fechar com resposta"
},
"conversation-thread.action.reject": {
"message": "Rejeitar"
},
"conversation-thread.action.reject-with-reply": {
"message": "Rejeitar com resposta"
},
"conversation-thread.action.reopen-thread": {
"message": "Reabrir tópico"
},
"conversation-thread.action.reply": {
"message": "Responder"
},
"conversation-thread.action.reply-to-thread": {
"message": "Responder ao tópico"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Reenviar para revisão"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Reenviar para revisão com resposta"
},
"conversation-thread.action.send": {
"message": "Enviar"
},
"conversation-thread.action.send-to-review": {
"message": "Enviar para revisão"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Enviar para revisão com resposta\t"
},
"conversation-thread.action.set-to-draft": {
"message": "Definir como rascunho"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "Definir como rascunho com resposta"
},
"conversation-thread.action.withhold": {
"message": "Reter"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Reter com resposta"
},
"conversation-thread.closed-thread.description": {
"message": "Este tópico está fechado e não é possível enviar novas mensagens para ele."
},
"conversation-thread.error.closing-report": {
"message": "Erro ao fechar o relatório"
},
"conversation-thread.error.reopening-report": {
"message": "Erro ao reabrir o relatório"
},
"conversation-thread.error.sending-message": {
"message": "Erro ao enviar mensagem"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Responder ao tópico..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Enviar uma mensagem..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Confirme que os moderadores não monitoram isso ativamente"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Estou ciente que os moderadores não monitoram o tópico ativamente."
},
"conversation-thread.reply-modal.description": {
"message": "Seu projeto já foi aprovado. Portanto, a equipe de moderação não monitora ativamente este tópico. No entanto, eles ainda podem ver sua mensagem caso haja algum problema com seu projeto."
},
"conversation-thread.reply-modal.header": {
"message": "Responder ao tópico"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Se precisar entrar em contato com a equipe de moderação, use a <help-center-link>Central de Ajuda do Modrinth</help-center-link> e clique no balão azul no canto inferior direito para contatar o suporte."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "Confirmo que respondi às mensagens dos moderadores"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Confirmo que respondi adequadamente aos comentários dos moderadores."
},
"conversation-thread.resubmit-modal.description": {
"message": "Você está enviando <project-title>{projectTitle}</project-title> para ser revisado novamente pelos moderadores."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Reenviando para revisão"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Enviando para revisão"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "Certifique-se de ter respondido a todos os comentários da equipe de moderação."
},
"conversation-thread.resubmit-modal.warning": {
"message": "O envio repetido de conteúdo sem considerar os comentários dos moderadores pode resultar na suspensão da conta."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Os arquivos suplementares servem para fornecer recursos de apoio, como código-fonte, e não versões ou variantes alternativas."
},
@@ -875,23 +986,8 @@
"dashboard.head-title": {
"message": "Painel de controle"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Marcar tudo como lido"
},
"dashboard.notifications.button.view-history": {
"message": "Ver histórico"
},
"dashboard.notifications.empty.no-unread": {
"message": "Você não tem nenhuma notificação não lida."
},
"dashboard.notifications.error.loading": {
"message": "Erro ao carregar as notificações:"
},
"dashboard.notifications.history.label": {
"message": "Histórico"
},
"dashboard.notifications.history.title": {
"message": "Histórico de notificações"
"message": "Você não tem notificações não lidas."
},
"dashboard.notifications.link.see-all": {
"message": "Ver todas"
@@ -902,9 +998,6 @@
"dashboard.notifications.link.view-more": {
"message": "Ver mais {extraNotifs} {extraNotifs, plural, one {notificação} other {notificações}}"
},
"dashboard.notifications.loading": {
"message": "Carregando notificações..."
},
"dashboard.organizations.button.create": {
"message": "Criar organização"
},
@@ -920,6 +1013,27 @@
"dashboard.organizations.title": {
"message": "Organizações"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Marcar tudo como lido"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Ver histórico"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Você não tem nenhuma notificação não lida."
},
"dashboard.overview.notifications.error.loading": {
"message": "Erro ao carregar as notificações:"
},
"dashboard.overview.notifications.history.label": {
"message": "Histórico"
},
"dashboard.overview.notifications.history.title": {
"message": "Histórico de notificações"
},
"dashboard.overview.notifications.loading": {
"message": "Carregando notificações..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Você pode editar vários projetos em simultâneo, selecionando-os abaixo."
},
@@ -1248,13 +1362,13 @@
"message": "Selecionando o pacote de mods para instalar após a redefinição"
},
"discover.seo.description": {
"message": "Busque e explore milhares de {projectType, select, mod {mods} modpack {pacotes de mods} resourcepack {pacotes de recursos} shader {shaders} plugin {plugins} datapack {pacotes de dados} other {projetos}} de Minecraft no Modrinth com resultados de busca instantâneos e precisos. Nossos filtros ajudam você a encontrar rapidamente os melhores {projectType, select, mod {mods} modpack {pacotes de mods} resourcepack {pacotes de recursos} shader {shaders} plugin {plugins} datapack {pacotes de dados} other {projetos}} de Minecraft."
"message": "Busque e explore milhares de {projectType, select, mod {mods} modpack {pacotes de mods (modpacks)} resourcepack {pacotes de recursos (resourcepacks)} shader {sombreadores (shaders)} plugin {plugins} datapack {pacotes de dados (datapacks)} other {projetos}} de Minecraft no Modrinth com resultados de busca instantâneos e precisos. Nossos filtros ajudam você a encontrar rapidamente os melhores {projectType, select, mod {mods} modpack {pacotes de mods (modpacks)} resourcepack {pacotes de recursos (resourcepacks)} shader {sombreadores (shaders)} plugin {plugins} datapack {pacotes de dados (datapacks)} other {projetos}} de Minecraft."
},
"discover.seo.title": {
"message": "Buscar {projectType, select, mod {mods} modpack {pacotes de mods} resourcepack {pacotes de recursos} shader {shaders} plugin {plugins} datapack {pacotes de dados} other {projetos}}"
"message": "Buscar {projectType, select, mod {mods} modpack {pacotes de mods (modpacks)} resourcepack {pacotes de recursos (resourcepacks)} shader {sombreadores (shaders)} plugin {plugins} datapack {pacotes de dados (datapacks)} other {projetos}}"
},
"discover.seo.title-with-query": {
"message": "Buscar {projectType, select, mod {mods} modpack {pacotes de mods} resourcepack {pacotes de recursos} shader {shaders} plugin {plugins} datapack {pacotes de dados} other {projetos}} | {query}"
"message": "Buscar {projectType, select, mod {mods} modpack {pacotes de mods (modpacks)} resourcepack {pacotes de recursos (resourcepacks)} shader {sombreadores (shaders)} plugin {plugins} datapack {pacotes de dados (datapacks)} other {projetos}} | {query}"
},
"error.collection.404.list_item.1": {
"message": "Você pode ter digitado incorretamente o URL da coleção."
@@ -1754,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "Por motivos de segurança, o Modrinth precisa que você registre um endereço de e-mail na sua conta."
},
"layout.banner.build-fail.always-ignore": {
"message": "Sempre ignorar"
},
"layout.banner.build-fail.description": {
"message": "Esta implementação do frontend do Modrinth falhou ao gerar o estado da API. Isso pode ter ocorrido devido a uma interrupção ou a um erro de configuração. Recompile quando a API estiver disponível. Códigos de erro: {errors}; URL da API atual: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Ignorar"
},
"layout.banner.build-fail.title": {
"message": "Erro ao gerar o estado da API durante a compilação."
},
"layout.banner.preview.description": {
"message": "Se você pretendia acessar o site oficial do Modrinth, visite <link>https://modrinth.com</link>. Essa versão de pré-lançamento é usada pela equipe da Modrinth para fins de teste. Ela foi construída com base em <branch-link>{owner}/{branch}</branch-link> @ {commit}."
"message": "Se você pretendia acessar o site oficial do Modrinth, visite {url}. Essa versão de pré-lançamento é usada pela equipe da Modrinth para fins de teste. Ela foi construída com base em <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Esta é uma versão de pré-lançamento do site Modrinth."
@@ -2445,10 +2565,10 @@
"message": "Servidor"
},
"project-type.shader.plural": {
"message": "Shaders"
"message": "Sombreadores"
},
"project-type.shader.singular": {
"message": "Shader"
"message": "Sombreador"
},
"project.about.details.created": {
"message": "Criado {date}"
@@ -2591,6 +2711,84 @@
"project.license.title": {
"message": "Licença"
},
"project.moderation.admonition.approved.body.private": {
"message": "Seu projeto é privado, o que significa que só você e as pessoas que você convidar podem acessá-lo."
},
"project.moderation.admonition.approved.body.public": {
"message": "Seu projeto foi publicado e pode ser encontrado no Modrinth."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "Seu projeto não está listado, o que significa que só pode ser acessado por meio de um link direto e não pode ser encontrado no Modrinth."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "Você pode alterar a visibilidade do seu projeto nas <visibility-settings-link>configurações de visibilidade</visibility-settings-link> do seu projeto."
},
"project.moderation.admonition.approved.header": {
"message": "Projeto aprovado"
},
"project.moderation.admonition.draft.body": {
"message": "Este é um projeto em rascunho e não poderá ser acessado por outras pessoas até que seja enviado para revisão e aprovado pela equipe de moderação do Modrinth."
},
"project.moderation.admonition.draft.header": {
"message": "Rascunho de projeto"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Após concluir todas as etapas necessárias e garantir que seu projeto esteja em conformidade com as <rules-link>Regras de Conteúdo</rules-link> da Modrinth, você poderá enviá-lo para revisão."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "Por favor, resolva todas as questões relacionadas à moderação, incluindo quaisquer problemas listados nas mensagens abaixo, antes de reenviar este projeto."
},
"project.moderation.admonition.rejected.header": {
"message": "Alterações solicitadas"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "O envio repetido do seu projeto sem antes abordar todas as questões de moderação pode resultar na suspensão da conta."
},
"project.moderation.admonition.under-review.body.1": {
"message": "Seu projeto está na fila para ser revisado pela equipe de moderação da Modrinth."
},
"project.moderation.admonition.under-review.body.2": {
"message": "Seu projeto será analisado e revisado por moderadores humanos para garantir que atenda às <rules-link>Regras de Conteúdo</rules-link> e aos <terms-link>Termos de Uso</terms-link> da Modrinth."
},
"project.moderation.admonition.under-review.body.3": {
"message": "Você ainda pode modificar seu projeto, isso não afetará sua posição na fila."
},
"project.moderation.admonition.under-review.body.4": {
"message": "Nosso objetivo é analisar as submissões em 24 a 48 horas, mas alguns projetos podem sofrer atrasos. Isso não significa que haja algum problema com a sua submissão."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>Agradecemos sua paciência enquanto nossos moderadores trabalham arduamente para manter o Modrinth seguro e estamos ansiosos para ajudá-lo(a) a compartilhar seu conteúdo! 💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Projeto em análise"
},
"project.moderation.admonition.withheld.body": {
"message": "Seu projeto não será exibido publicamente e só poderá ser acessado por meio de um link direto.{requestedStatus, select, unlisted { Com base nas suas <visibility-settings-link>configurações de visibilidade</visibility-settings-link>, provavelmente nenhuma ação é necessária} other { Por favor, resolva todas as questões de moderação, incluindo quaisquer problemas listados nas mensagens abaixo, antes de reenviar este projeto}}."
},
"project.moderation.admonition.withheld.header": {
"message": "Não listado pela equipe"
},
"project.moderation.error.unauthorized": {
"message": "Não autorizado"
},
"project.moderation.thread.approved-warning": {
"message": "Este tópico não está sendo monitorado ativamente, mas poderá ser consultado para obter informações sobre o seu projeto, se necessário."
},
"project.moderation.thread.help-center-note.1": {
"message": "Os moderadores de conteúdo não podem oferecer suporte para a maioria dos problemas e as mensagens neste tópico não notificam a equipe."
},
"project.moderation.thread.help-center-note.2": {
"message": "Se precisar de ajuda ou tiver dúvidas adicionais, visite a <help-center-link>Central de Ajuda do Modrinth</help-center-link> e clique no balão azul para entrar em contato com o suporte."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "Exibir interface do membro"
},
"project.moderation.thread.private-description": {
"message": "Este é um tópico de conversa privada com os moderadores do Modrinth. Eles podem entrar em contato com você para tratar de assuntos relacionados a este projeto."
},
"project.moderation.thread.title": {
"message": "Mensagens da moderação"
},
"project.moderation.title": {
"message": "Moderação"
},
@@ -854,27 +854,12 @@
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
"message": "Já utilizou o seu limite de levantamento de <b>{withdrawLimit}</b>. Deve preencher um formulário fiscal para levantar mais."
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Marcar tudo como lido"
},
"dashboard.notifications.button.view-history": {
"message": "Ver histórico"
},
"dashboard.notifications.history.label": {
"message": "Histórico"
},
"dashboard.notifications.history.title": {
"message": "Histórico de notificações"
},
"dashboard.notifications.link.see-all": {
"message": "Ver tudo"
},
"dashboard.notifications.link.view-history": {
"message": "Ver histórico de notificações"
},
"dashboard.notifications.loading": {
"message": "Carregando notificações..."
},
"dashboard.projects.head-title": {
"message": "Projetos"
},
@@ -1244,9 +1229,6 @@
"hosting-marketing.faq.location": {
"message": "Onde estão localizados os servidores Modrinth Hosting? Posso escolher uma região?"
},
"hosting-marketing.faq.location.answer": {
"message": "Temos servidores disponíveis na América do Norte, Europa e Ásia Sudeste, que podes escolher no momento da compra. Mais regiões serão adicionadas no futuro! Se quiseres trocar a tua região, entra em contacto com o suporte."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Que versões de Minecraft e loaders podem ser utilizados?"
},
@@ -1580,9 +1562,6 @@
"layout.banner.build-fail.title": {
"message": "Erro ao gerar estado da API durante a construção."
},
"layout.banner.preview.description": {
"message": "Se querias aceder ao website oficial do Modrinth, visita <link>https://modrinth.com</link>. Esta versão de pré-lançamento é utilizada pela equipa do Modrinth para fins de teste. Foi criada usando <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Esta é uma pré-visualização da implementação do site da Modrinth."
},
+219 -21
View File
@@ -407,6 +407,117 @@
"collection.title": {
"message": "{name} — Коллекция"
},
"conversation-thread.action.add-private-note": {
"message": "Добавить приватную заметку"
},
"conversation-thread.action.approve": {
"message": "Одобрить"
},
"conversation-thread.action.approve-with-reply": {
"message": "Одобрить с ответом"
},
"conversation-thread.action.close-thread": {
"message": "Закрыть ветку"
},
"conversation-thread.action.close-with-reply": {
"message": "Закрыть с ответом"
},
"conversation-thread.action.reject": {
"message": "Отклонить"
},
"conversation-thread.action.reject-with-reply": {
"message": "Отклонить с ответом"
},
"conversation-thread.action.reopen-thread": {
"message": "Возобновить ветку"
},
"conversation-thread.action.reply": {
"message": "Ответить"
},
"conversation-thread.action.reply-to-thread": {
"message": "Ответить в ветке"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Отправить на перепроверку"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Отправить на перепроверку с ответом"
},
"conversation-thread.action.send": {
"message": "Отправить"
},
"conversation-thread.action.send-to-review": {
"message": "Отправить на проверку"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Отправить на проверку с ответом"
},
"conversation-thread.action.set-to-draft": {
"message": "Установить в черновик"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "Установить в черновик с ответом"
},
"conversation-thread.action.withhold": {
"message": "Удержать"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Удержать с ответом"
},
"conversation-thread.closed-thread.description": {
"message": "Эта ветка закрыта, новые сообщения в неё нельзя отправить."
},
"conversation-thread.error.closing-report": {
"message": "Ошибка закрытия жалобы"
},
"conversation-thread.error.reopening-report": {
"message": "Ошибка возобновления жалобы"
},
"conversation-thread.error.sending-message": {
"message": "Ошибка отправки сообщения"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Ответьте в ветке..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Отправьте сообщение..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Подтвердить, что модераторы не проводят активный просмотр"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Я признаю, что модерация не проводит активный просмотр ветки."
},
"conversation-thread.reply-modal.description": {
"message": "Ваш проект уже одобрен. Из-за этого модерация не проводит активный просмотр этой ветки. Однако, если возникнет проблема с вашим проектом, она сможет увидеть ваше сообщение."
},
"conversation-thread.reply-modal.header": {
"message": "Ответ в ветке"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Если вам нужно выйти на контакт с командой модерации, используйте <help-center-link>справочный центр Modrinth</help-center-link> и нажмите на синий значок в правом нижнем углу для связи с поддержкой."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "Подтвердить, что я ответил на сообщения модерации"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Я подтверждаю, что я надлежащим образом ответил на комментарии модерации."
},
"conversation-thread.resubmit-modal.description": {
"message": "Вы отправляете <project-title>{projectTitle}</project-title> на перепроверку модерацией."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Запрос на перепроверку"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Запрос на проверку"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "Убедитесь, что вы ответили на все комментарии модерации."
},
"conversation-thread.resubmit-modal.warning": {
"message": "Повторные запросы без ответа на комментарии модерации могут привести к блокировке учётной записи."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Дополнительные файлы предназначены для вспомогательных ресурсов, например исходного кода, но не для альтернативных версий или вариантов."
},
@@ -875,24 +986,9 @@
"dashboard.head-title": {
"message": "Панель управления"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Отметить всё как прочитанное"
},
"dashboard.notifications.button.view-history": {
"message": "Посмотреть историю"
},
"dashboard.notifications.empty.no-unread": {
"message": "У вас нет непрочитанных уведомлений."
},
"dashboard.notifications.error.loading": {
"message": "Ошибка загрузки уведомлений:"
},
"dashboard.notifications.history.label": {
"message": "История"
},
"dashboard.notifications.history.title": {
"message": "История уведомлений"
},
"dashboard.notifications.link.see-all": {
"message": "Посмотреть все"
},
@@ -900,10 +996,7 @@
"message": "История уведомлений"
},
"dashboard.notifications.link.view-more": {
"message": "Ещё {extraNotifs, plural, one {# уведомление} few {# уведомления} other {# уведомлений}}"
},
"dashboard.notifications.loading": {
"message": "Загрузка уведомлений..."
"message": "Посмотреть ещё {extraNotifs, number}"
},
"dashboard.organizations.button.create": {
"message": "Создать организацию"
@@ -920,6 +1013,27 @@
"dashboard.organizations.title": {
"message": "Организации"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Отметить всё как прочитанное"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Посмотреть историю"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "У вас нет непрочитанных уведомлений."
},
"dashboard.overview.notifications.error.loading": {
"message": "Ошибка загрузки уведомлений:"
},
"dashboard.overview.notifications.history.label": {
"message": "История"
},
"dashboard.overview.notifications.history.title": {
"message": "История уведомлений"
},
"dashboard.overview.notifications.loading": {
"message": "Загрузка уведомлений..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Выберите проекты ниже, чтобы настроить их вместе."
},
@@ -1754,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "В целях безопасности Modrinth просит привязать почту к аккаунту."
},
"layout.banner.build-fail.always-ignore": {
"message": "Всегда игнорировать"
},
"layout.banner.build-fail.description": {
"message": "При развёртывании фронтенда Modrinth не удалось сгенерировать состояние от API. Причиной может быть временный сбой или неверная настройка. Пересоберите проект, когда API станет доступен. Коды ошибок: {errors}. Текущий адрес API: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Игнорировать"
},
"layout.banner.build-fail.title": {
"message": "Ошибка генерации состояния от API во время сборки."
},
"layout.banner.preview.description": {
"message": "Официальный сайт Modrinth доступен по адресу <link>https://modrinth.com</link>. Текущая предварительная версия предназначена для тестирования командой Modrinth и собрана из <branch-link>{owner}/{branch}</branch-link> @ {commit}."
"message": "Официальный сайт Modrinth доступен по адресу {url}. Текущая предварительная версия предназначена для тестирования командой Modrinth и собрана из <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Это предварительная версия сайта Modrinth."
@@ -2376,7 +2496,7 @@
"message": "Запросите проверку"
},
"project-moderation-nags.submit-for-review-button": {
"message": "Отправить на проверку"
"message": "Отправить на проверку"
},
"project-moderation-nags.submit-for-review-desc": {
"message": "Проект сейчас виден только участникам. Для публикации он должен пройти проверку модераторами."
@@ -2591,6 +2711,84 @@
"project.license.title": {
"message": "Лицензия"
},
"project.moderation.admonition.approved.body.private": {
"message": "Ваш проект приватный, доступ к нему есть только у вас и приглашённых вами людей."
},
"project.moderation.admonition.approved.body.public": {
"message": "Ваш проект выложен и доступен для поиска на Modrinth."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "Ваш проект скрыт, доступ к нему можно получить только по ссылке."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "Изменить видимость проекта можно в его <visibility-settings-link>настройках видимости</visibility-settings-link>."
},
"project.moderation.admonition.approved.header": {
"message": "Проект одобрен"
},
"project.moderation.admonition.draft.body": {
"message": "Это черновик проекта, который никому не виден до запроса на проверку и одобрения модерацией Modrinth."
},
"project.moderation.admonition.draft.header": {
"message": "Черновик"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Когда вы выполните все обязательные шаги и убедитесь в отсутствии нарушений <rules-link>правил контента Modrinth</rules-link>, то тогда можно будет запросить проверку проекта."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "Ответьте на все замечания модерации, включая перечисленные в сообщении ниже, перед тем, как запрашивать перепроверку."
},
"project.moderation.admonition.rejected.header": {
"message": "Нужны изменения"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "Повторные запросы на перепроверку без ответа на замечания модерации могут привести к блокировке учётной записи."
},
"project.moderation.admonition.under-review.body.1": {
"message": "Ваш проект находится в очереди на проверку модерацией Modrinth."
},
"project.moderation.admonition.under-review.body.2": {
"message": "Ваш проект проверит человек для того, чтобы убедиться в соблюдении <rules-link>правил контента Modrinth</rules-link> и <terms-link>условий использования</terms-link>."
},
"project.moderation.admonition.under-review.body.3": {
"message": "Проект всё ещё можно менять, на положение в очереди это не повлияет."
},
"project.moderation.admonition.under-review.body.4": {
"message": "Мы стараемся проверять проекты за 24-48 часов, но иногда бывают задержки. Это не означает, что с вашей заявкой что-то не так."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>Мы ценим ваше терпение, пока наша модерация трудится, чтобы Modrinth оставался безопасным, а также продолжать помогать вам делиться контентом! 💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Проект на проверке"
},
"project.moderation.admonition.withheld.body": {
"message": "Ваш проект не будет виден всем и будет доступен лишь по прямой ссылке.{requestedStatus, select, unlisted { Судя по вашим выбранным <visibility-settings-link>настройкам видимости</visibility-settings-link>, больше действий не требуется.} other { Пожалуйста, прежде чем повторно отправлять этот проект на проверку, решите все связанные с модерацией вопросы, в том числе те, что перечислены в сообщениях ниже.}}"
},
"project.moderation.admonition.withheld.header": {
"message": "Скрыто командой Modrinth"
},
"project.moderation.error.unauthorized": {
"message": "Нет доступа"
},
"project.moderation.thread.approved-warning": {
"message": "Эта ветка не просматривается активно, но может быть проверена, если нужна будет информация о вашем проекте."
},
"project.moderation.thread.help-center-note.1": {
"message": "Модераторы контента не могут помочь с большинством проблем и сообщения в эту ветку не оповещают команду Modrinth."
},
"project.moderation.thread.help-center-note.2": {
"message": "Если вам нужна помощь или уточнения, перейдите в <help-center-link>справочный центр Modrinth</help-center-link> и нажмите на синий значок для связи с поддержкой."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "Показать интерфейс участника"
},
"project.moderation.thread.private-description": {
"message": "Это личная ветка обсуждения с модерацией Modrinth. Вам могут написать по вопросам, касающихся этого проекта."
},
"project.moderation.thread.title": {
"message": "Сообщения модерации"
},
"project.moderation.title": {
"message": "Модерация"
},
@@ -869,24 +869,6 @@
"dashboard.head-title": {
"message": "Instrumentpanel"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Markera allt som läst"
},
"dashboard.notifications.button.view-history": {
"message": "Visa historik"
},
"dashboard.notifications.empty.no-unread": {
"message": "Du har inga olästa notifikationer."
},
"dashboard.notifications.error.loading": {
"message": "Misslyckades att ladda notifikationer:"
},
"dashboard.notifications.history.label": {
"message": "Historik"
},
"dashboard.notifications.history.title": {
"message": "Notifikationshistorik"
},
"dashboard.notifications.link.see-all": {
"message": "Visa alla"
},
@@ -896,9 +878,6 @@
"dashboard.notifications.link.view-more": {
"message": "Visa {extraNotifs} ytterligare {extraNotifs, plural, one {notifikation} other {notifikationer}}"
},
"dashboard.notifications.loading": {
"message": "Laddar notifikationer..."
},
"dashboard.organizations.button.create": {
"message": "Skapa organization"
},
@@ -1205,9 +1184,6 @@
"hosting-marketing.faq.location": {
"message": "Var finns Modrinth Hostings servrar? Kan jag välja region?"
},
"hosting-marketing.faq.location.answer": {
"message": "Vi har för närvarande servrar tillgängliga i Nordamerika, Europa och Sydostasien som du kan välja mellan vid köpet. Fler regioner kommer att läggas till i framtiden! Om du vill byta region, vänligen kontakta supporten."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Vilka Minecraft versioner och loaders kan användas?"
},
+173 -20
View File
@@ -407,6 +407,108 @@
"collection.title": {
"message": "{name} - Koleksiyon"
},
"conversation-thread.action.add-private-note": {
"message": "Özel not ekle"
},
"conversation-thread.action.approve": {
"message": "Onaylandı"
},
"conversation-thread.action.approve-with-reply": {
"message": "Onaylandı, işlem tamamlandı"
},
"conversation-thread.action.close-thread": {
"message": "Konuyu kapat"
},
"conversation-thread.action.close-with-reply": {
"message": "Cevapla ve kapat"
},
"conversation-thread.action.reject": {
"message": "Reddet"
},
"conversation-thread.action.reject-with-reply": {
"message": "Cevap vererek reddet"
},
"conversation-thread.action.reopen-thread": {
"message": "Konuyu yeniden aç"
},
"conversation-thread.action.reply": {
"message": "Yanıtla"
},
"conversation-thread.action.reply-to-thread": {
"message": "Konuya yanıt ver"
},
"conversation-thread.action.resubmit-for-review": {
"message": "İnceleme için yeniden gönder"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Yanıtla birlikte yeniden incelemeye gönder"
},
"conversation-thread.action.send": {
"message": "Gönder"
},
"conversation-thread.action.send-to-review": {
"message": "İncelemeye gönder"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Yanıtla birlikte incelemeye gönder"
},
"conversation-thread.action.withhold": {
"message": "Yanıtla birlikte taslağa çevir"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Yanıtla birlikte beklet"
},
"conversation-thread.closed-thread.description": {
"message": "Bu konu kapatılmıştır ve yeni mesaj gönderilemez."
},
"conversation-thread.error.closing-report": {
"message": "Rapor kapatılırken hata oluştu"
},
"conversation-thread.error.sending-message": {
"message": "Mesaj gönderilirken hata oluştu"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Konuya yanıt ver..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Mesaj gönder..."
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Moderatörlerin bunu aktif olarak izlemediğini onayla"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Moderatörlerin bu konuyu aktif olarak denetlemediğini kabul ediyorum."
},
"conversation-thread.reply-modal.description": {
"message": "Projeniz zaten onaylanmış durumda. Bu nedenle moderasyon ekibi bu konuyu aktif olarak takip etmez. Ancak projenizle ilgili bir sorun oluşursa mesajınızı yine de görebilirler."
},
"conversation-thread.reply-modal.header": {
"message": "Konuyu yanıtla"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Moderasyon ekibiyle iletişime geçmeniz gerekiyorsa, lütfen <help-center-link>Modrinth Yardım Merkezi</help-center-link> adresini kullanın ve destekle iletişime geçmek için sağ alt köşedeki mavi sohbet simgesine tıklayın."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "Moderatörlerin mesajlarını yanıtladığımı onaylıyorum"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Moderatörlerin yorumlarını uygun şekilde yanıtladığımı onaylıyorum."
},
"conversation-thread.resubmit-modal.description": {
"message": "<project-title>{projectTitle}</project-title> projesini moderatörler tarafından yeniden incelenmek üzere gönderiyorsunuz."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "İnceleme için yeniden gönderiliyor"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "İncelemeye gönderiliyor"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "Moderatör ekibinin tüm yorumlarını ele aldığınızdan emin olun."
},
"conversation-thread.resubmit-modal.warning": {
"message": "Moderatörlerin yorumlarını ele almadan tekrar tekrar gönderim yapmak, hesabınızın askıya alınmasına neden olabilir."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Ek dosyalar, alternatif sürümler veya varyantlar için değil, kaynak kodu gibi destekleyici kaynaklar içindir."
},
@@ -875,24 +977,9 @@
"dashboard.head-title": {
"message": "Kontrol Paneli"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Hepsini okundu işaretle"
},
"dashboard.notifications.button.view-history": {
"message": "Geçmişi görüntüle"
},
"dashboard.notifications.empty.no-unread": {
"message": "Okunmamış bildiriminiz yok."
},
"dashboard.notifications.error.loading": {
"message": "Bildirimler yüklenirken hata oluştu:"
},
"dashboard.notifications.history.label": {
"message": "Geçmiş"
},
"dashboard.notifications.history.title": {
"message": "Bildirim geçmişi"
},
"dashboard.notifications.link.see-all": {
"message": "Hepsi"
},
@@ -902,9 +989,6 @@
"dashboard.notifications.link.view-more": {
"message": "{extraNotifs} daha fazla {extraNotifs, plural, one {notification} other {notifications}} görüntüle"
},
"dashboard.notifications.loading": {
"message": "Bildirimler yükleniyor..."
},
"dashboard.organizations.button.create": {
"message": "Organizasyon oluştur"
},
@@ -920,6 +1004,27 @@
"dashboard.organizations.title": {
"message": "Organizasyonlar"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Tümünü okundu olarak işaretle"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Geçmişi görüntüle"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Okunmamış bildiriminiz yok."
},
"dashboard.overview.notifications.error.loading": {
"message": "Bildirimler yüklenirken hata oluştu:"
},
"dashboard.overview.notifications.history.label": {
"message": "Geçmiş"
},
"dashboard.overview.notifications.history.title": {
"message": "Bildirim geçmişi"
},
"dashboard.overview.notifications.loading": {
"message": "Bildirimler yükleniyor..."
},
"dashboard.projects.bulk-edit-hint": {
"message": "Aşağıdan seçerek birden fazla projeyi düzenleyebilirsiniz."
},
@@ -1229,6 +1334,30 @@
"dashboard.withdraw.error.tax-form.title": {
"message": "Lütfen vergi formunu tamamlayınız"
},
"discover.install.back-to-setup": {
"message": "Sunucuya geri dön"
},
"discover.install.cancel-reset": {
"message": "Sıfırlamayı iptal et"
},
"discover.install.error.no-server-world": {
"message": "Yüklenebilecek hiçbir sunucu dünyası mevcut değil."
},
"discover.install.error.unsupported-content-type": {
"message": "Bu içerik türü, tarayıcıdan bir sunucuya yüklenemez."
},
"discover.install.heading.reset-modpack": {
"message": "Sıfırlama sonrası yüklenecek mod paketi seçiliyor"
},
"discover.seo.description": {
"message": "Modrinth üzerinde anında ve doğru arama sonuçlarıyla binlerce Minecraft {projectType, select, mod {mod} modpack {modpack} resourcepack {kaynak paketi} shader {shader} plugin {eklenti} datapack {veri paketi} other {proje}} arasında arama yap ve göz at. Filtrelerimiz en iyi Minecraft {projectType, select, mod {modları} modpack {mod paketlerini} resourcepack {kaynak paketlerini} shader {shaderları} plugin {eklentileri} datapack {veri paketlerini} other {projeleri}} hızlıca bulmana yardımcı olur."
},
"discover.seo.title": {
"message": "Ara {projectType, select, mod {modları} modpack {mod paketleri} resourcepack {kaynak paketleri} shader {shaderlar} plugin {eklentiler} datapack {veri paketleri} other {projeler}}"
},
"discover.seo.title-with-query": {
"message": "Ara {projectType, select, mod {modları} modpack {mod paketleri} resourcepack {kaynak paketleri} shader {shaderlar} plugin {eklentiler} datapack {veri paketleri} other {projeler}} | {query}"
},
"error.collection.404.list_item.1": {
"message": "Koleksiyonun URL'ini yanlış yazmış olabilirsin."
},
@@ -1244,6 +1373,12 @@
"error.collection.404.title": {
"message": "Koleksiyon bulunamadı"
},
"error.generic.401.signed-in-as": {
"message": "Şu anda şu hesapla oturum açtınız:"
},
"error.generic.401.title": {
"message": "Bu sayfaya erişiminiz yok"
},
"error.generic.404.subtitle": {
"message": "Aradığın sayfa yokmuş gibi duruyor."
},
@@ -1389,7 +1524,7 @@
"message": "Modrinth Hosting sunucuları nerede bulunuyor? Bölge seçebilir miyim?"
},
"hosting-marketing.faq.location.answer": {
"message": "Şu anda Kuzey Amerika, Avrupa ve Güneydoğu Asya'da satın alabileceğiniz sunucularımız bulunmaktadır. Gelecekte daha fazla bölge eklenecektir! Bölgenizi değiştirmek isterseniz, lütfen destek ekibiyle iletişime geçin."
"message": "Şu anda satın alma sırasında seçebileceğiniz sunucular Kuzey Amerika, Avrupa ve Güneydoğu Asya bölgelerinde mevcuttur. Yakında daha fazla bölge eklenecektir. Bölgenizi değiştirmek isterseniz lütfen destek ekibiyle iletişime geçin."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Hangi Minecraft sürümleri ve yükleyiciler kullanılabilir?"
@@ -1670,6 +1805,9 @@
"layout.action.create-new": {
"message": "Yeni oluştur..."
},
"layout.action.external-projects": {
"message": "Harici projeler"
},
"layout.action.file-lookup": {
"message": "Dosya bulma"
},
@@ -1718,14 +1856,20 @@
"layout.banner.add-email.description": {
"message": "Güvenlik sebebiyle Modrinth hesabınıza bir e-posta adresi kaydetmeniz gerek."
},
"layout.banner.build-fail.always-ignore": {
"message": "Her zaman yok say"
},
"layout.banner.build-fail.description": {
"message": "Modrinth'in önucunun bu dağıtımı API'den durum oluşturamadı. Bu bir kesintiden veya yapılandırmadaki bir hatadan kaynaklı olabilir. API mevcutken tekrar derleyin. Hata kodları: {errors}; şu anki API adresi: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Yok say"
},
"layout.banner.build-fail.title": {
"message": "Derleme esnasında API'den durum oluştururken hata."
},
"layout.banner.preview.description": {
"message": "Modrinth'in resmi web sitesine erişmek istediyseniz, <link>https://modrinth.com</link> adresini ziyaret edin. Bu önizleme dağıtımı, Modrinth yetkilileri tarafından test amaçlı kullanılmaktadır. <branch-link>{owner}/{branch}</branch-link> @ {commit} kullanılarak oluşturulmuştur."
"message": "Eğer resmi Modrinth web sitesine erişmek istiyorsanız, {url} adresini ziyaret edin. Bu önizleme sürümü Modrinth ekibi tarafından test amaçlı kullanılmaktadır. <branch-link>{owner}/{branch}</branch-link> @ {commit} kullanılarak derlenmiştir."
},
"layout.banner.preview.title": {
"message": "Bu, Modrinth web sitesinin önizleme dağıtımıdır."
@@ -1922,6 +2066,9 @@
"moderation.moderate": {
"message": "Yönet"
},
"moderation.page.external-projects": {
"message": "Harici projeler"
},
"moderation.page.projects": {
"message": "Projeler"
},
@@ -3356,6 +3503,9 @@
"settings.billing.charges.description": {
"message": "Modrinth hesabınıza geçmişte yapılan tüm ödemeleriniz burada listelenir:"
},
"settings.billing.charges.product.pyro": {
"message": "Modrinth Barındırma"
},
"settings.billing.charges.title": {
"message": "Past charges"
},
@@ -3464,6 +3614,9 @@
"settings.billing.pyro.ram": {
"message": "{gb} GB RAM"
},
"settings.billing.pyro.resubscribe.error.text": {
"message": "Modrinth sunucuna yeniden abone olurken hata oluştu."
},
"settings.billing.pyro.resubscribe.error.title": {
"message": "Yeniden abone olurken hata"
},
+500 -17
View File
@@ -261,7 +261,7 @@
"message": "Будь ласка, укажіть код двофакторної автентифікації, щоб продовжити."
},
"auth.sign-in.2fa.label": {
"message": "Вкажіть код двофакторної автентифікації"
"message": "Укажіть код двофакторної автентифікації"
},
"auth.sign-in.2fa.placeholder": {
"message": "Уведіть код…"
@@ -282,7 +282,7 @@
"message": "Створити обліковий запис"
},
"auth.sign-up.legal-dislaimer": {
"message": "Створивши обліковий запис, ви погоджуєтеся з <terms-link>Умовами використання</terms-link> та <privacy-policy-link>Політикою конфіденційності</privacy-policy-link> Modrinth."
"message": "Створивши обліковий запис, ви погоджуєтеся з <terms-link>Умовами використання</terms-link> та <privacy-policy-link>Політикою конфіденційности</privacy-policy-link> Modrinth."
},
"auth.sign-up.notification.password-mismatch.text": {
"message": "Паролі не збігаються!"
@@ -407,8 +407,119 @@
"collection.title": {
"message": "{name} — добірка"
},
"conversation-thread.action.add-private-note": {
"message": "Додати приватну нотатку"
},
"conversation-thread.action.approve": {
"message": "Підтвердити"
},
"conversation-thread.action.approve-with-reply": {
"message": "Підтвердити з відповіддю"
},
"conversation-thread.action.close-thread": {
"message": "Закрити тему"
},
"conversation-thread.action.close-with-reply": {
"message": "Закрити з відповіддю"
},
"conversation-thread.action.reject": {
"message": "Відхилити"
},
"conversation-thread.action.reject-with-reply": {
"message": "Відхилити з відповіддю"
},
"conversation-thread.action.reopen-thread": {
"message": "Знову відкрити потік"
},
"conversation-thread.action.reply": {
"message": "Відповісти"
},
"conversation-thread.action.reply-to-thread": {
"message": "Відповісти до теми"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Подати на розгляд знову"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Подати на розгляд знову з відповіддю"
},
"conversation-thread.action.send": {
"message": "Надіслати"
},
"conversation-thread.action.send-to-review": {
"message": "Надіслати на розгляд"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Надіслати на розгляд з відповіддю"
},
"conversation-thread.action.set-to-draft": {
"message": "Зробити чернеткою"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "Зробити чернеткою з відповіддю"
},
"conversation-thread.action.withhold": {
"message": "Утримуватися"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Утримуватися з відповіддю"
},
"conversation-thread.closed-thread.description": {
"message": "Цю тему зачинено, і в нього не можна надсилати нові повідомлення."
},
"conversation-thread.error.closing-report": {
"message": "Помилка закриття звіту"
},
"conversation-thread.error.reopening-report": {
"message": "Помилка повторного відкриття звіту"
},
"conversation-thread.error.sending-message": {
"message": "Помилка надсилання повідомлення"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Відповісти до потоку…"
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Надіслати повідомлення…"
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "Підтверджую, що модератори активно не відстежують це"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "Я визнаю, що модератори не стежать активно за темою."
},
"conversation-thread.reply-modal.description": {
"message": "Ваш проєкт уже затверджено. Таким чином, команда модераторів активно не стежить за цією темою. Однак вони можуть побачити ваше повідомлення, якщо з вашим проєктом виникне проблема."
},
"conversation-thread.reply-modal.header": {
"message": "Відповісти до теми"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "Якщо вам потрібно зв’язатися з командою модераторів, скористайтеся <help-center-link>довідковим центром Modrinth</help-center-link> і натисніть синю підказку в нижньому правому куті, щоб зв’язатися зі службою підтримки."
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "Підтверджую, що я розглянув повідомлення від модераторів"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "Я підтверджую, що я правильно розглянув коментарі модераторів."
},
"conversation-thread.resubmit-modal.description": {
"message": "Ви надсилаєте <project-title>{projectTitle}</project-title> на повторний розгляд модераторам."
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "Повторне подання на розгляд"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "Подання на розгляд"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "Переконайтеся, що ви врахували всі коментарі команди модераторів."
},
"conversation-thread.resubmit-modal.warning": {
"message": "Повторне надсилання без розгляду коментарів модераторів може призвести до призупинення дії облікового запису."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Додаткові файли призначені для допоміжних ресурсів, таких як вихідний код, а не для альтернативних версій чи варіантів."
"message": "Додаткові файли призначені для допоміжних ресурсів, таких як початковий код, а не для альтернативних версій чи варіантів."
},
"create.collection.collection-info": {
"message": "Ваша нова добірка після створення буде публічною {count, plural,=0 {без проєктів} one {і міститиме # проєкт} few {і міститиме # проєкти} other {і міститиме # проєктів}}."
@@ -554,6 +665,9 @@
"dashboard.affiliate-links.create.button": {
"message": "Створити партнерське посилання"
},
"dashboard.affiliate-links.empty.no-codes": {
"message": "Партнерські коди не знайдено."
},
"dashboard.affiliate-links.error.title": {
"message": "Помилка під час завантаження партнерських посилань"
},
@@ -572,6 +686,9 @@
"dashboard.affiliate-links.search": {
"message": "Пошук партнерських посилань…"
},
"dashboard.analytics.from-projects": {
"message": "з {count} {count, plural, one {проєкту} few {проєктів} many {проєктів} other {проєктів}}"
},
"dashboard.analytics.total-downloads": {
"message": "Всього завантажень"
},
@@ -602,6 +719,9 @@
"dashboard.collections.long-title": {
"message": "Ваші добірки"
},
"dashboard.collections.placeholder.search": {
"message": "Пошук добірок…"
},
"dashboard.collections.sort.name-ascending": {
"message": "Назва (А-Я)"
},
@@ -863,23 +983,170 @@
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
"message": "Ви використали свій ліміт зняття коштів <b>{withdrawLimit}</b>. Щоб зняти більше, вам потрібно заповнити податкову форму."
},
"dashboard.notifications.button.view-history": {
"message": одивитись історію"
"dashboard.head-title": {
"message": анель керування"
},
"dashboard.notifications.error.loading": {
"message": "Помилка завантаження повідомлень"
},
"dashboard.notifications.history.label": {
"message": "Історія"
},
"dashboard.notifications.history.title": {
"message": "Історія повідомлень"
"dashboard.notifications.empty.no-unread": {
"message": "Ви не маєте непрочитаних сповіщень."
},
"dashboard.notifications.link.see-all": {
"message": "Побачити всі"
},
"dashboard.notifications.loading": {
"message": "Завантаження повідомлень"
"dashboard.notifications.link.view-history": {
"message": "Побачити історію сповіщень"
},
"dashboard.notifications.link.view-more": {
"message": "Побачити {extraNotifs} ще {extraNotifs, plural, one {повідомлення} few {повідомлень} many {повідомлень} other {повідомлень}}"
},
"dashboard.organizations.button.create": {
"message": "Створити організацію"
},
"dashboard.organizations.empty.cta": {
"message": "Зробіть організацію!"
},
"dashboard.organizations.error.fetch": {
"message": "Не вдалося отримати організації"
},
"dashboard.organizations.member-count": {
"message": "{count} {count, plural, one {учасник} few {учасники} many {учасників} other {учасників}}"
},
"dashboard.organizations.title": {
"message": "Організації"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "Позначити все як прочитано"
},
"dashboard.overview.notifications.button.view-history": {
"message": "Побачити історію"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "Ви не маєте будь-яких непрочитаних сповіщень."
},
"dashboard.overview.notifications.error.loading": {
"message": "Помилка завантаження сповіщень:"
},
"dashboard.overview.notifications.history.label": {
"message": "Історія"
},
"dashboard.overview.notifications.history.title": {
"message": "Історія сповіщень"
},
"dashboard.overview.notifications.loading": {
"message": "Завантаження сповіщень…"
},
"dashboard.projects.bulk-edit-hint": {
"message": "Ви можете редагувати кілька проєктів одночасно, вибравши їх нижче."
},
"dashboard.projects.bulk-edit.server-disabled": {
"message": "Проєкти сервера не підтримують масове редагування"
},
"dashboard.projects.empty": {
"message": "У вас ще немає проєктів. Натисніть зелену кнопку вище, щоб почати."
},
"dashboard.projects.head-title": {
"message": "Проєкти"
},
"dashboard.projects.links.and-more": {
"message": "та ще {count}…"
},
"dashboard.projects.links.button.clear-link": {
"message": "Очистити посилання"
},
"dashboard.projects.links.button.edit": {
"message": "Редагувати посилання"
},
"dashboard.projects.links.changes-applied": {
"message": "Зміни буде застосовано до <strong>{count}</strong> {count, plural, one {проєкту} other {проєктів}}."
},
"dashboard.projects.links.description": {
"message": "Будь-які посилання, які ви вкажете нижче, будуть перезаписані в кожному з вибраних проєктів. Усі поля, які ви залишите порожніми, будуть проігноровані. Ви можете видалити посилання з усіх вибраних проєктів за допомогою кнопки кошика."
},
"dashboard.projects.links.discord-invite.description": {
"message": "Посилання для запрошення на ваш сервер Discord."
},
"dashboard.projects.links.discord-invite.label": {
"message": "Запрошення до Discord"
},
"dashboard.projects.links.issue-tracker.description": {
"message": "Місце, де користувачі можуть повідомляти про помилки, проблеми та сумніви щодо вашого проєкту."
},
"dashboard.projects.links.issue-tracker.label": {
"message": "Система відстеження помилок"
},
"dashboard.projects.links.placeholder.cleared": {
"message": "Наявне посилання буде видалено"
},
"dashboard.projects.links.placeholder.valid-discord-url": {
"message": "Уведіть дійсне посилання запрошення до Discord"
},
"dashboard.projects.links.placeholder.valid-url": {
"message": "Уведіть дійсне посилання"
},
"dashboard.projects.links.show-all-projects": {
"message": "Показати всі проєкти"
},
"dashboard.projects.links.source-code.description": {
"message": "Сторінка/репозиторій, що містить вихідний код вашого проєкту"
},
"dashboard.projects.links.source-code.label": {
"message": "Вихідний код"
},
"dashboard.projects.links.wiki-page.description": {
"message": "Сторінка, що містить інформацію, документацію та допомогу для проєкту."
},
"dashboard.projects.links.wiki-page.label": {
"message": "Сторінка вікі"
},
"dashboard.projects.notification.bulk-edit-success": {
"message": "Масове редагування посилань вибраного проєкту."
},
"dashboard.projects.project.icon-alt": {
"message": "Значок для {title}"
},
"dashboard.projects.project.moderator-message-aria": {
"message": "Проєкт має повідомлення від модераторів. Перегляньте проєкт, щоб побачити більше."
},
"dashboard.projects.project.review-environment-metadata": {
"message": "Перегляньте метадані середовища"
},
"dashboard.projects.sort.ascending": {
"message": "Зростання"
},
"dashboard.projects.sort.descending": {
"message": "Спадання"
},
"dashboard.projects.sort.option.name": {
"message": "Назва"
},
"dashboard.projects.sort.option.status": {
"message": "Статус"
},
"dashboard.projects.sort.option.type": {
"message": "Тип"
},
"dashboard.projects.table.icon": {
"message": "Значок"
},
"dashboard.projects.table.id": {
"message": "ID"
},
"dashboard.projects.table.name": {
"message": "Назва"
},
"dashboard.projects.table.status": {
"message": "Статус"
},
"dashboard.projects.table.type": {
"message": "Тип"
},
"dashboard.report.title": {
"message": "Скарга на {id}"
},
"dashboard.reports.active-title": {
"message": "Активні скарги"
},
"dashboard.reports.title": {
"message": "Звіти"
},
"dashboard.revenue.available-now": {
"message": "Наразі доступно"
@@ -917,6 +1184,9 @@
"dashboard.revenue.transactions.btn.download-csv": {
"message": "Завантажити як CSV"
},
"dashboard.revenue.transactions.head-title": {
"message": "Історія транзакцій"
},
"dashboard.revenue.transactions.header": {
"message": "Транзакції"
},
@@ -926,9 +1196,18 @@
"dashboard.revenue.transactions.none.desc": {
"message": "Ваші виплати та зняття коштів буде видно тут."
},
"dashboard.revenue.transactions.period.last-month": {
"message": "За останній місяць"
},
"dashboard.revenue.transactions.period.this-month": {
"message": "За цей місяць"
},
"dashboard.revenue.transactions.see-all": {
"message": "Переглянути всі"
},
"dashboard.revenue.transactions.year.all": {
"message": "Усі роки"
},
"dashboard.revenue.withdraw.blocked-tin-mismatch": {
"message": "Ваші зняття тимчасово заблоковано, оскільки ваш TIN або SSN не збігаються із записами IRS. Зв’яжіться зі службою підтримки, щоб скинути та повторно надіслати податкову форму."
},
@@ -941,6 +1220,33 @@
"dashboard.revenue.withdraw.header": {
"message": "Зняти"
},
"dashboard.sidebar.label.activeReports": {
"message": "Активні звіти"
},
"dashboard.sidebar.label.analytics": {
"message": "Аналітика"
},
"dashboard.sidebar.label.creators": {
"message": "Творці"
},
"dashboard.sidebar.label.dashboard": {
"message": "Панель керування"
},
"dashboard.sidebar.label.notifications": {
"message": "Сповіщення"
},
"dashboard.sidebar.label.organizations": {
"message": "Організації"
},
"dashboard.sidebar.label.overview": {
"message": "Огляд"
},
"dashboard.sidebar.label.projects": {
"message": "Проєкти"
},
"dashboard.sidebar.label.revenue": {
"message": "Дохід"
},
"dashboard.withdraw.completion.account": {
"message": "Рахунок"
},
@@ -1037,6 +1343,33 @@
"dashboard.withdraw.error.tax-form.title": {
"message": "Будь ласка, заповніть податкову форму"
},
"discover.install.back-to-server": {
"message": "Повернутися до сервера"
},
"discover.install.back-to-setup": {
"message": "Повернутися до налаштування"
},
"discover.install.cancel-reset": {
"message": "Скасувати скидання"
},
"discover.install.error.no-server-world": {
"message": "Жоден світ сервера недоступний для встановлення."
},
"discover.install.error.unsupported-content-type": {
"message": "Цей тип умісту не можна встановити на сервер із перегляду."
},
"discover.install.heading.reset-modpack": {
"message": "Вибір збірки для встановлення після скидання"
},
"discover.seo.description": {
"message": "Знаходьте та переглядайте тисячі {projectType, select, mod {модів} modpack {збірок} resourcepack {пакетів ресурсів} shader {шейдерів} plugin {плаґінів} datapack {пакетів даних} other {проєтів}} для Minecraft на Modrinth з миттєвим, точним результатом пошуку. Наші фільтри допоможуть швидко знайти найкращі {projectType, select, mod {моди} modpack {збірки} resourcepack {пакети ресурсів} shader {шейдери} plugin {плаґіни} datapack {пакети даних} other {проєкти}} для Minecraft."
},
"discover.seo.title": {
"message": "Знайти {projectType, select, mod {моди} modpack {збірки} resourcepack {пакети ресурсів} shader {шейдери} plugin {плаґіни} datapack {пакети даних} other {проєкти}}"
},
"discover.seo.title-with-query": {
"message": "Знайти {projectType, select, mod {моди} modpack {збірки} resourcepack {пакети ресурсів} shader {шейдери} plugin {плаґіни} datapack {пакети даних} other {проєкти}} | {query}"
},
"error.collection.404.list_item.1": {
"message": "Можливо, ви помилилися в посиланні на добірку."
},
@@ -1052,6 +1385,12 @@
"error.collection.404.title": {
"message": "Добірку не знайдено"
},
"error.generic.401.signed-in-as": {
"message": "Зараз ви ввійшли як:"
},
"error.generic.401.title": {
"message": "Ви не маєте доступу до цієї сторінки"
},
"error.generic.404.subtitle": {
"message": "Схоже, сторінки, яку ви шукаєте, не існує."
},
@@ -1251,7 +1590,7 @@
"message": "Простий у використанні файловий менеджер"
},
"hosting-marketing.included.file-manager.description": {
"message": "Легко шукайте, керуйте, редагуйте та вивантажуйте файли безпосередньо на свій сервер."
"message": "Легко знаходьте, керуйте, редагуйте та вивантажуйте файли безпосередньо на свій сервер."
},
"hosting-marketing.included.heading": {
"message": "Має всі необхідні вам функції."
@@ -1478,6 +1817,9 @@
"layout.action.create-new": {
"message": "Створити новий…"
},
"layout.action.external-projects": {
"message": "Зовнішні проєкти"
},
"layout.action.file-lookup": {
"message": "Пошук файлів"
},
@@ -1526,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "З міркувань безпеки, Modrinth вимагає, щоб ви зареєстрували адресу електронної пошти у своєму обліковому записі."
},
"layout.banner.build-fail.always-ignore": {
"message": "Завжди ігнорувати"
},
"layout.banner.build-fail.description": {
"message": "Ця установка frontend Modrinth не змогла згенерувати стан з API. Це може бути пов’язано з перебоєм у роботі або помилкою в налаштуваннях. Перебудуйте, коли API буде доступний. Коди помилок: {errors}; Поточна URL-адреса API: {url}"
},
"layout.banner.build-fail.ignore": {
"message": "Ігнорувати"
},
"layout.banner.build-fail.title": {
"message": "Помилка під час створення стану з API під час побудови."
},
"layout.banner.preview.description": {
"message": "Якщо ви хотіли перейти на офіційний вебсайт Modrinth, відвідайте <link>https://modrinth.com</link>. Цей попередній перегляд розгортки використовується співробітниками Modrinth для тестування. Він був створений з <branch-link>{owner}/{branch}</branch-link> @ {commit}."
"message": "Якщо ви хочете отримати доступ до офіційного сайту Modrinth, відвідайте {url}. Це розгортання попереднього перегляду використовується персоналом Modrinth для тестування. Він був створений за допомогою <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Це попередній перегляд розгортки вебсайту Modrinth."
@@ -1730,12 +2078,18 @@
"moderation.moderate": {
"message": "Проглядати"
},
"moderation.page.external-projects": {
"message": "Зовнішні проєкти"
},
"moderation.page.projects": {
"message": "Проєкти"
},
"moderation.page.reports": {
"message": "Скарги"
},
"moderation.page.technicalReview": {
"message": "Технічний огляд"
},
"muralpay.account-type.checking": {
"message": "Перевірка"
},
@@ -2357,6 +2711,84 @@
"project.license.title": {
"message": "Ліцензія"
},
"project.moderation.admonition.approved.body.private": {
"message": "Ваш проєкт є приватним, тобто доступ до нього маєте лише ви та запрошені вами люди."
},
"project.moderation.admonition.approved.body.public": {
"message": "Ваш проєкт опубліковано та доступний для виявлення на Modrinth."
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "Ваш проєкт є приватним, тобто доступ до нього можливий лише за прямим посиланням і його неможливо знайти на Modrinth."
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "Ви можете змінити видимість свого проєкту в <visibility-settings-link>параметрах видимости</visibility-settings-link> проєкту."
},
"project.moderation.admonition.approved.header": {
"message": "Проєкт затверджено"
},
"project.moderation.admonition.draft.body": {
"message": "Це чернетка проєкту, яку інші не можуть побачити, доки не буде передано на перевірку та схвалено командою модераторів Modrinth."
},
"project.moderation.admonition.draft.header": {
"message": "Чернетка проєкту"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "Після того, як ви виконали всі необхідні кроки та переконалися, що ваш проєкт відповідає <rules-link>правилам умісту</rules-link> Modrinth, ви можете подати свій проєкт на перевірку."
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "Будь ласка, розв'яжіть усі проблеми модерації, включно з будь-якими проблемами, переліченими в повідомленнях нижче, перш ніж повторно подавати цей проєкт."
},
"project.moderation.admonition.rejected.header": {
"message": "Запитані зміни"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "Повторне надсилання проєкту без попереднього розв'язання всіх питань модерації може призвести до призупинення облікового запису."
},
"project.moderation.admonition.under-review.body.1": {
"message": "Ваш проєкт знаходиться в черзі на розгляд командою модераторів Modrinth."
},
"project.moderation.admonition.under-review.body.2": {
"message": "Ваш проєкт буде просканувати, а потім переглянуто модераторами, щоб переконатися, що він відповідає <rules-link>Правилам умісту</rules-link> та <terms-link>Умовам використання</terms-link>."
},
"project.moderation.admonition.under-review.body.3": {
"message": "Ви все ще можете змінити свій проєкт, це не вплине на вашу позицію в черзі."
},
"project.moderation.admonition.under-review.body.4": {
"message": "Ми прагнемо розглядати подання протягом 24–48 годин, але деякі проєкти можуть затримуватися. Це не свідчить про проблему з вашим поданням."
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>Ми цінуємо ваше терпіння, поки наші модератори наполегливо працюють над безпекою Modrinth, і сподіваємося допомогти вам поділитися своїм умістом! 💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "Проєкт на розгляді"
},
"project.moderation.admonition.withheld.body": {
"message": "Ваш проєкт не буде відкритим для всіх, доступ до нього можна отримати лише за прямим посиланням.{requestedStatus, select, unlisted { На основі ваних вибраних <visibility-settings-link>налаштування видимости</visibility-settings-link>, швидше за все, ніяких дій робити не потрібно.} other { Будь ласка, розв'яжіть усі проблеми модерації, включно з будь-якими проблемами, переліченими в повідомленнях нижче, перш ніж повторно надсилати цей проєкт.}}"
},
"project.moderation.admonition.withheld.header": {
"message": "Команда зробила поза списком"
},
"project.moderation.error.unauthorized": {
"message": "Не авторизовано"
},
"project.moderation.thread.approved-warning": {
"message": "Ця тема активно не відстежується, але за потреби її можна переглянути для отримання інформації про ваш проєкт."
},
"project.moderation.thread.help-center-note.1": {
"message": "Модератори вмісту не можуть надати підтримку з більшости проблем, а повідомлення в цій темі не сповіщають персонал."
},
"project.moderation.thread.help-center-note.2": {
"message": "Якщо вам потрібна допомога або у вас є додаткові запитання, відвідайте <help-center-link>довідковий центр Modrinth</help-center-link> і натисніть синю підказку, щоб зв’язатися зі службою підтримки."
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "Показати інтерфейс учасника"
},
"project.moderation.thread.private-description": {
"message": "Це тема приватної розмови з модераторами Modrinth. Вони можуть надіслати вам повідомлення про проблеми щодо цього проєкту."
},
"project.moderation.thread.title": {
"message": "Повідомлення модерації"
},
"project.moderation.title": {
"message": "Модерація"
},
@@ -2420,6 +2852,45 @@
"project.settings.general.url.title": {
"message": "URL"
},
"project.settings.permissions.attention-needed.description.proj-approved": {
"message": "Будь ласка, надайте підтвердження того, що ви маєте дозвіл на повторне розповсюдження всіх наведених нижче файлів, і будь-які приховані версії буде автоматично опубліковано."
},
"project.settings.permissions.attention-needed.description.proj-draft": {
"message": "Будь ласка, надайте підтвердження того, що у вас є дозвіл на повторне розповсюдження всіх наведених нижче файлів, перш ніж ви зможете подати свій проєкт на розгляд."
},
"project.settings.permissions.attention-needed.title": {
"message": "Невідомий убудований уміст"
},
"project.settings.permissions.completed.description": {
"message": "Весь зовнішній вміст має посилання на авторство."
},
"project.settings.permissions.completed.title": {
"message": "Авторство завершено!"
},
"project.settings.permissions.empty-state.description": {
"message": "Жодна з ваших версій не містить зовнішнього вмісту, тому вам не потрібно турбуватися про отримання дозволів."
},
"project.settings.permissions.empty-state.heading": {
"message": "Усе готово!"
},
"project.settings.permissions.fail.description": {
"message": "Ви не маєте дозволу на повторне розповсюдження зовнішнього вмісту, який ви додали. Щоб опублікувати на Modrinth, видаліть правопорушний вміст."
},
"project.settings.permissions.fail.title": {
"message": "Деякий уміст не можна включити"
},
"project.settings.permissions.info-banner.description": {
"message": "Якщо ви додаєте вміст, який не розміщено на Modrinth, вам потрібно повідомити нам, звідки він походить, і підтвердити, що у вас є дозвіл на розповсюдження файлів. Перегляньте <link>наш посібник</link>, щоб дізнатися, як це зробити правильно!"
},
"project.settings.permissions.info-banner.title": {
"message": "Дізнайтеся, як працює авторство"
},
"project.settings.permissions.learn-more": {
"message": "Дізнатися більше"
},
"project.settings.permissions.search-placeholder": {
"message": "Пошук {count} {count, plural, one {зовнішнього проєкту} few {зовнішніх проєктів} many {зовнішніх проєктів} other {зовнішніх проєктів}}…"
},
"project.settings.title": {
"message": "Налаштування"
},
@@ -2438,6 +2909,15 @@
"project.versions.title": {
"message": "Версії"
},
"project.versions.withheld-versions-warning.description": {
"message": "{count, plural, one {Ця версія} few {Ці версії} many {Ці версії} other {Ці версії}} наразі наразі утримано та поза списком. Будь ласка, надайте підтвердження того, що ви маєте дозвіл на повторне розповсюдження певних файлів, які входять до {count, plural, one {версії} few {версій} many {версій} other {версій}} збірки."
},
"project.versions.withheld-versions-warning.resolve-button": {
"message": "Розв'язати"
},
"project.versions.withheld-versions-warning.title": {
"message": "{count, plural, one {Версія{version_name}} other {Версії}} утримано через невідомий убудований уміст"
},
"report.already-reported": {
"message": "Ви вже повідомляли про «{title}»"
},
@@ -2807,6 +3287,9 @@
"search.filter.locked.server.sync": {
"message": "Синхронізувати з сервером"
},
"servers.manage.content.title": {
"message": "Уміст — {serverName} — Modrinth"
},
"servers.notice.actions": {
"message": "Дії"
},
+76 -28
View File
@@ -407,6 +407,81 @@
"collection.title": {
"message": "{name} - Bộ sưu tập"
},
"conversation-thread.action.add-private-note": {
"message": "Thêm ghi chú bí mật"
},
"conversation-thread.action.approve": {
"message": "Chấp thuận"
},
"conversation-thread.action.approve-with-reply": {
"message": "Chấp thuận với phản hồi"
},
"conversation-thread.action.close-thread": {
"message": "Đóng luồng"
},
"conversation-thread.action.close-with-reply": {
"message": "Đóng với phản hồi"
},
"conversation-thread.action.reject": {
"message": "Từ chối"
},
"conversation-thread.action.reject-with-reply": {
"message": "Từ chối với phản hồi"
},
"conversation-thread.action.reopen-thread": {
"message": "Mở lại luồng"
},
"conversation-thread.action.reply": {
"message": "Phản hồi"
},
"conversation-thread.action.reply-to-thread": {
"message": "Phản hồi đến luồng"
},
"conversation-thread.action.resubmit-for-review": {
"message": "Gửi lại để xét duyệt"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "Gửi lại để xét duyệt kèm phản hồi"
},
"conversation-thread.action.send": {
"message": "Gửi"
},
"conversation-thread.action.send-to-review": {
"message": "Gửi để xem xét"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "Gửi để xem xét với phản hồi"
},
"conversation-thread.action.set-to-draft": {
"message": "Chuyển sang bản nháp"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "Chuyển sang bản nháp kèm phản hồi"
},
"conversation-thread.action.withhold": {
"message": "Thu hồi"
},
"conversation-thread.action.withhold-with-reply": {
"message": "Thu hồi với phản hồi"
},
"conversation-thread.closed-thread.description": {
"message": "Luồng này đã bị đóng và tin nhắn mới không thể gửi được vào."
},
"conversation-thread.error.closing-report": {
"message": "Lỗi khi đóng báo cáo"
},
"conversation-thread.error.reopening-report": {
"message": "Lỗi khi mở lại báo cáo"
},
"conversation-thread.error.sending-message": {
"message": "Lỗi khi gửi tin nhắn"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "Đang phản hồi vào luồng..."
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "Gửi một tin nhắn..."
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "Các tệp bổ trợ dùng cho các tài nguyên hỗ trợ như mã nguồn, không dùng cho các phiên bản hoặc biến thể thay thế."
},
@@ -768,7 +843,7 @@
"message": "Mạng"
},
"dashboard.creator-withdraw-modal.nearing-threshold": {
"message": "Bạn sắp chạm đến ngưỡng rút tiền. Bạn có thể rút <b>{amountRemaining}<b> ngay bây giờ, nhưng cần có biểu mẫu thuế để rút thêm."
"message": "Bạn sắp chạm đến ngưỡng rút tiền. Bạn có thể rút <b>{amountRemaining}</b> ngay bây giờ, nhưng cần có biểu mẫu thuế để rút thêm."
},
"dashboard.creator-withdraw-modal.paypal-details.account": {
"message": "Tài khoản"
@@ -875,24 +950,6 @@
"dashboard.head-title": {
"message": "Bảng điều khiển"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "Đánh dấu tất cả là đã đọc"
},
"dashboard.notifications.button.view-history": {
"message": "Xem lịch sử"
},
"dashboard.notifications.empty.no-unread": {
"message": "Bạn không có thông báo nào chưa đọc."
},
"dashboard.notifications.error.loading": {
"message": "Lỗi khi tải thông báo:"
},
"dashboard.notifications.history.label": {
"message": "Lịch sử"
},
"dashboard.notifications.history.title": {
"message": "Lịch sử thông báo"
},
"dashboard.notifications.link.see-all": {
"message": "Xem tất cả"
},
@@ -902,9 +959,6 @@
"dashboard.notifications.link.view-more": {
"message": "Xem thêm {extraNotifs} {extraNotifs, plural, one {thông báo} other {thông báo}} khác"
},
"dashboard.notifications.loading": {
"message": "Đang tải thông báo..."
},
"dashboard.revenue.available-now": {
"message": "Khả dụng ngay"
},
@@ -1220,9 +1274,6 @@
"hosting-marketing.faq.location": {
"message": "Những máy chủ Modrinth Hosting được nằm ở đâu? Tôi có thể chọn khu vực không?"
},
"hosting-marketing.faq.location.answer": {
"message": "Chúng tôi có các máy chủ có sẵn ở Bắc Mỹ, Châu Âu và Đông Nam Á tại thời điểm này mà bạn có thể chọn khi mua. Nhiều khu vực sẽ đến trong tương lai! Nếu bạn muốn chuyển đổi khu vực của mình, vui lòng liên hệ với bộ phận hỗ trợ."
},
"hosting-marketing.faq.versions-loaders": {
"message": "Những phiên bản Minecraft và modloader nào có thể được sử dụng?"
},
@@ -1556,9 +1607,6 @@
"layout.banner.build-fail.title": {
"message": "Lỗi tạo trạng thái từ API trong quá trình build."
},
"layout.banner.preview.description": {
"message": "Nếu bạn muốn truy cập trang web chính thức của Modrinth, hãy truy cập <link>https://modrinth.com</link>. Bản triển khai xem trước này được nhân viên Modrinth sử dụng cho mục đích thử nghiệm. Nó được xây dựng từ <branch-link>{owner}/{branch}</branch-link> @ {commit}."
},
"layout.banner.preview.title": {
"message": "Đây là bản mẫu của trang web Modrinth."
},
+229 -22
View File
@@ -407,6 +407,117 @@
"collection.title": {
"message": "{name} - 收藏夹"
},
"conversation-thread.action.add-private-note": {
"message": "添加个人笔记"
},
"conversation-thread.action.approve": {
"message": "批准"
},
"conversation-thread.action.approve-with-reply": {
"message": "批准并回复"
},
"conversation-thread.action.close-thread": {
"message": "关闭对话消息"
},
"conversation-thread.action.close-with-reply": {
"message": "关闭并回复"
},
"conversation-thread.action.reject": {
"message": "驳回"
},
"conversation-thread.action.reject-with-reply": {
"message": "驳回并回复"
},
"conversation-thread.action.reopen-thread": {
"message": "重开对话消息"
},
"conversation-thread.action.reply": {
"message": "回复"
},
"conversation-thread.action.reply-to-thread": {
"message": "回复对话消息"
},
"conversation-thread.action.resubmit-for-review": {
"message": "重新提交审核"
},
"conversation-thread.action.resubmit-for-review-with-reply": {
"message": "重新提交审核并回复"
},
"conversation-thread.action.send": {
"message": "发送"
},
"conversation-thread.action.send-to-review": {
"message": "送审"
},
"conversation-thread.action.send-to-review-with-reply": {
"message": "送审并回复"
},
"conversation-thread.action.set-to-draft": {
"message": "设为草稿"
},
"conversation-thread.action.set-to-draft-with-reply": {
"message": "设为草稿并回复"
},
"conversation-thread.action.withhold": {
"message": "扣留"
},
"conversation-thread.action.withhold-with-reply": {
"message": "扣留并回复"
},
"conversation-thread.closed-thread.description": {
"message": "此对话消息已关闭,无法发送新消息。"
},
"conversation-thread.error.closing-report": {
"message": "关闭举报出错"
},
"conversation-thread.error.reopening-report": {
"message": "重开举报出错"
},
"conversation-thread.error.sending-message": {
"message": "发送消息出错"
},
"conversation-thread.reply-editor.placeholder.reply": {
"message": "回复对话消息…"
},
"conversation-thread.reply-editor.placeholder.send": {
"message": "发送消息…"
},
"conversation-thread.reply-modal.confirmation.description": {
"message": "确认管理员不会主动审核此内容"
},
"conversation-thread.reply-modal.confirmation.label": {
"message": "我已知晓管理员不会主动审核此贴。"
},
"conversation-thread.reply-modal.description": {
"message": "你的项目已经获得批准。因此,管理团队不会主动监控此讨论消息。不过,如果您的项目出现问题,他们仍然可能看到你的信息。"
},
"conversation-thread.reply-modal.header": {
"message": "回复对话消息"
},
"conversation-thread.reply-modal.help-center-note": {
"message": "如果你需要联系管理团队,请使用 <help-center-link>Modrinth Help Center</help-center-link>,然后点击右下角的蓝色气泡以联系支持。"
},
"conversation-thread.resubmit-modal.confirmation.description": {
"message": "我已确认处理来自管理员的消息"
},
"conversation-thread.resubmit-modal.confirmation.label": {
"message": "我确认我已妥善处理了管理员的评论。"
},
"conversation-thread.resubmit-modal.description": {
"message": "这将会把 <project-title>{projectTitle}</project-title> 提交给管理员重新审核。"
},
"conversation-thread.resubmit-modal.header.resubmitting": {
"message": "重新提交审核"
},
"conversation-thread.resubmit-modal.header.submitting": {
"message": "提交审核"
},
"conversation-thread.resubmit-modal.reminder": {
"message": "请确保你已处理来自管理团队的所有评论。"
},
"conversation-thread.resubmit-modal.warning": {
"message": "如果反复提交而不处理管理员的评论,可能会导致账户被暂停。"
},
"create-project-version.create-modal.stage.add-files.admonition": {
"message": "补充文件仅用来保存源代码等支持性资料,不能用来存放替代版本或者变体文件。"
},
@@ -875,24 +986,9 @@
"dashboard.head-title": {
"message": "仪表盘"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "标记全部已读"
},
"dashboard.notifications.button.view-history": {
"message": "查看历史"
},
"dashboard.notifications.empty.no-unread": {
"message": "你没有未读通知。"
},
"dashboard.notifications.error.loading": {
"message": "加载通知时出错:"
},
"dashboard.notifications.history.label": {
"message": "历史"
},
"dashboard.notifications.history.title": {
"message": "历史通知"
},
"dashboard.notifications.link.see-all": {
"message": "查看所有"
},
@@ -902,9 +998,6 @@
"dashboard.notifications.link.view-more": {
"message": "查看更多 {extraNotifs} 个通知"
},
"dashboard.notifications.loading": {
"message": "加载通知……"
},
"dashboard.organizations.button.create": {
"message": "创建组织"
},
@@ -920,6 +1013,27 @@
"dashboard.organizations.title": {
"message": "组织"
},
"dashboard.overview.notifications.button.mark-all-as-read": {
"message": "标记全部已读"
},
"dashboard.overview.notifications.button.view-history": {
"message": "查看历史"
},
"dashboard.overview.notifications.empty.no-unread": {
"message": "你没有未读通知。"
},
"dashboard.overview.notifications.error.loading": {
"message": "加载通知出错:"
},
"dashboard.overview.notifications.history.label": {
"message": "历史"
},
"dashboard.overview.notifications.history.title": {
"message": "历史通知"
},
"dashboard.overview.notifications.loading": {
"message": "加载通知…"
},
"dashboard.projects.bulk-edit-hint": {
"message": "你可以通过下方复选框选择多个项目来一次性编辑。"
},
@@ -990,7 +1104,7 @@
"message": "{title} 的图标"
},
"dashboard.projects.project.moderator-message-aria": {
"message": "项目有一则来自版主的消息。查看项目以了解更多。"
"message": "项目有一则来自管理的消息。查看项目以了解更多。"
},
"dashboard.projects.project.review-environment-metadata": {
"message": "请复核运行环境元数据"
@@ -1247,6 +1361,15 @@
"discover.install.heading.reset-modpack": {
"message": "重置后选择要安装的 modpack"
},
"discover.seo.description": {
"message": "通过快速、精确地搜索结果在Modrinth上搜索并浏览数千个Minecraft{projectType, select, mod {模组} modpack {整合包} resourcepack {资源包} shader {光影包} plugin {插件} datapack {数据包} other {项目}}。我们的筛选器会帮助你快速寻找最合适的Minecraft{projectType, select, mod {模组} modpack {整合包} resourcepack {资源包} shader {光影包} plugin {插件} datapack {数据包} other {项目}}。"
},
"discover.seo.title": {
"message": "搜索{projectType, select, mod {模组} modpack {整合包} resourcepack {资源包} shader {光影包} plugin {插件} datapack {数据包} other {项目}}"
},
"discover.seo.title-with-query": {
"message": "搜索{projectType, select, mod {模组} modpack {整合包} resourcepack {资源包} shader {光影包} plugin {插件} datapack {数据包} other {项目}} | {query}"
},
"error.collection.404.list_item.1": {
"message": "你可能输错了收藏夹的连接。"
},
@@ -1745,14 +1868,20 @@
"layout.banner.add-email.description": {
"message": "为确保账户安全,Modrinth 需要你为账户关联一个电子邮箱地址。"
},
"layout.banner.build-fail.always-ignore": {
"message": "总是忽略"
},
"layout.banner.build-fail.description": {
"message": "当前 Modrinth 前端部署实例不能从 API 生成状态。这可能是由于 API 不可用或配置错误。请在 API 可用时重新构建。\n错误码:{errors};当前 API URL 为 {url}"
},
"layout.banner.build-fail.ignore": {
"message": "忽略"
},
"layout.banner.build-fail.title": {
"message": "构建期间从 API 生成状态时发生错误。"
},
"layout.banner.preview.description": {
"message": "如果你是想前往 Modrinth 的官方网站,请前往 <link>https://modrinth.com</link>。这个预览部署版本仅供 Modrinth 工作人员测试使用。它是基于 <branch-link>{owner}/{branch}</branch-link> @ {commit} 构建而成。"
"message": "如果你是想前往 Modrinth 的官方网站,请前往 {url}。这个预览部署版本仅供 Modrinth 工作人员测试使用。它是基于 <branch-link>{owner}/{branch}</branch-link> @ {commit} 构建而成。"
},
"layout.banner.preview.title": {
"message": "这是 Modrinth 网站的预览部署版本。"
@@ -2582,6 +2711,84 @@
"project.license.title": {
"message": "许可证"
},
"project.moderation.admonition.approved.body.private": {
"message": "你的项目是私人的,这意味着它只能由你本人或受你邀请的人访问。"
},
"project.moderation.admonition.approved.body.public": {
"message": "您的项目已发布,并且可以在 Modrinth 上被发现。"
},
"project.moderation.admonition.approved.body.unlisted": {
"message": "你的项目状态为“未列出”,即只能通过直链访问,无法在 Modrinth 被搜索到。"
},
"project.moderation.admonition.approved.body.visibility-message": {
"message": "您可以在项目的<visibility-settings-link>可见性设置</visibility-settings-link>中更改项目的可见性。"
},
"project.moderation.admonition.approved.header": {
"message": "已批准项目"
},
"project.moderation.admonition.draft.body": {
"message": "这是一个草稿项目,在提交审核并获得 Modrinth 管理团队批准之前,其他人无法查看。"
},
"project.moderation.admonition.draft.header": {
"message": "草稿项目"
},
"project.moderation.admonition.draft.submit-for-review": {
"message": "一旦你完成了所有必需步骤,并确保你的项目符合 Modrinth 的<rules-link>内容规则</rules-link>,你就可以提交你的项目以供审核。"
},
"project.moderation.admonition.rejected.address-all-concerns": {
"message": "在重新提交项目前,请解决所有审核关切和下方列出的问题。"
},
"project.moderation.admonition.rejected.header": {
"message": "更改请求"
},
"project.moderation.admonition.rejected.spam-notice": {
"message": "如果反复提交你的项目而不预先处理管理问题,可能会导致账户被暂停。"
},
"project.moderation.admonition.under-review.body.1": {
"message": "你的项目已在排队等待 Modrinth 管理团队的审核。"
},
"project.moderation.admonition.under-review.body.2": {
"message": "你的项目将先被扫描,然后由人工管理员来审核,以确保其符合 Modrinth 的<rules-link>内容规则</rules-link>和<terms-link>使用条款</terms-link>。"
},
"project.moderation.admonition.under-review.body.3": {
"message": "你仍然可以修改项目,这并不会影响你在队列中的位置。"
},
"project.moderation.admonition.under-review.body.4": {
"message": "我们计划在24-48小时内审查提交内容,但某些项目可能会有延迟。这并不意味着你的提交有问题。"
},
"project.moderation.admonition.under-review.body.5": {
"message": "<emphasis>我们感谢您的耐心等待,同时我们的管理员正在努力保持 Modrinth 的安全,并期待帮助您分享内容!💚</emphasis>"
},
"project.moderation.admonition.under-review.header": {
"message": "在审项目"
},
"project.moderation.admonition.withheld.body": {
"message": "你的项目不会公开显示,只能通过直链访问。{requestedStatus, select, unlisted {由于你在<visibility-settings-link>可见性设置</visibility-settings-link>作出了设置,无需处理。} other {在重新提交项目前,请解决所有审核关切和下方列出的问题。}}"
},
"project.moderation.admonition.withheld.header": {
"message": "由管理员下架"
},
"project.moderation.error.unauthorized": {
"message": "未经许可"
},
"project.moderation.thread.approved-warning": {
"message": "这则聊天消息审核并不活跃,但如有需要,可能会审查其中关于你项目的信息。"
},
"project.moderation.thread.help-center-note.1": {
"message": "内容管理员无法为大多数问题提供支持,并且发送到此对话的消息不会通知工作人员。"
},
"project.moderation.thread.help-center-note.2": {
"message": "如果你需要帮助或有其他疑问,请访问 <help-center-link>Modrinth Help Center</help-center-link>,然后点击蓝色气泡以联系支持。"
},
"project.moderation.thread.moderator-see-user-ui-toggle": {
"message": "显示成员图形界面"
},
"project.moderation.thread.private-description": {
"message": "这是与 Modrinth 管理员的私人对话消息。他们可能会就此项目的问题向你发送消息。"
},
"project.moderation.thread.title": {
"message": "审核信息"
},
"project.moderation.title": {
"message": "审核"
},
@@ -2781,10 +2988,10 @@
"message": "此{item, select, project {项目} version {版本} user {用户} other {内容}}违反了 Modrinth 的哪条规则?"
},
"report.report-content": {
"message": "向管理员举报内容"
"message": "向管理员举报内容"
},
"report.report-item": {
"message": "向管理员举报 {title}"
"message": "向管理员举报 {title}"
},
"report.submit": {
"message": "提交举报"
+3 -27
View File
@@ -875,24 +875,6 @@
"dashboard.head-title": {
"message": "儀表板"
},
"dashboard.notifications.button.mark-all-as-read": {
"message": "全部標記為已讀"
},
"dashboard.notifications.button.view-history": {
"message": "查看紀錄"
},
"dashboard.notifications.empty.no-unread": {
"message": "您沒有任何未讀通知。"
},
"dashboard.notifications.error.loading": {
"message": "載入通知時發生錯誤:"
},
"dashboard.notifications.history.label": {
"message": "紀錄"
},
"dashboard.notifications.history.title": {
"message": "通知紀錄"
},
"dashboard.notifications.link.see-all": {
"message": "查看全部"
},
@@ -902,9 +884,6 @@
"dashboard.notifications.link.view-more": {
"message": "查看另外 {extraNotifs} 則通知"
},
"dashboard.notifications.loading": {
"message": "正在載入通知..."
},
"dashboard.organizations.button.create": {
"message": "建立組織"
},
@@ -1412,9 +1391,6 @@
"hosting-marketing.faq.location": {
"message": "Modrinth Hosting 伺服器位於哪裡?我可以選擇區域嗎?"
},
"hosting-marketing.faq.location.answer": {
"message": "我們目前在北美、歐洲與東南亞設有伺服器,你可以在購買時選擇。未來還會推出更多區域!如果你想切換區域,請聯絡支援團隊。"
},
"hosting-marketing.faq.versions-loaders": {
"message": "可以使用哪些 Minecraft 版本與載入器?"
},
@@ -1751,9 +1727,6 @@
"layout.banner.build-fail.title": {
"message": "建構時無法從 API 取得狀態資料。"
},
"layout.banner.preview.description": {
"message": "如果你是想前往 Modrinth 的官方網站,請前往 <link>https://modrinth.com</link>。這個預覽部署版本僅供 Modrinth 工作人員測試使用。它是基於 <branch-link>{owner}/{branch}</branch-link> @ {commit} 建構而成。"
},
"layout.banner.preview.title": {
"message": "這是 Modrinth 網站的預覽部署版本。"
},
@@ -3080,6 +3053,9 @@
"search.filter.locked.server.sync": {
"message": "與伺服器同步"
},
"servers.manage.content.title": {
"message": "內容 - {serverName} - Modrinth"
},
"servers.notice.actions": {
"message": "動作"
},
@@ -1,10 +0,0 @@
const COLLECTION_PREFIX = '/collection/bLYCa4PJ'
export default defineNuxtRouteMiddleware((to) => {
if (to.path === COLLECTION_PREFIX || to.path.startsWith(`${COLLECTION_PREFIX}/`)) {
return navigateTo(`https://april-fools-2026.modrinth.com${to.fullPath}`, {
external: true,
redirectCode: 302,
})
}
})
@@ -20,8 +20,13 @@ const PROJECT_TYPES = [
export default defineNuxtRouteMiddleware(async (to) => {
// Only run this middleware on the server - it relies on server-only runtime config
if (import.meta.client) return
const routeProjectParam = to.params.project
const projectId = Array.isArray(routeProjectParam) ? routeProjectParam[0] : routeProjectParam
const routeType = Array.isArray(to.params.type) ? to.params.type[0] : to.params.type
// Only handle project routes
if (!to.params.id || !PROJECT_TYPES.includes(to.params.type as string)) {
if (!projectId || !routeType || !PROJECT_TYPES.includes(routeType)) {
return
}
@@ -29,7 +34,6 @@ export default defineNuxtRouteMiddleware(async (to) => {
const authToken = useCookie('auth-token')
const client = useServerModrinthClient({ authToken: authToken.value || undefined })
const tags = useGeneratedState()
const projectId = to.params.id as string
try {
// Fetch v2 and v3 in parallel — cache both for the page's useQuery calls

Some files were not shown because too many files have changed in this diff Show More